Aggiungere FPdfMerge alla clausola uses per abilitare TPdfNavigationMergeHelper.MergeFilesWithNavigation, oppure chiamare la funzione globale MergePdfFilesWithNavigation passando un documento di destinazione esplicito
L'helper prepara importazioni native delle pagine, ricostruisce outline gerarchici, combina destinazioni nominate, rimappa link di pagina e riapre indipendentemente il risultato prima di sostituire il documento del chiamante
pmnPreserve mantiene la gerarchia sorgente; pmnGroupBySource aggiunge un'intestazione con il nome di ogni file sorgente
Vengono mantenuti titoli, rapporti padre-figlio, stili, colori, rami espansi, azioni URI e destinazioni interne risolte; pagine selezionate, ripetute o riordinate vengono mappate alla prima occorrenza importata e le destinazioni verso pagine omesse diventano intestazioni
Gli outline esistenti della destinazione vengono spostati all'inserimento delle pagine; i file sorgente rimangono aperti senza condivisione in scrittura durante l'acquisizione della navigazione e delle importazioni native
È supportata solo l'unione con arresto al primo errore; destinazioni firmate, azioni outline non supportate e post-elaborazione cifrata sono rifiutate con una segnalazione. Errori e annullamento mantengono il documento del chiamante
Questa API conserva la politica nativa esistente per i form; usare FPdfFormMerge per gestire collisioni e risorse AcroForm in modo avanzato
PreserveNamedDestinations e PreservePageLinks sono entrambi True per impostazione predefinita; impostare un'opzione a False salta quella parte dell'elaborazione aggiuntiva della navigazione
Le destinazioni nominate vengono lette sia dal dizionario storico /Dests del catalogo sia dal name tree /Names/Dests, inclusi alberi gerarchici, array indiretti e dizionari di destinazione con /D; se le due forme definiscono la stessa chiave, prevale il name tree
Il risultato usa un albero /Names/Dests bilanciato e conserva altri name tree della destinazione, come /EmbeddedFiles; questo helper non importa gli alberi sorgente estranei alle destinazioni
Le chiavi conservano i byte originali delle stringhe PDF, inclusa la codifica UTF-16BE; modalità di visualizzazione e parametri esatti restano invariati, compresi /FitH null e /XYZ null 34 null
| Politica | Comportamento |
|---|---|
pndReject | Una chiave sorgente già presente nella destinazione fa rifiutare l'intera transazione |
pndRename | La politica predefinita mantiene i nomi senza conflitti e antepone DestinationPrefix, il cui valore predefinito è Imported_, a quelli in conflitto; altre collisioni usano prefissi deterministici come 2_Imported_Shared |
pndNamespace | A ogni chiave sorgente viene anteposto DestinationPrefix, l'indice sorgente a base uno e un underscore, ad esempio Imported_1_Shared; le collisioni residue ricevono un prefisso numerico deterministico |
DestinationPrefix deve contenere da 1 a 256 caratteri ASCII stampabili; per chiavi UTF-16BE il prefisso viene inserito dopo il BOM
Le annotazioni di link interni con /Dest o una singola azione /A /GoTo vengono riscritte come destinazioni esplicite; i link verso nomi rimangono quindi corretti dopo una rinomina per collisione
Pagine proprietarie e destinazioni dei link esistenti si spostano quando si inseriscono pagine; ogni occorrenza di una pagina importata più volte riceve un'annotazione di link indipendente, mentre i target interni puntano alla prima occorrenza selezionata della pagina di destinazione
Le destinazioni verso pagine omesse vengono eliminate dall'albero delle destinazioni nominate; il link interessato perde /Dest o l'azione GoTo, mantenendo l'annotazione e le altre proprietà
I link URI restano intatti; le catene di azioni con /Next sono rifiutate perché la rimappatura di catene è fuori dall'ambito attuale dell'helper
Alberi di destinazione malformati o ciclici, riferimenti a oggetti non disponibili e chiavi duplicate nel name tree fanno rifiutare la transazione; errori, annullamento o limiti superati lasciano invariato il documento del chiamante
I limiti predefiniti sono 10,000 voci outline, profondità 128, 1,048,576 caratteri nei titoli, 10,000 destinazioni nominate, 100,000 link di pagina e 256 MiB di byte del documento; quest'ultimo limite non deve superare MaxInt
Quando è attiva l'elaborazione aggiuntiva di destinazioni o link, la profondità massima configurabile è 256, il limite delle destinazioni nominate non può superare 65,536 e quello dei link 1,000,000; l'acquisizione sorgente limita inoltre i byte grezzi delle chiavi a 1 MiB
Le chiavi nominate combinate hanno un limite di byte separato pari a MaxTitleCharacters; ogni sorgente viene acquisita entro i limiti configurati prima del filtro delle pagine selezionate
PreservedNamedDestinationCount conta le destinazioni nominate finali, RenamedNamedDestinationCount le chiavi importate modificate dalla politica selezionata e RemovedNamedDestinationCount i target nominati non risolti o omessi
RemappedPageLinkCount conta le destinazioni interne finali dei link esistenti e importati e RemovedPageLinkCount quelle eliminate; un link con /Dest e GoTo contribuisce una volta per ciascuna destinazione
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 espone CapturePdfNavigation e WritePdfNavigation per chi gestisce autonomamente importazioni di pagine e revisioni PDF sparse
TPdfNavigationNamedDestination.NameKey contiene i byte grezzi delle chiavi PDF; i numeri di pagina sono assoluti e a base uno, mentre zero indica un target non risolto
TPdfNavigationPageLink.PageNumber identifica la pagina proprietaria; AnnotationIndex è l'ordinale a base zero tra tutte le annotazioni originali e LinkIndex quello tra le sole annotazioni di link
Il writer identifica i link tramite LinkIndex, clona ogni annotazione con la pagina proprietaria finale e scrive i target forniti e i suffissi esatti delle destinazioni; il chiamante deve fornire la mappatura completa necessaria alle importazioni
Il writer richiede stream sorgente e output distinti e un documento non cifrato e non firmato; argomenti con stream identici sono rifiutati conservando la sorgente, mentre gli altri errori svuotano lo stream di output separato
Queste funzioni sugli stream non importano pagine né sostituiscono un documento TPdf attivo; per unire completamente la navigazione usare la funzione transazionale di livello superiore
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;