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
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
| Pravidlo | Chování |
|---|---|
pndReject | Zdrojový klíč, který už v cíli existuje, odmítne celou transakci |
pndRename | Vý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 |
pndNamespace | Kaž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
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
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 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;