Dodaj FPdfMerge do klauzuli uses, aby włączyć TPdfNavigationMergeHelper.MergeFilesWithNavigation, albo wywołaj globalną funkcję MergePdfFilesWithNavigation z jawnym dokumentem docelowym
Pomocnik etapuje natywne importy stron, przebudowuje hierarchiczne zakładki, scala nazwane cele, przemapowuje linki stron i niezależnie otwiera wynik przed podmianą dokumentu wywołującego
pmnPreserve zachowuje hierarchię źródła; pmnGroupBySource dodaje nagłówek nazwany po każdym pliku źródłowym
Tytuły, relacje nadrzędne, style, kolory, rozwinięte gałęzie, akcje URI i rozwiązane wewnętrzne cele stron są zachowywane; wybrane, powtórzone i przetasowane strony mapują się do pierwszego zaimportowanego wystąpienia, a cele stron pominiętych stają się nagłówkami
Istniejące zakładki celów przesuwają się przy wstawianiu stron; pliki źródłowe pozostają otwarte z zablokowanym współdzieleniem zapisu, dopóki pobierane są nawigacja i natywne importy stron
Obsługiwane jest wyłącznie scalanie z zatrzymaniem przy błędzie; podpisane cele, nieobsługiwane akcje zakładek i szyfrowane przetwarzanie końcowe są odrzucane z raportem błędu, a niepowodzenie lub anulowanie zachowuje dokument wywołującego
To API zachowuje istniejącą politykę natywnych formularzy; gdy potrzebujesz zaawansowanej obsługi kolizji pól AcroForm i zasobów, użyj FPdfFormMerge
PreserveNamedDestinations i PreservePageLinks domyślnie mają wartość True; ustawienie którejkolwiek opcji na False pomija tę część dodatkowego przetwarzania nawigacji
Nazwane cele są odczytywane zarówno ze starszego słownika /Dests katalogu, jak i z drzewa nazw /Names/Dests, włącznie z hierarchicznymi drzewami, pośrednimi tablicami i słownikami celów zawierającymi /D; gdy obie formy definiują ten sam klucz, wartość z drzewa nazw ma pierwszeństwo
Wynik używa zbalansowanego drzewa /Names/Dests i zachowuje niepowiązane drzewa nazw celów, takie jak /EmbeddedFiles; drzewa źródłowe niezwiązane z celami nie są importowane przez tego pomocnika
Klucze zachowują oryginalne bajty ciągu PDF, włącznie z kodowaniem UTF-16BE; dokładny tryb widoku i parametry są zachowywane, w tym /FitH null i /XYZ null 34 null
| Polityka | Zachowanie |
|---|---|
pndReject | Klucz źródłowy istniejący już w dokumencie docelowym odrzuca całą transakcję |
pndRename | Polityka domyślna zachowuje niekolidujące nazwy, a kolidującym dodaje przedrostek DestinationPrefix, domyślnie Imported_; dalsze kolizje używają deterministycznych przedrostków, takich jak 2_Imported_Shared |
pndNamespace | Każdy klucz źródłowy dostaje przedrostek DestinationPrefix, swoje jednopodstawowe indeksy źródła i podkreślnik, np. Imported_1_Shared; pozostałe kolizje otrzymują deterministyczny przedrostek numeryczny |
DestinationPrefix musi zawierać od 1 do 256 drukowalnych znaków ASCII; przedrostki są wstawiane po BOM UTF-16BE, gdy klucz używa tego kodowania
Wewnętrzne adnotacje linków używające /Dest lub pojedynczej akcji /A /GoTo są przepisywane na jawne cele; nazwane cele linków pozostają więc poprawne po zmianie nazwy przy kolizji
Istniejące strony właścicieli linków i cele przesuwają się przy wstawianiu stron; każde wystąpienie wielokrotnie importowanej strony dostaje niezależną adnotację linku, a jej wewnętrzne cele mapują się do pierwszego wybranego wystąpienia strony docelowej
Cele, których strona docelowa została pominięta, są usuwane z drzewa nazwanych celów; dotkniętemu linkowi usuwa się /Dest lub akcję GoTo, zachowując adnotację i jej pozostałe właściwości
Linki URI pozostają nienaruszone; łańcuchowane akcje linków używające /Next są odrzucane, ponieważ przemapowanie łańcuchów akcji wykracza poza obecny zakres tego pomocnika
Wadliwe lub cykliczne drzewa celów, niedostępne odwołania do obiektów i zduplikowane klucze drzewa nazw odrzucają transakcję; niepowodzenie, anulowanie lub przekroczenie budżetu pozostawia dokument wywołującego bez zmian
Domyślne limity to 10,000 wpisów zakładek, głębokość 128, 1,048,576 znaków tytułów, 10,000 nazwanych celów, 100,000 linków stron i 256 MiB bajtów dokumentu; limit bajtów dokumentu nie może przekraczać MaxInt
Przy włączonym dodatkowym przetwarzaniu celów lub linków maksymalna skonfigurowana głębokość wynosi 256, limit nazwanych celów nie może przekraczać 65,536, a limit linków stron 1,000,000; pobranie źródła ogranicza też surowe bajty kluczy do 1 MiB
Połączone klucze nazwane używają osobnego budżetu bajtów równego MaxTitleCharacters; każde źródło jest pobierane w ramach skonfigurowanych budżetów przed filtrowaniem wybranych stron
PreservedNamedDestinationCount liczy finalne nazwane cele, RenamedNamedDestinationCount liczy zaimportowane klucze zmienione przez wybraną politykę, a RemovedNamedDestinationCount liczy nierozwiązane lub pominięte nazwane cele
RemappedPageLinkCount liczy finalne wewnętrzne cele zarówno dla istniejących, jak i zaimportowanych linków, a RemovedPageLinkCount liczy usunięte wewnętrzne cele; link zawierający jednocześnie /Dest i GoTo liczy się raz dla każdego celu
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 udostępnia CapturePdfNavigation i WritePdfNavigation dla wywołujących, którzy sami zarządzają importami stron i rzadkimi rewizjami PDF
TPdfNavigationNamedDestination.NameKey zawiera surowe bajty klucza PDF; numery stron są absolutne i liczone od jedynki, a zero oznacza nierozwiązany cel
TPdfNavigationPageLink.PageNumber identyfikuje stronę właściciela; AnnotationIndex to licznik od zera wśród wszystkich oryginalnych adnotacji, a LinkIndex to licznik od zera wśród samych adnotacji linków
Writer rozpoznaje linki po LinkIndex, klonuje każdą adnotację z jej finalnym właścicielem strony i zapisuje podane cele stron oraz dokładne sufiksy celów; wywołujący musi dostarczyć kompletne mapowanie potrzebne dla swoich importów
Writer wymaga różnych strumieni źródłowego i wyjściowego oraz dokumentu nieszyfrowanego i niepodpisanego; odrzucenie argumentów przy identycznych strumieniach zachowuje źródło, a inne niepowodzenia czyszczą osobny strumień wyjściowy
Te funkcje strumieniowe nie importują stron i nie podmieniają żywego dokumentu TPdf; do pełnego scalania z nawigacją użyj funkcji transakcyjnej wyższego poziomu
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;