PDF cargado a PDF/A-4 con preservación de texto y vectores
HPDFArchivalConversion ofrece un perfil de preservación para documentos cargados cuyas fuentes visibles, espacios de color y recursos de rendering pueden satisfacer PDF/A-4 sin reemplazar el contenido de sus páginas
El conversor retiene los operadores de texto originales, los paths vectoriales, las imágenes, la geometría de páginas y las capas de texto OCR existentes, aplana las apariencias visibles normales de anotaciones y widgets en Form XObjects vectoriales, repara problemas soportados de metadatos y estructura, y valida el resultado serializado antes de publicar
Este perfil nunca rasteriza una página: RasterizedPages permanece en cero, incluso cuando el OCR renderiza un bitmap temporal de reconocimiento y agrega texto invisible buscable
La aceptación en runtime cubre Delphi Win32 y Win64; el FPC de Windows compila la implementación desde fuentes frescas, y los headers públicos generados compilan con C++Builder Win32 y Win64x
Puntos de entrada
function HPDFConvertLoadedToPDFA4Preserving(Source: THotPDF;
Destination: TStream; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
function HPDFConvertLoadedToPDFA4PreservingFile(Source: THotPDF;
const TargetFileName: string; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
Carga primero la fuente, mantén vivo cualquier stream de entrada propiedad del caller y dale al conversor acceso exclusivo al documento durante la operación
Options := THPDFArchivalPreservationOptions.Default;
if not HPDFConvertLoadedToPDFA4PreservingFile(Source, TargetFileName,
SRGBProfile, Options, Report) then
raise Exception.Create(Report.Conversion.Diagnostic);
Prueba de preservación
El conversor toma un snapshot del graph fuente editado actual bajo una transacción de graph y hace rollback de la fuente tras la serialización, luego realiza todo el trabajo de conversión sobre un clon cargado independiente
Los content streams decodificados originales de páginas deben permanecer byte-idénticos y alcanzables desde sus páginas originales en su orden original tras recargar la salida
Los árboles de recursos de página y los árboles retenidos de recursos de apariencias normales se recorren con límites de objetos y recursión; los programas de fuentes incrustadas, los mapas ToUnicode, las imágenes, los perfiles ICC y los Form XObjects anidados retienen sus payloads codificados originales, verificados con SHA-256 en streaming y comprobados por continuarse alcanzando desde las páginas de salida
Los content streams independientes rodean los operadores originales de página con guards de graphics state y contienen los operadores de apariencias agregados, evitando el path nativo de append de un solo stream que reescribiría un content stream original
TextAndVectorContentPreserved se vuelve true solo después de que la validación nativa de salida y las comprobaciones de preservación pasan; se limpia cuando la conversión o la publicación del archivo falla
Manejo de apariencias
- Las apariencias normales visibles
AP/Nse mapean desde su Form BBox y Matrix al Rect de la anotación usando el aplanado nativo de anotaciones, reteniendo sus propias fuentes y recursos - Los flags Invisible, Hidden y NoView impiden pintar incluso cuando existe una apariencia normal previa; las anotaciones Popup se eliminan sin pintar
- Los links sin borde y sin apariencia normal se eliminan sin pintar solo cuando un borde explícito de ancho cero establece que no tienen borde visible
SynthesizeMissingAppearancesvale true por defecto e invoca la generación nativa de apariencias de markup o de campos; los subtypes no soportados, los rectángulos inválidos o la generación fallida rechazan la conversión- Las apariencias textuales ausentes soportan valores ASCII con una codificación de fuente nativa compatible; los valores textuales hexadecimales, Unicode o enmascarados exigen una apariencia normal explícita
- Las apariencias textuales sintetizadas se comprueban contra sus valores fuente en el texto buscable recargado tras normalizar whitespace; una codificación de fuente incompatible rechaza la publicación
Suministrar una apariencia normal existente soporta texto arbitrario con fuente incrustada que ya está representado correctamente en esa apariencia, incluido Unicode; el conversor retiene esa apariencia en lugar de sustituir una fuente del sistema
El aplanado elimina la interacción de anotaciones, los campos editables, los cálculos, las actions y los campos de firma manteniendo las apariencias visibles; cada anotación afectada y cada apariencia sintetizada produce una entrada de pérdida con su página fuente, índice de anotación y número de objeto cuando están disponibles
Color, fuentes y pérdidas explícitas
El argumento ICC requerido es un perfil sRGB matrix/TRC aceptado por el validador de archivado existente; cada perfil de salida existente debe tener exactamente los mismos bytes decodificados que el perfil suministrado, de lo contrario la conversión se rechaza para evitar reinterpretar la condición de salida existente
El conversor agrega un output intent sRGB PDF/A solo cuando hace falta, sincroniza el serializador real a un header PDF 2.0 e invoca la reparación acotada base de metadatos y estructura PDF/A-4
No incrusta programas de fuentes visibles ausentes, no recodifica texto original, no recolorea operadores DeviceCMYK, no reemplaza una condición de salida existente ni aplana la transparencia de páginas a un bitmap; los hallazgos nativos de preflight no resueltos rechazan la publicación
Las fuentes cifradas deben descifrarse antes de la conversión; los campos de firma exigen AllowSignatureInvalidation explícito, y los embedded files existentes exigen RemoveEmbeddedFiles explícito porque este perfil apunta al PDF/A-4 base
Losses también reporta la invalidación de firmas, la eliminación de embedded files, la eliminación de diccionarios Info legacy y la eliminación de metadatos de catalog o presentación prohibidos
El XMP existente se retiene cuando es soportado; cuando se generan metadatos, se transfiere la información soportada de título, autor, asunto y keywords, mientras que no se promete que campos Info legacy arbitrarios sobrevivan
OCR y presupuestos
AddOCRToImagePages vale false por defecto; al activarlo se reconocen las páginas sin texto extraíble y se agrega texto invisible sin reemplazar el contenido original ni las capas OCR existentes
Fija OCREngine a un motor de la aplicación o déjalo nil para el motor ASCII acotado integrado, cuya cobertura de idioma y tipografía sigue siendo la del perfil de reconocimiento integrado
OCROptions controla la resolución de reconocimiento y los presupuestos de palabras, mientras que el conversor fuerza skip-pages-with-text, la retención de las capas OCR existentes y la omisión de un grupo de optional-content nuevo
Limits usa THPDFArchivalConversionOptions.Default para conteo de páginas, conteo de objetos, bytes de salida en staging, trabajo por stream individual, trabajo acumulado de streams, cancelación y checkpoints síncronos; los límites de píxeles raster solo aplican cuando el OCR renderiza bitmaps de reconocimiento
Los defaults adicionales son 1,024 entradas de pérdida, 1,048,576 unidades de código de texto extraído o esperado y 4,000,000 tokens de contenido por pasada de validación nativa
El hashing de payloads de recursos cuenta bytes codificados contra los mismos presupuestos de trabajo por stream; la verificación de fuente y salida consume ambas trabajo acumulado, de modo que colecciones grandes de escaneos pueden exigir un MaxTotalDecodedBytes aumentado explícitamente aunque la verificación de recursos use un buffer de hash fijo de 64 KiB
Los presupuestos aplican después de cargar la fuente y acotan por separado los snapshots propios del conversor y la salida en staging; configura los límites del loader al aceptar entradas no confiables
Publicación y validación
La API de stream exige un destino vacío seekable en posición cero y rechaza alias de la fuente; copia los bytes de staging solo después de que la recarga, la validación nativa, las comprobaciones de preservación y las comprobaciones de cancelación tengan éxito
Un fallo de escritura en el destino dispara un reset de mejor esfuerzo; un stream personalizado arbitrario puede rechazar ese reset, así que usa el punto de entrada de archivos para la publicación atómica
La API de archivos sondea alias de la fuente, crea un archivo temporal exclusivo junto al destino, le hace flush y reemplaza el destino con MoveFileEx solo cuando todas las comprobaciones pasan; los fallos anteriores retienen un destino existente y eliminan el archivo temporal
InitialValidationIssues, Repair, Conversion.ValidationIssues, los detalles de OCR, los conteos de streams, los conteos de texto extraído y las pérdidas explícitas quedan disponibles para inspección
La validación nativa cubre las reglas PDF/A-4 soportadas de HotPDF y no es una certificación general de PDFs arbitrarios; la aceptación de regresión usa además comprobaciones independientes con pypdf y MuPDF más la validación PDF/A-4 de veraPDF sobre los artifacts de apariencias generadas y OCR nativo
La regresión con corpus real incluye guías de Word y de biblioteca con fuentes incrustadas y una colección de escaneos chinos de 380 páginas, mientras que un reporte comercial con fuentes no incrustadas y contenido DeviceCMYK es un caso de rechazo explícito
Comandos de regresión
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win32
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win64
python Tests/Delphi/Fixtures/ArchivalPreservation/verify_preserving_output.py
verapdf --format xml --flavour 4 Tests/Delphi/generated/ArchivalPreservation/appearance.pdf Tests/Delphi/generated/ArchivalPreservation/ocr.pdf Tests/Delphi/generated/ArchivalPreservation/native-appearance.pdf
El runner de Delphi suprime el lanzamiento del visor e incluye fixtures de regresión tanto de preservación como del raster existente; la aceptación independiente con veraPDF usa el perfil real de validación PDF/A-4
Temas relacionados
La conversión de archivado raster provee un perfil separado con pérdida explícita del texto y vectores originales cuando el rendering nativo es soportado