Voeg FPdfMerge toe aan de uses-clause om TPdfNavigationMergeHelper.MergeFilesWithNavigation beschikbaar te maken, of roep de globale functie MergePdfFilesWithNavigation aan met een expliciet doeldocument
De helper zet native pagina-imports klaar, bouwt hiërarchische outlines opnieuw op, combineert named destinations, wijst paginalinks opnieuw toe en heropent het resultaat onafhankelijk voordat het document van de aanroeper wordt vervangen
pmnPreserve behoudt de bronhiërarchie; pmnGroupBySource voegt een kop toe met de naam van elk bronbestand
Titels, ouderrelaties, stijlen, kleuren, uitgeklapte takken, URI-acties en opgeloste interne paginabestemmingen blijven behouden; geselecteerde, herhaalde en herordende pagina's verwijzen naar de eerst geïmporteerde occurrence, en bestemmingen van weggelaten pagina's worden koppen
Bestaande bestemmingsoutlines schuiven mee wanneer pagina's worden ingevoegd; bronbestanden blijven open met write sharing geweigerd zolang de navigatie en de native pagina-imports worden vastgelegd
Alleen samenvoegen met stop-on-error wordt ondersteund; ondertekende bestemmingen, niet-ondersteunde outline-acties en versleutelde nabewerking worden geweigerd met een foutrapport, en mislukking of annulering laat het document van de aanroeper onaangetast
Deze API behoudt het bestaande native formulierbeleid; gebruik FPdfFormMerge wanneer geavanceerde afhandeling van AcroForm-veldbotsingen en resources nodig is
PreserveNamedDestinations en PreservePageLinks staan beide standaard op True; zet een van die opties op False om dat deel van de aanvullende navigatieverwerking over te slaan
Named destinations worden gelezen uit zowel de verouderde /Dests-dictionary van de catalogus als de naamboom /Names/Dests, inclusief hiërarchische bomen, indirecte arrays en bestemmingsdictionary's met /D; wanneer beide vormen dezelfde sleutel definieren, wint de waarde uit de naamboom
Het resultaat gebruikt een gebalanceerde /Names/Dests-boom en behoudt niet-gerelateerde bestemmingsnaambomen zoals /EmbeddedFiles; bronnbomen die niets met bestemmingen te maken hebben, importeert deze helper niet
Sleutels behouden hun oorspronkelijke PDF-stringbytes, inclusief UTF-16BE-codering; de exacte view mode en parameters blijven behouden, inclusief /FitH null en /XYZ null 34 null
| Policy | Gedrag |
|---|---|
pndReject | Een bronsleutel die al in het doel bestaat, verwerpt de hele transactie |
pndRename | Het standaardbeleid houdt niet-conflicterende namen aan en voorziet conflicterende namen van het voorvoegsel DestinationPrefix, dat standaard Imported_ is; verdere botsingen krijgen deterministische voorvoegsels zoals 2_Imported_Shared |
pndNamespace | Elke bronsleutel krijgt het voorvoegsel DestinationPrefix, de op 1 gebaseerde bronindex en een underscore, zoals Imported_1_Shared; overgebleven botsingen krijgen een deterministisch numeriek voorvoegsel |
DestinationPrefix moet 1 tot 256 printbare ASCII-tekens bevatten; voorvoegsels worden na een UTF-16BE-BOM ingevoegd wanneer een sleutel die codering gebruikt
Interne linkannotaties met /Dest of een enkele /A /GoTo-actie worden herschreven als expliciete bestemmingen; genoemde linkdoelen blijven dus correct na een hernoeming bij botsing
Bestaande pagina's die eigenaar zijn van links en hun doelen schuiven mee wanneer pagina's worden ingevoegd; elke occurrence van een herhaald geïmporteerde pagina krijgt een eigen linkannotatie, terwijl de interne doelen ervan verwijzen naar de eerst geselecteerde occurrence van de doelpagina
Bestemmingen waarvan de doelpagina is weggelaten, worden uit de named-destination-boom verwijderd; een getroffen link verliest zijn /Dest of GoTo-actie, terwijl de annotatie en de overige eigenschappen behouden blijven
URI-links blijven intact; gekoppelde linkacties met /Next worden geweigerd, omdat het opnieuw toewijzen van actieketens buiten het huidige bereik van deze helper valt
Misvormde of cyclische bestemmingsbomen, onbeschikbare objectreferenties en dubbele naamboomsleutels verwerpen de transactie; mislukking, annulering of een overschreden budget laat het document van de aanroeper ongewijzigd
Standaardlimieten zijn 10,000 outline-items, diepte 128, 1,048,576 titeltekens, 10,000 named destinations, 100,000 paginalinks en 256 MiB aan documentbytes; het documentbyteplafond mag niet boven MaxInt uitkomen
Wanneer aanvullende verwerking van bestemmingen of links is ingeschakeld, is de maximaal ingestelde diepte 256, mag de named-destination-limiet niet boven 65,536 uitkomen en mag de paginalinklimiet niet boven 1,000,000 uitkomen; het vastleggen van bronnen begrenst ruwe sleutelbytes bovendien op 1 MiB
Gecombineerde named keys gebruiken een apart bytebudget gelijk aan MaxTitleCharacters; elke bron wordt binnen de ingestelde budgetten vastgelegd vóór het filteren op geselecteerde pagina's
PreservedNamedDestinationCount telt de uiteindelijke named destinations, RenamedNamedDestinationCount telt geïmporteerde sleutels die door het gekozen beleid zijn gewijzigd en RemovedNamedDestinationCount telt onopgeloste of weggelaten named targets
RemappedPageLinkCount telt de uiteindelijke interne bestemmingen over bestaande en geïmporteerde links samen, en RemovedPageLinkCount telt verwijderde interne bestemmingen; een link met zowel /Dest als een GoTo-actie telt per bestemming één keer mee
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 stelt CapturePdfNavigation en WritePdfNavigation beschikbaar voor aanroepers die hun eigen pagina-imports en spaarzame PDF-revisies beheren
TPdfNavigationNamedDestination.NameKey bevat rauwe PDF-sleutelbytes; paginanummers zijn absoluut en op 1 gebaseerd, waarbij nul een onopgelost doel aanduidt
TPdfNavigationPageLink.PageNumber identificeert de pagina die eigenaar is; AnnotationIndex is de op 0 gebaseerde volgorde tussen alle oorspronkelijke annotaties en LinkIndex is de op 0 gebaseerde volgorde uitsluitend tussen linkannotaties
De schrijver identificeert links aan de hand van LinkIndex, kloont elke annotatie met zijn definitieve pagina-eigenaar en schrijft de opgegeven paginadoelen en exacte bestemmingsachtervoegsels; aanroepers moeten de volledige mapping aanleveren die hun imports nodig hebben
De schrijver vereist verschillende bron- en uitvoerstreams en een niet-versleuteld, niet-ondertekend document; weigering van argumenten bij identieke streams laat de bron staan, en andere fouten maken de aparte uitvoerstream leeg
Deze streamfuncties importeren geen pagina's en vervangen geen live TPdf-document; gebruik de hogere transactionele functie voor volledige navigatiesamenvoeging
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;