PDFium Delphi Component Docs

Merge de navegação transacional

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

O helper prepara as 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 do chamador

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

Títulos, relações de progenitor, 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

Os outlines de destino existentes deslocam-se quando páginas são inseridas; os ficheiros de origem permanecem abertos com a partilha de escrita recusada enquanto a navegação e as importações nativas de páginas são capturadas

Só é suportado o merge com paragem no primeiro erro; destinos assinados, ações de outline não suportadas e pós-processamento encriptado são recusados com um relatório de erro, e a falha ou o cancelamento preservam o documento do chamador

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

Named destinations e links de página

PreserveNamedDestinations e PreservePageLinks assumem por predefinição o valor True; definir qualquer uma destas opções como False omite essa parte do processamento adicional de navegação

As named destinations são lidas tanto do dicionário /Dests legado do catálogo como da árvore de nomes /Names/Dests, incluindo árvores hierárquicas, arrays indiretos e dicionários de destino que contenham /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 com destinos, como /EmbeddedFiles; árvores de origem sem relação com destinos não são importadas por este helper

As chaves mantêm os 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á exista no destino recusa a transação inteira
pndRenameA política predefinida mantém nomes sem conflito e prefixa os nomes em conflito com DestinationPrefix, que por predefinição é Imported_; colisões posteriores usam prefixos determinísticos, como 2_Imported_Shared
pndNamespaceToda chave de origem recebe o prefixo DestinationPrefix, o 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 usem /Dest ou uma ação /A /GoTo única são reescritas como destinos explícitos; os alvos nomeados dos links por isso continuam corretos após uma renomeação por colisão

As páginas proprietárias de links existentes e os seus alvos deslocam-se quando páginas são inseridas; cada ocorrência de uma página importada repetidamente recebe uma anotação de link independente, enquanto os seus alvos internos são mapeados para a primeira ocorrência selecionada da página alvo

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

Os links URI permanecem intactos; cadeias de ações de link que usem /Next são recusadas, porque remapear cadeias de ações está fora do âmbito atual deste helper

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

Orçamentos e relatórios

Os limites predefinidos 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á ativado, 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 como importados, e RemovedPageLinkCount conta os destinos internos removidos; um link que contenha /Dest e GoTo contribui uma vez por 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 chamadores que gerem as suas 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 proprietária; 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 os links por LinkIndex, clona cada anotação com a sua página proprietária final e escreve os alvos de página fornecidos e os sufixos exatos de destino; o chamador 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 encriptado e não assinado; a recusa de argumentos com streams idênticos preserva a origem, e as restantes falhas limpam o stream de saída separado

Estas 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;