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
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ítica | Comportamento |
|---|---|
pndReject | Uma chave de origem que já exista no destino recusa a transação inteira |
pndRename | A 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 |
pndNamespace | Toda 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
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
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;
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;