PDFium Delphi Component Docs

Transaktionale Navigationszusammenführung

Fügen Sie FPdfMerge zur uses-Klausel hinzu, um TPdfNavigationMergeHelper.MergeFilesWithNavigation zu nutzen, oder rufen Sie global MergePdfFilesWithNavigation mit explizitem Zieldokument auf

Der Helper bereitet native Seitenimporte vor, rekonstruiert hierarchische Lesezeichen, kombiniert benannte Ziele, ordnet Seitenlinks neu zu und öffnet das Ergebnis unabhängig wieder, bevor er das Aufruferdokument ersetzt

pmnPreserve erhält die Quellhierarchie; pmnGroupBySource fügt eine Überschrift mit dem jeweiligen Quelldateinamen ein

Titel, Elternbeziehungen, Stile, Farben, aufgeklappte Zweige, URI-Aktionen und aufgelöste interne Seitenziele bleiben erhalten; ausgewählte, wiederholte und umsortierte Seiten zeigen auf die erste importierte Instanz, Ziele ausgelassener Seiten werden zu Überschriften

Vorhandene Ziellesezeichen verschieben sich beim Einfügen; Quelldateien bleiben während Navigationserfassung und nativem Import ohne Schreibfreigabe geöffnet

Nur Zusammenführung mit Stopp bei Fehlern ist unterstützt; signierte Ziele, nicht unterstützte Lesezeichenaktionen und verschlüsselte Nachbearbeitung werden mit Fehlerbericht abgelehnt; Fehler oder Abbruch erhalten das Aufruferdokument

Diese API behält die bisherige native Formularpolitik; verwenden Sie FPdfFormMerge für erweiterte AcroForm-Namenskollisionen und Ressourcenbehandlung

Benannte Ziele und Seitenlinks

PreserveNamedDestinations und PreservePageLinks sind standardmäßig True; False überspringt den jeweiligen zusätzlichen Navigationsteil

Benannte Ziele werden aus dem älteren Katalogdictionary /Dests und dem Namensbaum /Names/Dests gelesen, auch hierarchische Bäume, indirekte Arrays und Zieldictionaries mit /D; bei gleicher Schlüsseldefinition hat der Namensbaum Vorrang

Das Ergebnis verwendet einen balancierten /Names/Dests-Baum und erhält andere Namensbäume des Ziels wie /EmbeddedFiles; nicht zielbezogene Quellbäume werden nicht importiert

Schlüssel behalten ihre originalen PDF-Stringbytes einschließlich UTF-16BE; Ansichtsmodus und Parameter bleiben exakt erhalten, darunter /FitH null und /XYZ null 34 null

RegelVerhalten
pndRejectEin im Ziel vorhandener Quellschlüssel verwirft die gesamte Transaktion
pndRenameStandardmäßig bleiben konfliktfreie Namen erhalten; kollidierende erhalten DestinationPrefix, standardmäßig Imported_; weitere Kollisionen nutzen deterministische Präfixe wie 2_Imported_Shared
pndNamespaceJeder Quellschlüssel erhält DestinationPrefix, den einsbasierten Quellindex und einen Unterstrich, etwa Imported_1_Shared; weitere Kollisionen erhalten ein deterministisches Zahlenpräfix

DestinationPrefix muss 1 bis 256 druckbare ASCII-Zeichen enthalten; bei UTF-16BE-Schlüsseln wird das Präfix nach dem BOM eingefügt

Interne Linkannotationen mit /Dest oder einer einzelnen /A /GoTo-Aktion werden als explizite Ziele geschrieben; benannte Linkziele bleiben damit nach Kollisionsumbenennung korrekt

Vorhandene Linkeigentümerseiten und Ziele verschieben sich beim Einfügen; jede wiederholt importierte Seite erhält eigene Linkannotationen, interne Ziele zeigen auf die erste ausgewählte Instanz der Zielseite

Ziele ausgelassener Seiten werden aus dem Namensbaum entfernt; der betroffene Link verliert /Dest oder GoTo-Aktion, behält aber Annotation und andere Eigenschaften

URI-Links bleiben unverändert; verkettete Aktionen mit /Next werden abgelehnt, weil Aktionsketten außerhalb des aktuellen Helperumfangs liegen

Fehlerhafte oder zyklische Zielbäume, fehlende Objektreferenzen und doppelte Namensbaumschlüssel verwerfen die Transaktion; Fehler, Abbruch oder Budgetüberschreitung lassen das Aufruferdokument unverändert

Budgets und Berichte

Standardlimits sind 10,000 Lesezeicheneinträge, Tiefe 128, 1,048,576 Titelzeichen, 10,000 benannte Ziele, 100,000 Seitenlinks und 256 MiB Dokumentbytes; der Dokumentbytehöchstwert darf MaxInt nicht überschreiten

Bei zusätzlicher Ziel- oder Linkverarbeitung ist die konfigurierte Tiefe höchstens 256, die Zielgrenze höchstens 65,536 und die Linkgrenze höchstens 1,000,000; Quellerfassung begrenzt rohe Schlüsselbytes zusätzlich auf 1 MiB

Kombinierte benannte Schlüssel erhalten ein eigenes Bytebudget gleich MaxTitleCharacters; jede Quelle wird vor der Seitenauswahl innerhalb der Budgets erfasst

PreservedNamedDestinationCount zählt finale benannte Ziele, RenamedNamedDestinationCount durch die Regel geänderte importierte Schlüssel und RemovedNamedDestinationCount unaufgelöste oder ausgelassene Ziele

RemappedPageLinkCount zählt finale interne Ziele vorhandener und importierter Links, RemovedPageLinkCount entfernte interne Ziele; ein Link mit /Dest und GoTo zählt einmal je Ziel

Öffentliche Deklarationen

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;

Streamverarbeitung auf niedriger Ebene

FPdfCompress stellt CapturePdfNavigation und WritePdfNavigation für eigene Seitenimporte und sparse PDF-Revisionen bereit

TPdfNavigationNamedDestination.NameKey enthält rohe PDF-Schlüsselbytes; Seitenzahlen sind absolut und einsbasiert, null steht für ein unaufgelöstes Ziel

TPdfNavigationPageLink.PageNumber bezeichnet die Eigentümerseite; AnnotationIndex ist nullbasiert unter allen Originalannotationen, LinkIndex nur unter Linkannotationen

Der Writer identifiziert Links über LinkIndex, klont jede Annotation mit ihrer finalen Eigentümerseite und schreibt die übergebenen Seitenziele und exakten Zielsuffixe; der Aufrufer muss die komplette Importzuordnung liefern

Der Writer verlangt verschiedene Quell-/Ausgabestreams und ein unverschlüsseltes unsigniertes Dokument; identische Streams werden unter Erhalt der Quelle abgelehnt, andere Fehler leeren den separaten Ausgabestream

Diese Streamfunktionen importieren keine Seiten und ersetzen kein lebendes TPdf-Dokument; für vollständige Navigationszusammenführung verwenden Sie die transaktionale Funktion höherer Ebene

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;