PDFium Delphi Component Docs

Fusión transaccional de la navegación

Añada FPdfMerge a uses para utilizar TPdfNavigationMergeHelper.MergeFilesWithNavigation, o invoque la función global MergePdfFilesWithNavigation con un documento de destino explícito

El helper prepara importaciones nativas de páginas, reconstruye outlines jerárquicos, combina named destinations, remapea enlaces y reabre el resultado de forma independiente antes de sustituir el documento del llamador

pmnPreserve conserva la jerarquía del origen; pmnGroupBySource añade un encabezado con el nombre de cada fichero de origen

Se conservan títulos, relaciones de parentesco, estilos, colores, ramas expandidas, acciones URI y destinos internos resueltos; las páginas seleccionadas, repetidas o reordenadas se mapean a la primera copia importada, y los destinos de páginas omitidas pasan a ser encabezados

Los outlines existentes del destino se desplazan al insertar páginas; los ficheros de origen permanecen abiertos sin compartir escritura mientras se captura la navegación y la importación nativa

Solo se admite merge con parada ante errores; los destinos firmados, acciones outline no compatibles y posprocesado cifrado se rechazan con informe, y los fallos o la cancelación conservan el documento del llamador

Esta API mantiene la política nativa de formularios; use FPdfFormMerge para gestión avanzada de colisiones y recursos AcroForm

Destinos con nombre y enlaces de página

PreserveNamedDestinations y PreservePageLinks valen True por defecto; poner cualquiera a False omite esa parte de la navegación adicional

Los named destinations se leen del dictionary antiguo /Dests del catalog y del name tree /Names/Dests, incluidos árboles jerárquicos, arrays indirectos y destination dictionaries con /D; si ambos definen una clave, prevalece el valor del name tree

El resultado utiliza un árbol /Names/Dests equilibrado y conserva otros name trees del destino como /EmbeddedFiles; no se importan árboles del origen ajenos a los destinos

Las claves conservan sus bytes de string PDF originales, incluido UTF-16BE; se mantiene el modo de vista exacto y sus parámetros, incluidos /FitH null y /XYZ null 34 null

PolíticaComportamiento
pndRejectUna clave de origen que ya exista en el destino rechaza toda la transacción
pndRenameLa política predeterminada conserva nombres sin conflictos y antepone DestinationPrefix, cuyo valor predeterminado es Imported_, a los conflictivos; las colisiones posteriores usan prefijos deterministas como 2_Imported_Shared
pndNamespaceCada clave de origen recibe DestinationPrefix, su índice de origen con base uno y un guion bajo, por ejemplo Imported_1_Shared; las colisiones restantes reciben un prefijo numérico determinista

DestinationPrefix debe contener entre 1 y 256 caracteres ASCII imprimibles; si la clave usa UTF-16BE, el prefijo se inserta tras el BOM

Las anotaciones de enlace interno con /Dest o una acción única /A /GoTo se reescriben como destinos explícitos; así los enlaces a destinos con nombre siguen siendo correctos tras renombrar por colisión

Las páginas propietarias y objetivos de enlaces existentes se desplazan al insertar; cada copia de una página importada repetidamente recibe su propia anotación de enlace, y sus destinos internos apuntan a la primera copia seleccionada de la página objetivo

Los destinos cuya página se omite desaparecen del árbol; el enlace afectado pierde su /Dest o acción GoTo, pero mantiene la anotación y el resto de propiedades

Los enlaces URI permanecen intactos; las acciones encadenadas con /Next se rechazan porque su remapeo queda fuera del alcance actual del helper

Árboles de destinos malformados o cíclicos, referencias de objeto no disponibles y claves duplicadas rechazan la transacción; fallos, cancelación o exceso de límites dejan intacto el documento del llamador

Límites e informes

Los límites predeterminados son 10,000 entradas outline, profundidad 128, 1,048,576 caracteres de título, 10,000 named destinations, 100,000 enlaces y 256 MiB de documento; el máximo de bytes no debe superar MaxInt

Con procesamiento adicional de destinos o enlaces, la profundidad máxima es 256, el límite de destinos no supera 65,536 y el de enlaces no supera 1,000,000; la captura también limita los bytes de claves sin procesar a 1 MiB

Las claves combinadas usan un presupuesto de bytes separado igual a MaxTitleCharacters; cada origen se captura dentro de los límites configurados antes de filtrar páginas

PreservedNamedDestinationCount cuenta destinos con nombre finales, RenamedNamedDestinationCount claves importadas modificadas por la política y RemovedNamedDestinationCount destinos omitidos o no resueltos

RemappedPageLinkCount cuenta destinos internos finales de enlaces existentes e importados, y RemovedPageLinkCount los eliminados; un enlace con /Dest y GoTo cuenta una vez por cada destino

Declaraciones públicas

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;

Procesamiento de flujos de bajo nivel

FPdfCompress ofrece CapturePdfNavigation y WritePdfNavigation para gestionar importaciones propias y revisiones PDF dispersas

TPdfNavigationNamedDestination.NameKey contiene los bytes originales de clave PDF; los números de página son absolutos y con base uno, y cero indica un destino no resuelto

TPdfNavigationPageLink.PageNumber identifica la página propietaria; AnnotationIndex es el ordinal con base cero entre todas las anotaciones originales y LinkIndex solo entre las de enlace

El writer identifica enlaces por LinkIndex, clona cada anotación con su propietario final y escribe los objetivos y sufijos de destino exactos suministrados; el llamador debe proporcionar todo el mapeo necesario para sus importaciones

El writer requiere flujos de origen y salida distintos y un documento sin cifrar ni firmar; rechazar flujos idénticos preserva el origen, y otros fallos vacían la salida separada

Estas funciones no importan páginas ni sustituyen un documento TPdf activo; utilice la función transaccional de nivel superior para completar el merge de navegación

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;