PDFium Delphi Component Docs

Merge de navegação transacional

Adicione FPdfMerge à cláusula uses para habilitar TPdfNavigationMergeHelper.MergeFilesWithNavigation, ou chame a função global MergePdfFilesWithNavigation com um documento de destino explícito

O helper prepara importações nativas de páginas, reconstrói os outlines hierárquicos, combina named destinations, remapeia links de páginas e reabre o resultado de forma independente antes de substituir o documento de quem chama

pmnPreserve mantém a hierarquia de origem; pmnGroupBySource adiciona um título com o nome de cada arquivo de origem

Títulos, relações de pai, estilos, cores, ramos expandidos, ações URI e destinos internos de página resolvidos são preservados; páginas selecionadas, repetidas e reordenadas são mapeadas para a primeira ocorrência importada, e destinos de páginas omitidas tornam-se títulos

Outlines de destino existentes mudam de posição quando páginas são inseridas; os arquivos de origem permanecem abertos com compartilhamento de gravação negado enquanto a navegação e as importações nativas de páginas são capturadas

Só há suporte a merge com parada no primeiro erro; destinos assinados, ações de outline não suportadas e pós-processamento criptografado são rejeitados com um relatório de erro, e falha ou cancelamento preserva o documento de quem chama

Esta API mantém a política nativa existente de formulários; use FPdfFormMerge quando precisar de tratamento avançado de colisão de campos AcroForm e de recursos

Named destinations e links de página

PreserveNamedDestinations e PreservePageLinks têm como padrão True; definir qualquer uma das opções como False pula essa parte do processamento adicional de navegação

Named destinations são lidas tanto do dicionário /Dests legado do catálogo quanto da árvore de nomes /Names/Dests, incluindo árvores hierárquicas, arrays indiretos e dicionários de destino que contêm /D; quando as duas formas definem a mesma chave, o valor da árvore de nomes tem precedência

O resultado usa uma árvore /Names/Dests balanceada e mantém árvores de nomes não relacionadas a destinos, como /EmbeddedFiles; árvores de origem sem relação com destinos não são importadas por este helper

As chaves mantêm seus bytes originais de string PDF, incluindo codificação UTF-16BE; o modo de visualização exato e os parâmetros são preservados, incluindo /FitH null e /XYZ null 34 null

PolíticaComportamento
pndRejectUma chave de origem que já existe no destino rejeita a transação inteira
pndRenameA política padrão mantém nomes sem conflito e prefixa os nomes em conflito com DestinationPrefix, cujo padrão é Imported_; novas colisões usam prefixos determinísticos, como 2_Imported_Shared
pndNamespaceToda chave de origem recebe o prefixo DestinationPrefix, seu índice de origem de base um e um sublinhado, como em Imported_1_Shared; colisões remanescentes recebem um prefixo numérico determinístico

DestinationPrefix deve conter de 1 a 256 caracteres ASCII imprimíveis; os prefixos são inseridos após um BOM UTF-16BE quando a chave usa essa codificação

Anotações de link internas que usam /Dest ou uma ação /A /GoTo única são reescritas como destinos explícitos; portanto, alvos nomeados de links continuam corretos após uma renomeação por colisão

Páginas donas de links existentes e seus alvos mudam de posição quando páginas são inseridas; cada ocorrência de uma página importada repetidamente recebe uma anotação de link independente, enquanto seus alvos internos são mapeados para a primeira ocorrência selecionada da página alvo

Destinos cuja página alvo foi omitida são removidos da árvore de named destinations; um link afetado tem seu /Dest ou ação GoTo removidos, mantendo a anotação e suas demais propriedades

Links URI permanecem intactos; cadeias de ações de link que usam /Next são rejeitadas, porque remapear cadeias de ações está fora do escopo atual deste helper

Árvores de destinos malformadas ou cíclicas, referências de objeto indisponíveis e chaves duplicadas na árvore de nomes rejeitam a transação; falha, cancelamento ou orçamento excedido deixa o documento de quem chama inalterado

Orçamentos e relatórios

Os limites padrão são 10,000 itens de outline, profundidade 128, 1,048,576 caracteres de título, 10,000 named destinations, 100,000 links de página e 256 MiB de bytes do documento; o teto de bytes do documento não pode exceder MaxInt

Quando o processamento adicional de destinos ou links está habilitado, a profundidade máxima configurável é 256, o limite de named destinations não pode exceder 65,536 e o limite de links de página não pode exceder 1,000,000; a captura de origem também limita os bytes brutos de chave a 1 MiB

