PDFium Delphi Component Docs

Transakční slučování navigace

Přidejte FPdfMerge do uses pro zpřístupnění TPdfNavigationMergeHelper.MergeFilesWithNavigation, nebo zavolejte globální MergePdfFilesWithNavigation s explicitním cílovým dokumentem

Helper připraví nativní import stránek, obnoví hierarchické outline, spojí pojmenované cíle, přemapuje odkazy stránek a nezávisle znovu otevře výsledek před náhradou dokumentu volajícího

pmnPreserve zachovává zdrojovou hierarchii; pmnGroupBySource přidává záhlaví podle názvu každého zdrojového souboru

Zachovávají se názvy, rodičovské vazby, styly, barvy, rozbalené větve, akce URI a vyřešené interní cíle stránek; vybrané, opakované a přeuspořádané stránky se mapují na první importovaný výskyt a cíle vynechaných stránek se mění na záhlaví

Existující outline cíle se při vložení stránek posunou; zdrojové soubory zůstávají během zachycení navigace a nativního importu stránek otevřené bez povoleného sdílení pro zápis

Podporováno je pouze slučování se zastavením při chybě; podepsané cíle, nepodporované outline akce a šifrovaný post-processing se odmítají s chybovým reportem, selhání či zrušení zachovává dokument volajícího

Toto API zachovává dosavadní nativní pravidla formulářů; pro pokročilé kolize polí AcroForm a práci s prostředky použijte FPdfFormMerge

Pojmenované cíle a odkazy stránek

PreserveNamedDestinations i PreservePageLinks mají výchozí hodnotu True; nastavení kterékoli na False přeskočí danou část dodatečného zpracování navigace

Pojmenované cíle se čtou ze staršího slovníku katalogu /Dests i name tree /Names/Dests, včetně hierarchických stromů, nepřímých polí a slovníků cílů s /D; pokud obě formy definují stejný klíč, přednost má hodnota z name tree

Výsledek používá vyvážený strom /Names/Dests a zachovává nesouvisející name trees cíle, například /EmbeddedFiles; nesouvisející zdrojové stromy tento helper neimportuje

Klíče zachovávají původní bajty řetězců PDF včetně kódování UTF-16BE; zachová se přesný režim zobrazení i parametry, například /FitH null a /XYZ null 34 null

PravidloChování
pndRejectZdrojový klíč, který už v cíli existuje, odmítne celou transakci
pndRenameVýchozí pravidlo zachovává nekolidující názvy a konfliktní názvy opatří prefixem DestinationPrefix, standardně Imported_; další kolize používají deterministické prefixy, například 2_Imported_Shared
pndNamespaceKaždý zdrojový klíč získá DestinationPrefix, index zdroje od jedné a podtržítko, například Imported_1_Shared; zbývající kolize dostanou deterministický číselný prefix

DestinationPrefix musí obsahovat 1 až 256 tisknutelných znaků ASCII; u klíče kódovaného v UTF-16BE se prefix vloží za BOM

Anotace interních odkazů s /Dest nebo jedinou akcí /A /GoTo se přepisují na explicitní cíle; pojmenované cíle odkazů tak zůstanou správné i po přejmenování kvůli kolizi

Existující vlastníci odkazů i cílové stránky se při vložení stránek posunou; každý výskyt opakovaně importované stránky získá nezávislou anotaci odkazu, její interní cíle se ale mapují na první vybraný výskyt cílové stránky

Cíle vynechaných stránek se odstraní ze stromu pojmenovaných cílů; dotčenému odkazu se odstraní /Dest nebo akce GoTo, anotace a ostatní vlastnosti zůstanou

Odkazy URI zůstanou beze změny; zřetězené akce odkazu s /Next se odmítají, protože přemapování řetězců akcí nyní tento helper nepokrývá

Poškozené či cyklické stromy cílů, nedostupné odkazy na objekty a duplicitní klíče name tree odmítnou transakci; chyba, zrušení či překročení rozpočtu ponechá dokument volajícího beze změny

Rozpočty a reporty

Výchozí limity jsou 10,000 položek outline, hloubka 128, 1,048,576 znaků názvů, 10,000 pojmenovaných cílů, 100,000 odkazů stránek a 256 MiB dokumentových bajtů; strop bajtů dokumentu nesmí přesáhnout MaxInt

Při zapnutém dodatečném zpracování cílů či odkazů je maximální nastavitelná hloubka 256, limit pojmenovaných cílů nesmí přesáhnout 65,536 a limit odkazů stránek 1,000,000; zachycení zdroje také omezuje raw bajty klíčů na 1 MiB

Spojené pojmenované klíče mají samostatný bajtový rozpočet rovný MaxTitleCharacters; každý zdroj se zachytí v nastavených rozpočtech před filtrováním vybraných stránek

PreservedNamedDestinationCount počítá výsledné pojmenované cíle, RenamedNamedDestinationCount importované klíče změněné zvoleným pravidlem a RemovedNamedDestinationCount nevyřešené či vynechané pojmenované cíle

RemappedPageLinkCount počítá výsledné interní cíle existujících i importovaných odkazů, RemovedPageLinkCount odstraněné interní cíle; odkaz obsahující /Dest i GoTo přispívá jednou za každý cíl

Veřejné deklarace

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;

Nízkoúrovňové zpracování streamů

FPdfCompress zpřístupňuje CapturePdfNavigation a WritePdfNavigation volajícím, kteří sami spravují import stránek a sparse revize PDF

TPdfNavigationNamedDestination.NameKey obsahuje raw bajty klíče PDF; čísla stránek jsou absolutní od jedné, nula označuje nevyřešený cíl

TPdfNavigationPageLink.PageNumber určuje vlastníka stránky; AnnotationIndex je pořadí od nuly mezi všemi původními anotacemi a LinkIndex pořadí od nuly jen mezi anotacemi odkazů

Writer určuje odkazy podle LinkIndex, klonuje každou anotaci s konečným vlastníkem stránky a zapisuje dodané cílové stránky i přesné suffixy cílů; volající musí dodat úplné mapování potřebné pro své importy

Writer vyžaduje rozdílný zdrojový a výstupní stream a nešifrovaný, nepodepsaný dokument; odmítnutí shodných streamů zachová zdroj, ostatní chyby vyprázdní oddělený výstupní stream

Tyto streamové funkce neimportují stránky ani nenahrazují živý dokument TPdf; pro kompletní sloučení navigace použijte transakční funkci vyšší úrovně

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;