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
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ítica | Comportamiento |
|---|---|
pndReject | Una clave de origen que ya exista en el destino rechaza toda la transacción |
pndRename | La 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 |
pndNamespace | Cada 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
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
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 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;