PDFium Delphi Component Docs

Unione transazionale della navigazione

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

Destinazioni nominate e link di pagina

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

PoliticaComportamento
pndRejectUna chiave sorgente già presente nella destinazione fa rifiutare l'intera transazione
pndRenameLa 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
pndNamespaceA 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

Limiti e report

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

Dichiarazioni pubbliche

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;

Elaborazione degli stream a basso livello

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;