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
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
| Policy | Beteende |
|---|---|
pndReject | En källnyckel som redan finns i måldokumentet avvisar hela transaktionen |
pndRename | Standardpolicyn 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 |
pndNamespace | Varje 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
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
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 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;