PDFium Component Docs

Transakcyjne scalanie z zachowaniem nawigacji

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

Named destinations and page links

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

PolitykaZachowanie
pndRejectKlucz źródłowy istniejący już w dokumencie docelowym odrzuca całą transakcję
pndRenamePolityka 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
pndNamespaceKaż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

Budgets and reports

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

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;

Low-level stream processing

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;