PDFium Delphi Component Docs

Combinación transaccional de navegación

Agregue FPdfMerge a la cláusula uses para habilitar TPdfNavigationMergeHelper.MergeFilesWithNavigation, o llame a la función global MergePdfFilesWithNavigation con un documento de destino explícito

El helper prepara la importación nativa de páginas, reconstruye los marcadores jerárquicos, combina destinos con nombre, remapea los enlaces de página y reabre el resultado de forma independiente antes de reemplazar el documento del llamador

pmnPreserve mantiene la jerarquía de origen; pmnGroupBySource agrega un encabezado con el nombre de cada archivo de origen

Se conservan títulos, relaciones padre-hijo, estilos, colores, ramas expandidas, acciones URI y destinos internos de página resueltos; las páginas seleccionadas, repetidas y reordenadas apuntan a la primera aparición importada, y los destinos hacia páginas omitidas pasan a ser encabezados

Los marcadores existentes del destino se desplazan al insertar páginas; los archivos de origen permanecen abiertos sin permitir escritura compartida mientras se captura la navegación y se importan las páginas nativas

Solo se admite la combinación que se detiene ante un error; se rechazan destinos firmados, acciones de marcadores no compatibles y posprocesamiento cifrado con un informe de error, y cualquier falla o cancelación conserva el documento del llamador

Esta API conserva la política nativa existente para formularios; use FPdfFormMerge si necesita manejo avanzado de colisiones de campos AcroForm y recursos

Destinos con nombre y enlaces de página

PreserveNamedDestinations y PreservePageLinks tienen True como valor predeterminado; establecer cualquiera en False omite esa parte del procesamiento adicional de navegación

Los destinos con nombre se leen tanto del diccionario antiguo /Dests del catalog como del árbol de nombres /Names/Dests, incluidos árboles jerárquicos, arreglos indirectos y diccionarios de destino con /D; si ambas formas definen la misma clave, prevalece el valor del árbol de nombres

El resultado usa un árbol /Names/Dests balanceado y conserva los árboles de nombres del destino ajenos a la navegación, como /EmbeddedFiles; este helper no importa árboles de origen que no sean de destinos

Las claves conservan sus bytes originales de cadena PDF, incluida la codificación UTF-16BE; se mantienen 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 existe en el destino rechaza toda la transacción
pndRenameLa política predeterminada conserva los nombres sin conflicto y antepone DestinationPrefix a los nombres en conflicto; su valor predeterminado es Imported_, y las colisiones adicionales usan prefijos deterministas como 2_Imported_Shared
pndNamespaceA cada clave de origen se le antepone 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 de 1 a 256 caracteres ASCII imprimibles; si una clave usa UTF-16BE, los prefijos se insertan después del BOM

Las anotaciones de enlace que usan /Dest o una única acción /A /GoTo se reescriben como destinos explícitos; así, los enlaces a destinos con nombre siguen siendo correctos después de renombrar una colisión

Al insertar páginas se desplazan las páginas propietarias de los enlaces existentes y sus destinos; cada aparición de una página importada repetidamente recibe una anotación de enlace independiente, mientras que sus destinos internos apuntan a la primera aparición seleccionada de la página de destino

Los destinos cuya página se omitió se eliminan del árbol de destinos con nombre; un enlace afectado pierde su /Dest o acción GoTo, pero conserva la anotación y sus demás propiedades

Los enlaces URI permanecen intactos; se rechazan las acciones encadenadas mediante /Next, porque remapear cadenas de acciones está fuera del alcance actual del helper

Los árboles de destinos mal formados o cíclicos, las referencias a objetos no disponibles y las claves duplicadas del árbol de nombres rechazan la transacción; una falla, cancelación o exceso de presupuesto deja intacto el documento del llamador

Presupuestos de recursos e informes

Los límites predeterminados son 10,000 marcadores, profundidad 128, 1,048,576 caracteres de título, 10,000 destinos con nombre, 100,000 enlaces de página y 256 MiB de bytes de documento; el máximo de bytes del documento no debe superar MaxInt

Con el procesamiento adicional de destinos o enlaces habilitado, la profundidad máxima configurable es 256, el límite de destinos con nombre no debe superar 65,536 y el de enlaces de página no debe superar 1,000,000; la captura del origen también limita los bytes crudos de claves a 1 MiB

Las claves con nombre combinadas tienen un presupuesto de bytes independiente igual a MaxTitleCharacters; cada origen se captura dentro de los límites configurados antes de filtrar las páginas seleccionadas

PreservedNamedDestinationCount cuenta los destinos con nombre finales, RenamedNamedDestinationCount las claves importadas modificadas por la política elegida y RemovedNamedDestinationCount los destinos con nombre sin resolver u omitidos

RemappedPageLinkCount cuenta los destinos internos finales de los enlaces existentes e importados, y RemovedPageLinkCount los destinos internos 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 expone CapturePdfNavigation y WritePdfNavigation para quienes administran sus propias importaciones de páginas y revisiones PDF dispersas

TPdfNavigationNamedDestination.NameKey contiene los bytes crudos de la clave PDF; los números de página son absolutos y empiezan en uno, mientras que cero indica un destino sin resolver

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

El escritor identifica enlaces por LinkIndex, clona cada anotación con su página propietaria final y escribe las páginas de destino y los sufijos exactos proporcionados; el llamador debe suministrar todo el mapeo necesario para sus importaciones

El escritor exige flujos distintos para origen y salida, y un documento sin cifrar ni firmar; rechazar argumentos con flujos idénticos conserva el origen, mientras que las demás fallas vacían el flujo de salida independiente

Estas funciones de flujo no importan páginas ni reemplazan un documento TPdf activo; para combinar toda la navegación, use la función transaccional de nivel superior

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;