Chaves nomeadas combinadas usam um orçamento de bytes separado, igual a MaxTitleCharacters; cada origem é capturada dentro dos orçamentos configurados antes da filtragem de páginas selecionadas

PreservedNamedDestinationCount conta as named destinations finais, RenamedNamedDestinationCount conta as chaves importadas alteradas pela política escolhida e RemovedNamedDestinationCount conta os alvos nomeados não resolvidos ou omitidos

RemappedPageLinkCount conta os destinos internos finais tanto de links existentes quanto importados, e RemovedPageLinkCount conta os destinos internos removidos; um link que contém /Dest e GoTo contribui uma vez para cada destino

Declarações públicas

type
  TPdfMergeNavigationPolicy= (pmnPreserve, pmnGroupBySource);
  TPdfMergeNamedDestinationPolicy= (pndReject, pndRename, pndNamespace);

  TPdfNavigationMergeOptions= record
    NativeOptions: TPdfBatchMergeOptions;
    NavigationPolicy: TPdfMergeNavigationPolicy;
    MaxOutlineItems: Integer;
    MaxOutlineDepth: Integer;
    MaxTitleCharacters: Integer;
    MaxDocumentBytes: Int64;
    PreserveNamedDestinations, PreservePageLinks: Boolean;
    NamedDestinationPolicy: TPdfMergeNamedDestinationPolicy;
    DestinationPrefix: string;
    MaxNamedDestinations, MaxPageLinks: Integer;
    class function Default: TPdfNavigationMergeOptions; static;
  end;

  TPdfNavigationMergeReport= record
    Succeeded: Boolean;
    Cancelled: Boolean;
    ImportedSourceCount: Integer;
    ImportedPageCount: Integer;
    PreservedOutlineCount: Integer;
    RemovedDestinationCount: Integer;
    SourceGroupCount: Integer;
    PreservedNamedDestinationCount, RenamedNamedDestinationCount: Integer;
    RemovedNamedDestinationCount, RemappedPageLinkCount, RemovedPageLinkCount: Integer;
    ErrorMessage: string;
  end;

  // The caller's document is replaced only after the complete staged result
  // has been independently reopened and its outline destinations checked
  TPdfNavigationMergeHelper= class helper for TPdf
    function MergeFilesWithNavigation(const Sources: TPdfBatchMergeSources;
      const Options: TPdfNavigationMergeOptions;
      out Report: TPdfNavigationMergeReport): Boolean;
  end;

function MergePdfFilesWithNavigation(Destination: TPdf;
  const Sources: TPdfBatchMergeSources;
  const Options: TPdfNavigationMergeOptions;
  out Report: TPdfNavigationMergeReport): Boolean;

Processamento de stream de baixo nível

FPdfCompress expõe CapturePdfNavigation e WritePdfNavigation para quem gerencia as próprias importações de páginas e revisões esparsas de PDF

TPdfNavigationNamedDestination.NameKey contém bytes brutos da chave PDF; os números de página são absolutos e de base um, enquanto zero denota um alvo não resolvido

TPdfNavigationPageLink.PageNumber identifica a página dona; AnnotationIndex é o ordinal de base zero entre todas as anotações originais e LinkIndex é o ordinal de base zero apenas entre as anotações de link

O writer identifica links por LinkIndex, clona cada anotação com sua página dona final e grava os alvos de página fornecidos e os sufixos exatos de destino; quem chama deve fornecer o mapeamento completo exigido pelas suas importações

O writer exige streams de origem e de saída distintos e um documento não criptografado e não assinado; a rejeição de argumentos com streams idênticos preserva a origem, e outras falhas limpam o stream de saída separado

Essas funções de stream não importam páginas nem substituem um documento TPdf ativo; use a função transacional de nível mais alto para o merge completo de navegação

function CapturePdfNavigation(Source: TStream; MaxNamedDestinations,
  MaxPageLinks, MaxDepth: Integer; out Names: TPdfNavigationNamedDestinations;
  out Links: TPdfNavigationPageLinks; out ErrorText: string): Boolean;

function WritePdfNavigation(Source, Output: TStream;
  const Names: TPdfNavigationNamedDestinations;
  const Links: TPdfNavigationPageLinks; ReplaceNamedDestinations: Boolean;
  out ErrorText: string): Boolean;