PDFium Delphi Component Docs

Transaktionell sammanslagning av navigering

Lägg till FPdfMerge i uses-satsen för att aktivera TPdfNavigationMergeHelper.MergeFilesWithNavigation, eller anropa den globala funktionen MergePdfFilesWithNavigation med ett explicit måldokument

Hjälparen mellanlagrar nativa sidimporter, bygger upp hierarkiska dispositioner igen, kombinerar namngivna mål, mappar om sidlänkar och öppnar resultatet igen oberoende innan anroparens dokument ersätts

pmnPreserve behåller källhierarkin; pmnGroupBySource lägger till en rubrik uppkallad efter varje källfil

Titlar, föräldrarelationer, stilar, färger, utfällda grenar, URI-åtgärder och upplösta interna sidmål bevaras; valda, upprepade och omsorterade sidor mappas till den första importerade förekomsten, och mål till utelämnade sidor blir rubriker

Befintliga måldispositioner förskjuts när sidor infogas; källfiler förblir öppna med skrivdelning nekad medan navigering och nativa sidimporter fångas in

Endast sammanslagning med stopp vid fel stöds; signerade mål, dispositionsåtgärder som inte stöds och krypterad efterbehandling avvisas med en felrapport, och fel eller avbrytning bevarar anroparens dokument

Detta API behåller den befintliga nativa formulärpolicyn; använd FPdfFormMerge när du behöver avancerad hantering av AcroForm-fältkollisioner och resurser

Namngivna mål och sidlänkar

PreserveNamedDestinations och PreservePageLinks har båda True som standard; sätter du något av alternativen till False hoppas den delen av den tilläggsmedvetna navigeringsbearbetningen över

Namngivna mål läses från både den äldre katalogordboken /Dests och namnträdet /Names/Dests, inklusive hierarkiska träd, indirekta matriser och målordböcker som innehåller /D; när båda formerna definierar samma nyckel har namnträdsvärdet företräde

Resultatet använder ett balanserat /Names/Dests-träd och bevarar orelaterade målnamnträd som /EmbeddedFiles; källträd utan koppling till mål importeras inte av denna hjälpare

Nycklar behåller sina ursprungliga PDF-strängbyte, inklusive UTF-16BE-kodning; det exakta visningsläget och parametrarna bevaras, inklusive /FitH null och /XYZ null 34 null

PolicyBeteende
pndRejectEn källnyckel som redan finns i måldokumentet avvisar hela transaktionen
pndRenameStandardpolicyn behåller konfliktfria namn och sätter prefixet DestinationPrefix framför namn i konflikt, med Imported_ som standard; ytterligare kollisioner använder deterministiska prefix som 2_Imported_Shared
pndNamespaceVarje källnyckel får prefixet DestinationPrefix, källans ettbaserade index och ett understreck, som Imported_1_Shared; kvarvarande kollisioner får ett deterministiskt numeriskt prefix

DestinationPrefix måste innehålla 1 till 256 utskrivbara ASCII-tecken; prefix infogas efter en UTF-16BE-BOM när en nyckel använder den kodningen

Interna länkannoteringar som använder /Dest eller en ensam /A /GoTo-åtgärd skrivs om till explicita mål; namngivna länkmål förblir därmed korrekta efter en kollisionsomdöpning

Befintliga länkägarsidor och mål förskjuts när sidor infogas; varje förekomst av en upprepad importerad sida får en egen länkannotering, medan dess interna mål mappas till den första valda förekomsten av målsidan

Mål vars målsida utelämnades tas bort från namnmålsträdet; en berörd länk får sin /Dest eller GoTo-åtgärd borttagen samtidigt som annoteringen och dess övriga egenskaper behålls

URI-länkar förblir orörda; kedjade länkåtgärder med /Next avvisas, eftersom ommappning av åtgärdskedjor ligger utanför denna hjälparens nuvarande omfattning

Felformade eller cykliska målträd, otillgängliga objektreferenser och dubblerade namnträdsnycklar avvisar transaktionen; fel, avbrytning eller en förbrukad budget lämnar anroparens dokument oförändrat

Budgetar och rapporter

Standardgränserna är 10,000 dispositionsobjekt, djup 128, 1,048,576 titeltecken, 10,000 namngivna mål, 100,000 sidlänkar och 256 MiB dokumentbyte; byte-taket för dokumentet får inte överskrida MaxInt

När tilläggsbearbetning av mål eller länkar är aktiverad är maximal konfigurerad djup 256, gränsen för namngivna mål får inte överskrida 65,536 och gränsen för sidlänkar får inte överskrida 1,000,000; källinfångning begränsar också råa nyckelbyte till 1 MiB

Kombinerade namnnycklar använder en separat bytebudget lika med MaxTitleCharacters; varje källa fångas in inom de konfigurerade budgetarna innan filtrering av valda sidor

PreservedNamedDestinationCount räknar slutliga namngivna mål, RenamedNamedDestinationCount räknar importerade nycklar som ändrats av vald policy och RemovedNamedDestinationCount räknar olösta eller utelämnade namngivna mål

RemappedPageLinkCount räknar slutliga interna mål över både befintliga och importerade länkar, och RemovedPageLinkCount räknar borttagna interna mål; en länk med både /Dest och GoTo räknas en gång per mål

Public declarations

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;

Lågnivåströmbearbetning

FPdfCompress exponerar CapturePdfNavigation och WritePdfNavigation för anropare som hanterar egna sidimporter och glesa PDF-revisioner

TPdfNavigationNamedDestination.NameKey innehåller råa PDF-nyckelbyte; sidnummer är absoluta och ettbaserade, medan noll betecknar ett olöst mål

TPdfNavigationPageLink.PageNumber identifierar ägarsidan; AnnotationIndex är det nollbaserade ordningstalet bland alla ursprungliga annoteringar och LinkIndex är det nollbaserade ordningstalet bland enbart länkannoteringar

Skrivaren identifierar länkar via LinkIndex, klonar varje annotering med dess slutliga sidägare och skriver angivna sidmål och exakta målsuffix; anropare måste tillhandahålla den fullständiga mappning som deras import behövrer

Skrivaren kräver skilda käll- och utdataströmmar och ett okrypterat, osignerat dokument; avvisning av argument med identiska strömmar bevarar källan, och andra fel tömmer den separata utdataströmmen

Dessa strömfunktioner importerar inte sidor och ersätter inte ett aktivt TPdf-dokument; använd den transaktionella funktionen på högre nivå för fullständig navigeringssammanslagning

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;