Registro de cambios
Historial de versiones
« Volver al índice de la documentación
Historial de versiones de la biblioteca PDFlibPas. Las entradas se enumeran de la más reciente a la más antigua; cada versión sigue el versionado semántico conforme a la política de publicación del proyecto.
Último lanzamiento
- Versión más reciente: v3.75.6; Fecha de publicación: 2026-06-23
Version 3.333.0
Added
- Inspección de revisiones incrementales. Una firma cubre los bytes de la revisión en la que se escribió, y todo lo que se añade después es una actualización separada cuyo contenido decide si la firma sigue valiendo para el documento tal como está ahora.
GetDocumentRevisionCount,GetDocumentRevisionStartyGetDocumentRevisionEnddisponen esas revisiones, yGetSignatureRevisionIndexindica en cuál termina una firma GetDocumentRevisionKindinforma de lo que hizo una actualización, como lo más amplio de los objetos que tocó: contabilidad, material de validación, un sello de tiempo del documento, una firma, un campo de formulario, una anotación o contenido del documento. Añadir material de validación para la validación a largo plazo por tanto ya no parece editar el documentoGetDocumentRevisionChangesenumera cada objeto que una actualización añadió, cambió o eliminó, junto con qué es cada uno y, para un diccionario cambiado, qué claves difieren realmenteGetDocumentRevisionsCompleteinforma de si todo el historial era recuperable. Una cadena rota, cíclica o más larga de lo que el lector seguirá deja las actualizaciones más antiguas sin ver, y los conteos son entonces un límite inferior en lugar de una respuesta- Un objeto cuya versión anterior no se puede leer, o cuyo cuerpo de flujo nunca se comparó, se notifica como indeterminado en lugar de como inofensivo: una actualización que reescribe una página dejando intacto su diccionario no se confunde con un reempaquetado
Version 3.332.0
Added
ApplyPAdESLongTermValidationpromueve un PDF ya firmado a PAdES-B-LT en una sola llamada. Construye el camino de certificados del firmante a partir de la propia firma, recopila material OCSP y CRL para cada eslabón a través de las direcciones que indican los certificados y escribe los certificados y los datos de revocación en el document security store con una entrada VRI para la firma, en una única actualización incremental.ApplyPAdESLongTermValidationToStreamescribe el resultado en un flujo en lugar de un archivo- El comportamiento es configurable mediante una máscara de opciones
PADES_LTV_*: si escribir la entrada VRI, si consultar a los respondedores OCSP, si recurrir a las CRL, si seguir las direcciones del emisor para completar el camino y si omitir la revocación para una raíz autoemitida - Un nombre de campo vacío procesa cada firma en una sola revisión; un campo con nombre procesa solo ese
GetPAdESLTVCertificateCount,GetPAdESLTVCRLCount,GetPAdESLTVOCSPCountyGetPAdESLTVErrorinforman de lo que reunió la última llamada y de por qué se detuvo antes, de modo que un resultado parcial sobre un respondedor inalcanzable es visible en lugar de silencioso- El material idéntico a algo ya preparado se escribe una sola vez y lo referencia cada firma que lo necesita, y una firma que no porta ningún certificado legible se notifica en lugar de hacerse pasar por una promoción correcta
Version 3.331.0
Added
- Una firma lleva su propio camino de certificación, de modo que el material que necesita un perfil de validación a largo plazo puede leerse únicamente del archivo firmado.
GetSignatureSignerCertificateDER,GetSignatureEmbeddedCertificateCountyGetSignatureEmbeddedCertificateDERdevuelven los certificados que una firma incrusta, yGetSignatureCertificateChainLengthyGetSignatureCertificateChainDERlos ordenan en un camino desde el firmante hacia afuera GetSignatureContentsHashHexdevuelve la clave con la que se direcciona una entradaAddPAdESDSSVRI, calculada a partir de la propia firma- El certificado del firmante se identifica tanto si la firma lo designa por emisor y número de serie como por identificador de clave de sujeto, y un camino se detiene en el último emisor que la firma realmente porta en lugar de fingir estar completo
Fixed
- El lector DER rechaza una longitud de elemento declarada mayor que los datos en lugar de dejar que un valor casi máximo desborde su comprobación de límites, y el recorrido de las extensiones del certificado ya no lee más allá del final de un certificado truncado o demasiado largo. Ambos son alcanzables desde un documento manipulado, por lo que los descriptores anteriores siguen siendo seguros con entrada no fiable
- Los descriptores de firma leen el documento con un identificador compartido, de modo que responden mientras un verificador o visor ya tiene el archivo abierto, en lugar de fallar como si la firma estuviera ausente
Version 3.330.0
Added
- OCSP status requests.
BuildOCSPRequestencodes an RFC 6960 request for a certificate and its issuer,FetchOCSPResponseposts it to the responder and returns the reply, andAddPAdESDSSOCSPFromCertificatesdoes both and files the result in the document security store - The responder address is optional: when it is omitted, the one the certificate itself names is used, so a caller that has the certificate chain needs no further configuration
- A certificate pair that does not actually belong together is refused before anything is sent, instead of producing the "unknown" answer such a request earns from the responder and which reads like a revocation problem
- Only a successful response is stored; a responder that answered
tryLaterorunauthorizedis reported throughGetTimeStampErrorrather than filed as if it were a status answer
Version 3.329.0
Fixed
- Reusing one result array across successive enumeration calls no longer leaks the strings held in the array slots that a later call does not fill. This affected the documented "call once for the count, resize, call again" pattern whenever a later call returned fewer items than the array could hold, and the stranded text accumulated for the lifetime of the process
- Affected entry points include
EnumPageContentStates,EnumPageContentStatesEx,EnumAttachments,EnumDocumentFonts,EnumPageElements,EnumNamedDestinations,EnumSignatures,EnumFormFields,GetFormValues,GetTextInAreaEx, and the text-search, form-field-action and certificate enumeration calls
Changed
- The result-array parameter of those calls is now passed as
varrather thanout. Existing Delphi and C++Builder code compiles and links unchanged; the only visible difference is that array slots past the returned count keep whatever they held before instead of being silently blanked
Version 3.328.0
Added
- Certificates now tell the library where their status can be checked:
GetCertificateOCSPURLs,GetCertificateIssuerURLsandGetCertificateCRLURLsread the responder, issuing-certificate and CRL addresses out of a certificate, so assembling long-term validation material no longer requires knowing where a given authority publishes FetchRevocationMaterialdownloads material from those addresses, andAddPAdESDSSCRLFromURLandAddPAdESDSSCertificateFromURLdownload and file it in the document security store in one step- Addresses that name no fetchable resource, such as a directory name or a mail address, are skipped rather than reported as something that can be downloaded
Version 3.327.0
Added
- A built-in RFC 3161 time-stamp client.
SetTimeStampServerandSetTimeStampOptionsconfigure the authority, hash algorithm, requested policy, nonce use and timeout;FetchTimeStampTokenreturns a TimeStampToken for any digest ApplyPAdESSignatureTimeStampcompletes a PAdES-B-T signature in one call: it hashes the signature value, obtains the token from the configured authority and attaches it as the signature time-stamp attribute, replacing the previous three-step exchange the caller had to wire up itself- When a nonce is used the token is checked to carry the same value back, so a replayed or substituted response is rejected instead of being embedded in the document
GetTimeStampStatusandGetTimeStampErrorreport the authority's own status and failure text, so a refused request explains itself
Version 3.326.0
Added
- The PDFium renderer now writes the same image formats the GDI+ and Cairo renderers write.
RenderPageToFile,RenderPageToStreamandRenderPagesToFilesaccept BMP (option 0), JPEG (1), PNG (5), GIF (6), TIFF (7) and G4 TIFF (10) afterSelectRenderer(3), instead of accepting BMP alone - The JPEG quality set through
SetJPEGQualityand the active TIFF compression settings now apply to PDFium output as well, so switching renderers no longer changes the encoding of the file that is produced
Fixed
- Requesting PNG or any other non-BMP format from the PDFium renderer used to return 0 and leave an empty file behind. Applications that offered a renderer choice silently produced unreadable output whenever PDFium was the selected engine
- Asking the PDFium renderer for a metafile format it cannot produce (WMF, EMF, EPS, EMF+, HTML5) now reports which formats are available through
LastRenderErrorinstead of naming BMP as the only option
Version 3.324.0
Changed
- The PDFium renderer now feeds the document to the engine through a streaming data source instead of one resident buffer. Rendering and printing previously serialised the document and then copied it again into a string, so every page cost twice the document size in memory; the copy is gone and PDFium reads only the blocks it needs
- Rendering a page range to files parses the document once for the whole batch instead of once per page, so a long range no longer re-reads the entire file for every image it writes
- Older PDFium builds that do not export the streaming entry point keep working unchanged through the in-memory path
Fixed
- The renderer smoke test located the optional PDFium and Cairo libraries one directory too high and silently skipped both engines; it now finds them and exercises the real rendering paths
Version 3.323.0
Added
CreateValidationReportySaveValidationReportproducen un informe de validación PDF/A y PDF/UA-1 estructurado en XML o JSON. Cada hallazgo incluye el identificador de regla, el estándar que la posee, un nombre de regla corto, la cláusula ISO que aplica, una severidad y el número de objetos afectados, y el informe se cierra con estadísticas de aprobado/fallado por estándar y a nivel de documento- Un estándar que no se solicitó se notifica como
not-checkeden lugar de como una aprobación silenciosa, de modo que una ejecución parcial no se pueda confundir con un certificado de salud limpio - Las pipelines de compilación ahora pueden filtrar por un identificador de regla o una cláusula ISO en lugar de comparar subcadenas en el texto: la familia de informes preflight genera primero un informe humano y convierte ese texto a JSON, HTML o CSV, mientras que el informe de validación se ensambla a partir de la salida de comprobación en bruto y mantiene intactos los campos legibles por máquina
Version 3.322.0
Added
- La referencia ahora documenta los cuatro tipos públicos declarados externamente usados en la superficie
TPDFlibque antes no tenían página dedicada:TPDFlibProgressEvent,TPDFlibLogger,TPDFlibCertificateInfoyTPDFlibWatermarkBase, completando la cobertura de tipos públicos de evento, logger, resultado de enumeración y marca de agua
Version 3.321.0
Added
CheckDocumentPolicyevalúa reglas internas declarativas comoFonts.NotEmbedded = 0,Security.Encrypted = nooDocument.Pages <= 500contra el documento y notifica cada regla como aprobada o fallida con el valor real, convirtiendo una puerta de ingesta para editores, archivos e imprentas en configuración en lugar de código de inspección escrito a mano
Version 3.320.1
Fixed
- Dibujar texto en un modo PDF/A sin cargar primero una fuente ya no falla: PDF/A exige que cada programa de fuente esté incrustado, por lo que el atajo implícito a una fuente integrada se rechazaba y no quedaba ninguna fuente seleccionada, y
DrawTexty las demás llamadas de texto se colgaban en lugar de dibujar - La ruta de fuente implícita ahora resuelve una fuente real incrustable mientras un modo PDF/A está activo, de modo que el texto dibujado sin una llamada
AddTrueTypeFontexplícita se incrusta y sigue siendo conforme; una llamada directa aAddStandardFontsigue rechazándose bajo PDF/A - En hosts donde no se pueda resolver ninguna fuente incrustable, el dibujo recurre a las métricas integradas en lugar de fallar y notifica la carencia de conformidad mediante
LastErrorCode605, de modo que el archivo pueda interceptarse antes de publicarse como conforme
Version 3.320.0
Added
GetDocumentFeatureReportdevuelve un informe de características estructurado en una sola llamada — metadatos del documento, recuentos de páginas y objetos, estado de cifrado, inventarios de fuentes e imágenes, etiquetado y esquemas, campos de formulario, firmas, adjuntos y el desglose de bytes por categoría — sustituyendo la docena de consultas separadas que una pipeline de catalogación o ingesta tenía que ensamblar antes
Version 3.319.0
Added
SetCollectionView,AddCollectionField,SetCollectionSortySetCollectionItemValueconstruyen portafolios PDF sobre los adjuntos existentes, de modo que un conjunto de archivos incrustados se presenta como un paquete navegable con sus propias columnas, orden de clasificación y valores por archivo en lugar de como una simple lista de adjuntosGetCollectionViewyGetCollectionFieldCountnotifican el modo de presentación y el número de columnas declaradas de un portafolio cargado
Version 3.318.1
Fixed
- La opción de extracción de texto 12 (ignorar texto rotado) ahora descarta las secuencias rotadas hacia donde giren: un cuarto de giro en sentido horario y un cuarto de giro en sentido antihorario se trataban de forma distinta, por lo que las notas marginales laterales se descartaban en una dirección y se devolvían en la otra
- La misma opción conserva el texto inclinado que solo está cortado, como una itálica sintética, y la tolerancia ahora escala con el tamaño del texto y la transformación de página, de modo que los grandes titulares inclinados ya no se descartan como si estuvieran rotados
Version 3.318.0
Added
DecodeAllStreamsexpande los flujos comprimidos de un documento in situ, de modo que guardarlo produce una copia cuyos flujos de contenido, metadatos y estructura pueden leerse directamente con herramientas de diff, revisión forense y flujos de trabajo de soporte; las imágenes, los flujos de predicción y los flujos de referencia cruzada conservan su codificación, y los flujos de objeto se materializan primero para que no se pierda nada
Version 3.317.0
Added
SetTrappedyGetTrappeddeclaran y leen el estado de trapping del documento que PDF/X exige, escrito como el nombre/Trappedque la especificación requiere en lugar de como una cadena de textoSetOutputIntentSubtypeyGetOutputIntentSubtypereetiquetan el output intent, de modo que un perfil de color cargado puede describir una condición de impresiónGTS_PDFXen lugar de la condición de archivadoGTS_PDFA1que los modos PDF/A crean
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnlyyGetEncryptEmbeddedFilesOnlyrestringen el cifrado AES a los archivos incrustados: el documento se abre y se renderiza en cualquier lector sin petición de contraseña mientras sus adjuntos siguen cifrados, el arreglo estándar para facturas, historiales médicos y expedientes cuyas páginas de portada son públicas pero cuya carga útil no lo es
Version 3.315.0
Added
- La opción de extracción de texto 18 rota las secuencias pintadas a 90, 180 o 270 grados al marco de lectura horizontal y agrupa cada cuarto de giro por separado, de modo que las notas marginales rotadas, las cabeceras de tabla y las etiquetas de ejes de gráficos se extraen como líneas legibles en lugar de entrelazarse con el texto vertical o descartarse
Fixed
DASetTextExtractionOptionsacepta la opción 16 (eliminación de guion) y la opción 17 (división de palabras por hueco de caracteres) en lugar de rechazarlas, y la ruta de extracción de acceso directo ahora reenvía las opciones 15, 16 y 17 al extractor, de modo que la eliminación de reglas de subrayado, la eliminación de guion y la división por hueco de caracteres se aplican a los manejadores de archivo igual que a un documento cargado
Version 3.314.0
Added
GetFontHasToUnicodenotifica si la fuente seleccionada lleva una correspondencia Unicode, y el inventario de fuentes gana un campoHasToUnicodecorrespondiente por fuente además de un resumenNoToUnicodeCount, de modo que los documentos pueden comprobarse en busca de fuentes seguras para extracción y convertibles a PDF/A-*u o PDF/UA antes del procesamiento
Version 3.313.0
Added
SetPDFAModegana el modo 8 para PDF/A-2u (ISO 19005-2 Level U), el nivel de conformidad que declara correspondencias de texto Unicode sin permitir archivos incrustados, completando la familia PDF/A-2 junto a los modos 2b y 2a existentes
Version 3.312.0
Added
GetObjectByPathyGetObjectByPathCountleen cualquier nodo del árbol de objetos mediante expresiones de ruta comoRoot/Pages/Kids[0]/MediaBox[2]opages[0]/Type— tipos, valores escalares, formas serializadas y recuentos de elementos en una llamada, sustituyendo el recorrido de objetos escrito a mano para sondeos de metadatos, comprobaciones de conformidad puntuales y diagnósticos de soporte
Version 3.311.0
Added
SetBlackPointCompensationdeclara la compensación de punto negro (ON, OFF o Default) para el dibujo posterior mediante el estado gráfico/UseBlackPtCompde PDF 2.0, permitiendo a las salidas de preimpresión y pruebas fijar conversiones ICC de tonos oscuros que antes eran privadas del visor; la versión del documento se eleva automáticamente y los modos PDF/A rechazan el estado
Version 3.310.0
Added
SetCompressionLevelyGetCompressionLevelexponen el nivel deflate para cada compresión que realiza la biblioteca: 0 mantiene el motor acelerado por SIMD predeterminado, 1 favorece el rendimiento y 9 comprime los archivos al mínimoRecompressStreamsre-deflate cada flujo FlateDecode simple del documento seleccionado al nivel actual y mantiene la codificación más pequeña por flujo, reduciendo documentos que se escribieron originalmente con un ajuste de compresión rápido sin tocar su contenido
Version 3.309.0
Added
SetObjectStreamModeyGetObjectStreamModeañaden un control de flujo de objeto de tres estados: deshabilitar, generar (predeterminado) o preservar, donde preservar mantiene la agrupación comprimida original del archivo cargado's y escribe los contenedores verbatim, haciendo que las conversiones de archivos PDF 1.5+ existentes sean más baratas porque nada se desempaqueta ni reagrupa
Changed
- En modo preservar, los miembros editados desde la carga se promocionan a objetos de nivel superior para que sus cambios se guarden, y cualquier miembro comprimido restante selecciona automáticamente la forma de flujo de referencia cruzada binaria
Version 3.308.0
Added
CheckDocumentStructureejecuta una comprobación de salud estructural en una llamada: cada objeto y flujo se fuerza a través de su decodificador, los flujos Flate simples se verifican estrictamente contra el marcador final de zlib para que se detecten los datos truncados, y el informe marca trailers ausentes, catálogos y páginas no resolubles, manejadores de cifrado no admitidos y archivos reparados por exploración de bytes con hallazgos por objeto y una línea de resumen
Version 3.307.0
Fixed
- Los documentos dañados que usan flujos de referencia cruzada ahora se reparan con éxito: la reconstrucción en bruto recupera los miembros de los flujos de objetos comprimidos y, cuando no existe ninguna palabra clave trailer en el archivo, sintetiza el trailer a partir del catálogo de documento alcanzable más reciente, de modo que un desplazamiento startxref roto ya no vuelve inabribles tales archivos
Version 3.306.0
Added
ExportDocumentDataescribe las claves de información del documento, todo el árbol de marcadores y los rangos de etiquetas de página como texto sin formato editable en el formato de línea dump_data clásicoImportDocumentDataaplica el mismo formato a la inversa — las claves de información se actualizan, el árbol de marcadores se reconstruye con niveles de anidamiento y páginas de destino, y los rangos de etiquetas de página se reemplazan — permitiendo la edición masiva de marcadores y la migración de metadatos entre documentos en una llamada en cada sentido
Version 3.305.0
Added
AuditDocumentSpacedesglosa el uso de bytes del documento's por categoría — imágenes, programas de fuente y diccionarios, flujos de contenido, Form XObjects, flujos de objeto, archivos incrustados, metadatos, árbol de estructura, anotaciones, árbol de páginas y otros — con recuentos de objetos, totales de bytes y porcentajes, respondiendo a por qué un archivo es tan grande como es y qué optimización compensa mejor
Version 3.304.0
Added
StructTreeItemCount,GetStructTreeItemTextyGetStructTreeItemIntPropertyleen el árbol de estructura de un documento etiquetado como una lista de elementos aplanada en recorrido en profundidad — tipos de elemento (en bruto y mapeados por rol), texto alternativo y real, idioma, títulos, identificadores de contenido marcado, números de página y relaciones padre/hijo
Changed
- El lector del árbol de estructura se protege frente a documentos dañados: los ciclos de referencia, los números de objeto fuera de rango y los árboles anidados más allá de 64 niveles se cortan en lugar de bucle
Version 3.303.1
Fixed
- Los sellos de subcapa translúcidos creados por
StampTextyStampImageya no filtran su opacidad al contenido de página original — el estado de transparencia ahora está confinado al sello mismo, de modo que la página conserva su opacidad completa
Version 3.303.0
Added
OverlayDocumentPagesestampa las páginas de otro documento abierto sobre las páginas del documento seleccionado, una página de origen por página de destino, encima o debajo del contenido existente — papel membrete, fondos de página continuos y plantillas de formulario escaneadas en una llamada- El agotamiento del origen es configurable: detenerse, recorrer cíclicamente las páginas de origen o seguir repitiendo la última página de origen; una opción adicional impide que el sello se amplíe más allá de su tamaño natural
Changed
- Los sellos de documento se ajustan al CropBox de la página de destino's y se colocan en posición vertical en las páginas que llevan una entrada
/Rotate, y cada página de origen se importa una vez como Form XObject compartido para que las plantillas repetidas nunca dupliquen sus recursos
Version 3.302.0
Fixed
- Las contraseñas AES-256 ahora se procesan con SASLprep (RFC 4013) antes del hash, de modo que las contraseñas que contienen espacios no ASCII, guiones blandos, caracteres de compatibilidad o secuencias de combinación se abran correctamente en Acrobat y otros lectores conformes
- La apertura de documentos AES-256 prueba primero la contraseña preparada estándar y recurre a la forma de bytes heredada, de modo que los archivos escritos por versiones anteriores con contraseñas no ASCII sigan abriéndose
Added
- El código de error 604 notifica una contraseña AES-256 rechazada por SASLprep porque contiene puntos de código prohibidos o infringe las reglas bidireccionales
Version 3.301.0
Added
SplitDocumentToFilesdivide el documento seleccionado en un lote de archivos de salida con un número fijo de páginas cada uno, usando un marcador de posición%ppara el nombre de archivo
Changed
- La división por lotes analiza el documento de origen una vez y copia cada fragmento desde la misma estructura en memoria, sustituyendo el reanálisis completo repetido que un bucle sobre
ExtractFilePagesrealiza para cada rango
Version 3.300.0
Added
CollateDocumentsfusiona las páginas de varios documentos abiertos en el documento seleccionado en rotación, tomando un número configurable de páginas de cada origen por vuelta (A1, B1, A2, B2, …)CollateDocumentsExacepta una lista de rangos de páginas por origen en la que los rangos descendentes como3-1invierten un origen, de modo que los pases de escáner de anverso y reverso invertido se fusionan en orden de lectura en una llamada
Changed
- Las fusiones intercaladas importan cada origen a través de un único mapa de objetos y entrelazan por reordenación de páginas, de modo que las fuentes e imágenes compartidas dentro de un origen se escriben solo una vez independientemente del tamaño del grupo
Version 3.299.0
Added
SetDeterministicDocumentIDyGetDeterministicDocumentIDcambian el identificador de archivo del trailer a un valor reproducible de modo que entradas idénticas produzcan bytes de salida idénticos para caché de compilación, almacenamiento direccionable por contenido y comparación de regresión a nivel de bytesSetDocumentIDSeedsuministra una semilla explícita para el identificador de archivo reproducible; sin una semilla el identificador se deriva de los metadatos del documento, la cabecera de versión y el recuento de páginas
Changed
- Los identificadores de archivo reproducibles se refrescan solo en guardados completos; las actualizaciones incrementales y los documentos cifrados conservan su identificador existente de modo que las firmas y los archivos protegidos por contraseña sigan abriéndose correctamente
Version 3.298.0
Added
AddLinkToArticleThreadySetOutlineArticleThreadconectan puntos interactivos de página y contornos con un hilo de artículo o bead mediante acciones Thread estándarAddActionNextArticleThreadyPDF_ACTION_BUILDER_THREADañaden acciones Thread a flujos de trabajo de acciones encadenadas, de formulario, de página y de documento
Changed
- Los destinos de acción Thread utilizan referencias indirectas estables de hilo y bead y rechazan índices no válidos sin cambiar el contenedor de destino
- Los constructores de acciones de campo de formulario rechazan acciones adicionales mientras el modo PDF/A está activo, preservando la prohibición PDF/A de diccionarios
/AAde campo y widget
Version 3.297.0
Added
- La referencia de la DLL plana
DLdocumenta ahora todos los puntos de entrada ANSI con sufijoA(char), añadiendo 353 páginas de referencia que reflejan a sus contrapartes Unicode con firmas exactas dePAnsiCharDelphi yconst char *C BufferUtilities,DirectAccessFunctionalityyMiscellaneousFunctionsse han reconstruido como páginas de índice limpias de grupos de funciones, impulsadas por el esquema de categorías compartido, corrigiendo el marcado roto, las secciones mal etiquetadas y los chips que faltaban- El índice de navegación y el índice de búsqueda compartido ahora cubren toda la superficie de la DLL tanto para llamadores Unicode como ANSI
Fixed
- Se ha eliminado la entrada obsoleta
SetLogger, que no tenía ningún símbolo coincidente en el código fuente; la propiedad documentada esLogger
Version 3.296.0
Added
AddAlternateImage,AlternateImageCount,GetAlternateImageInfoyRemoveAlternateImageproporcionan creación e inspección tipadas de las variantes de imagen de visualización e impresión- Las imágenes alternativas pueden asociarse a un grupo de contenido opcional o a un diccionario de pertenencia, mientras que una variante por imagen base puede seleccionarse como valor predeterminado de impresión
Changed
- El renderizador integrado selecciona ahora las imágenes alternativas de contenido opcional cuando una imagen base está oculta y respeta el valor predeterminado de impresión en los destinos de impresora
FindImagesregistra ahora los XObjects de imagen alternativa accesibles desde los recursos de página para que las variantes importadas reciban manejadores de imagen utilizables
Version 3.295.0
Added
AddArticleThreadcrea una navegación de artículos conforme a los estándares con metadatos tipados, rectángulos de página ordenados, enlaces circulares de cuentas y matrices de cuentas por páginaArticleThreadCount,GetArticleThreadInfoyGetArticleThreadBeadinspeccionan hilos de artículo creados o importados con un recorrido limitado de los ciclos de enlaces dañados
Changed
DeletePageselimina ahora los hilos de artículo que pierden todas las cuentas y repara los enlaces circulares de los hilos supervivientes- El seguimiento de páginas eliminadas conserva ahora referencias de página indirectas estables para que la limpieza de outline y artículos no pueda desviarse al moverse el cursor del árbol de páginas
Version 3.294.0
Added
SearchTextBatchbusca múltiples consultas de texto mientras cada extracción de página está residente y devuelve el índice de consulta de origen en base cero con cada coincidenciaSearchTextBatchEachproporciona la misma búsqueda en una sola pasada mediante una devolución de llamada de streaming con informe de progreso y cancelación
Changed
- La búsqueda de texto de consulta única y por lote comparten ahora un único núcleo de coincidencia, preservando la semántica de mayúsculas/minúsculas, palabra completa y rango de páginas al tiempo que se evita la extracción repetida de páginas, el plegado de texto y el trabajo de geometría de coincidencias
Version 3.293.1
Fixed
- La rasterización del sombreado de malla ya no falla al compilar en ninguna versión de Delphi, resolviendo
E2089 Invalid typecasten las conversiones de real a coma flotante en el painter de GDI+ - El renderizado paralelo de páginas por lote compila ahora en Delphi XE5 y XE6, donde
System.Threadingno está disponible; las cadenas de herramientas más antiguas recurren a la ruta de renderizado serie como en sistemas no Windows - La detección de capacidades de la impresora ya no genera un error de tipos incompatibles en versiones heredadas de Delphi alineando la llamada
SetPrintercon el resto del código de impresión - La enumeración del almacén de certificados se compila ahora en RAD Studio 10.3 Rio, que anteriormente abortaba con un error interno del compilador al optimizar la rutina de enumeración
Version 3.293.0
Added
- Los diccionarios de pertenencia de contenido opcional pueden ahora crearse, actualizarse y enumerarse con las políticas de compatibilidad
AnyOn,AllOn,AnyOffyAllOff - Las expresiones de visibilidad
/VEanidadas de PDF 1.6 admitenAnd,OryNotmediante una representación prefija compacta compartida por Delphi y C++Builder
Changed
- Los ámbitos de contenido opcional, los flujos de contenido, las páginas capturadas, las imágenes, los campos de formulario y las anotaciones aceptan ahora ya sea un manejador de grupo o un manejador de pertenencia
- El renderizado evalúa primero las expresiones
/VEválidas y recurre a/OCGsmás/Ppara las expresiones mal formadas o no admitidas
Fixed
- El contenido opcional anidado ya no puede hacer visible el contenido cuando un grupo o pertenencia contenedor está oculto
- Los diccionarios de pertenencia sin grupos de contenido opcional efectivos dejan ahora la visibilidad sin cambios según lo exigido por la especificación PDF
Version 3.292.0
Added
EnumAttachmentsinforma ahora de las fechas de creación y modificación, las sumas de comprobación hexadecimales, las relaciones de archivos asociados y los números de objeto de especificación de archivo tanto para los adjuntos de documento como de anotaciónValidateAttachmentChecksumverifica bajo demanda una carga útil de adjunto frente a su suma de comprobación almacenada, mientras que los archivos incrustados nuevos reciben ahora automáticamente metadatos de suma de comprobación
Fixed
SetEmbeddedFileAFRelationshipacepta ahora los mismos índices de archivos incrustados en base 1 que el resto de la API de adjuntos, incluidos los documentos con un solo adjunto
Version 3.291.0
Added
DeduplicateResourcesconsolida ahora los flujos duplicados exactos de imagen, Form, patrón, sombreado, función, perfil ICC, programa de fuente, CMap, CharProc Type 3, archivo incrustado, metadatos y PostScript en todo un documento cargado- La desduplicación de recursos proporciona indicadores de tipo independientes, análisis en seco, recolección opcional de huérfanos y estadísticas detalladas de hash, comparación, carga útil, referencia y por categoría
Changed
- La detección de duplicados canoniza los diccionarios de flujo completos con independencia del orden de claves, aplica hash a cada carga útil candidata una vez con SHA-256 y confirma los cubos coincidentes byte a byte antes de redirigir las referencias
- Los grupos de equivalencia exacta conservan el número y la generación de objeto más bajos para una salida determinista, mientras que los ciclos de objetos directos mal formados y las diferencias semánticas de diccionario permanecen sin fusionar
Version 3.290.0
Changed
PurgeUnusedResourcescalcula ahora un cierre de dependencia transitiva sobre patrones de teselado, glifos Type 3, estados de apariencia de anotación, grupos de máscara suave de ExtGState, imágenes, sombreados y espacios de color anidados- Las opciones de limpieza predeterminadas habilitan ahora el análisis de dependencias de patrón, Type 3, apariencia, máscara suave e imagen, con indicadores independientes para los llamadores que necesitan un análisis más restringido
- Los programas de contenido anidados y las entradas de dependencia se almacenan en caché, los ámbitos de recursos compartidos se privatizan antes de la poda y los ciclos mal formados están limitados por guardianes de flujo activo y de profundidad
Fixed
- Los recursos de página utilizados solo a través de espacios de color de imagen, bases Indexed, alternativas de Separation o DeviceN, espacios subyacentes de Pattern, alternativas ICCBased o diccionarios de sombreado ya no se eliminan como no utilizados
- Los recursos utilizados solo por CharProc Type 3, celdas de patrón de teselado, apariencias de anotación o grupos de máscara suave de transparencia ya no se eliminan de su propio ámbito o heredado
Version 3.289.0
Added
PurgeUnusedResourceselimina ahora los recursos de página con nombre que no están referenciados por las capas de contenido seleccionadas y puede devolver estadísticas detalladas por categoría- La limpieza de recursos admite ahora rangos de páginas, informe en seco, progreso y cancelación, análisis recursivo de Form XObject, eliminación de ProcSet obsoletos y recolección opcional de objetos huérfanos
Changed
- El análisis de recursos sigue ahora la distinción entre mayúsculas y minúsculas de los nombres PDF, los recursos de Form heredados, los espacios de color de imagen en línea personalizados y las siete categorías de recursos estándar
- Los programas de Form repetidos se almacenan en caché, los conjuntos de recursos utilizados emplean búsqueda ordenada y las entradas de diccionario se eliminan en orden descendente para un rendimiento predecible en documentos grandes
Fixed
- La eliminación de entradas de diccionario invalida ahora los índices de claves de diccionarios grandes para que las búsquedas posteriores no puedan devolver entradas obsoletas
- Los flujos mal formados y los operadores desconocidos preservan por defecto su ámbito de recursos completo, mientras que los diccionarios de recursos compartidos o heredados se clonan antes de la mutación
Version 3.288.0
Added
- Las firmas digitales pueden ahora emitir estructuras completas de certificación DocMDP y de bloqueo de campos FieldMDP, con informes de permisos estructurales para cada firma seleccionada
- Las marcas de tiempo de documento RFC 3161, las marcas de tiempo de firma, la inyección de tokens PAdES-B-T, la validación de cadena de certificados, la evidencia OCSP y el material de validación DSS o VRI disponen ahora de flujos de trabajo completos de creación y verificación
- Las anotaciones RichMedia admiten ahora recursos incrustados, ajustes de activación y desactivación, apariencias de póster, enumeración, extracción y eliminación
- La impresión de póster admite ahora la imposición vectorial de páginas, las marcas de solapamiento y de corte, la colocación consciente de los márgenes físicos y los planes de teselado reutilizables
- Las tablas etiquetadas emiten ahora estructura semántica de Table, TR, TH y TD con identificadores estables, asociaciones de encabezado, spans, encabezados repetidos y decoración convertida en artefactos
- El visor proporciona ahora edición de AcroForm accesible mediante teclado para campos de texto, elección, casilla de verificación, radio y botón mientras despacha acciones a la aplicación host
Changed
- Los sombreados de malla basados en función Type 1 y de Type 4 a 7 se renderizan ahora mediante evaluación de función nativa y teselado de malla limitado
- El renderizado de color ICCBased comparte ahora las transformaciones en caché entre imágenes y sombreados preservando el comportamiento del espacio de color calibrado
- Los guardados incrementales reconstruyen ahora los flujos de objetos y los flujos de referencias cruzadas de forma consistente, y las firmas seleccionadas se verifican frente a su propia revisión firmada
Fixed
- Las solicitudes de marca de tiempo de firma SHA-1 aplican ahora el hash al valor de firma del firmante con SHA-1 en lugar de recurrir a SHA-256
- Los reemplazos de bloqueo de campo rechazados ya no descartan una configuración de bloqueo de campo previamente válida
- Los widgets de radio con nombres de estado de apariencia duplicados preservan ahora el widget seleccionado y mantienen apagados a los widgets hermanos
Version 3.287.0
Changed
- Los diccionarios de imagen en línea siguen ahora los límites de comentario, delimitador, literal, hexadecimal, matriz y diccionario de PDF con anidamiento limitado
- Las cargas útiles de imagen en línea usan ahora la terminación consciente del formato para datos raw, DCT, ASCII85, ASCIIHex, RunLength y Flate
- El descubrimiento de carga útil Flate realiza ahora una descompresión limitada desde el desplazamiento del flujo de contenido con contabilización exacta de bytes comprimidos, mientras que los filtros sin pérdida encadenados comparten un techo de salida de extremo a extremo
- Los flujos ASCII85, ASCIIHex, LZW, de predictor, de perfil de color y de imagen auxiliar aplican ahora una salida intermedia limitada sin asignaciones temporales sobredimensionadas
Fixed
- Las imágenes en línea mal formadas o truncadas ya no leen más allá de los datos de origen, no entran en bucle sobre valores no terminados ni conservan estado obsoleto al reutilizar el decodificador
- Las filas de imagen empaquetada calculan ahora los bits de componente antes del redondeo de bytes, evitando longitudes incorrectas para imágenes RGB de pocos bits y de varias filas
- Los espacios de color de recursos preservan ahora sus nombres originales mientras derivan los recuentos de componentes Lab, ICCBased indirectos y DeviceN y decodifican los flujos de paleta Indexed bajo límites estrictos
- Los límites de imagen en línea rechazan ahora de forma consistente las dimensiones no válidas, las profundidades de bit, los filtros no admitidos, las cadenas de filtros no seguras, los flujos comprimidos y los marcadores de fin ambiguos
- El renderizado de color Indexed valida ahora cada acceso a la paleta y rechaza los datos de búsqueda truncados en lugar de leer más allá de la tabla decodificada
- Los predictores PNG de 10 a 15 se decodifican ahora correctamente para los flujos Flate y LZW, rechazan los filtros de fila no válidos y validan todos los tamaños de fila y de estado antes de la asignación
- Las cargas útiles JPEG y JPEG 2000 verifican ahora sus dimensiones codificadas, componentes, precisión, estructura de marcadores, longitudes de caja y huella de almacenamiento decodificado antes de la asignación de imagen
- La validación de imagen en línea limita ahora tanto el almacenamiento de mapa de bits empaquetado como expandido y acota los perfiles ICC, los globales de JBIG2 y los parámetros de filtro terminal
- Las cargas útiles de filtro binario que contienen texto de marcador de fin incrustado continúan ahora hasta el primer candidato que pasa la validación de formato limitada
Version 3.286.0
Changed
- Content stream tokenization now follows PDF whitespace, comment, delimiter, literal string, hexadecimal string, and name boundaries
- Text splitting and resource replacement now use geometrically grown output buffers for linear processing of large content streams
- Reusable content stream processors now reset derived output and parser state before every
Processcall
Fixed
- Malformed or truncated literal and hexadecimal strings no longer read beyond the source buffer or emit an extra empty token
- Resource replacement now preserves case-sensitive PDF name semantics, accepts optional leading slashes, and updates duplicate mappings deterministically
- XObject and shading operands at the beginning of a stream are now excluded from text output, while unmatched restore operators no longer cancel later saved graphics states
Version 3.285.0
Changed
- LZW encoding now uses constant-time dictionary lookup and buffered stream writes, while decoding uses compact prefix and suffix tables with geometric output growth
- Flate predictor decoding now processes rows directly in the output buffer and supports packed, 8-bit, and 16-bit TIFF samples with arbitrary colour counts
- Stored Deflate streams now write into an exact pre-sized result, and zlib wrappers release temporary buffers safely when compression or decompression fails
Fixed
- LZW code-width changes now follow PDF
EarlyChangesemantics across 9-bit through 12-bit codes, including dictionary resets andEarlyChange=0 - LZW decoding now rejects invalid future codes and truncated bit streams without reading beyond the source buffer
- PNG predictors now use the ceiling byte width of a pixel, preserve previous decoded rows, and safely pad a partial final row
- TIFF predictor decoding now handles 1-bit, 2-bit, 4-bit, 8-bit, and 16-bit components consistently in both LZW and Flate paths
Version 3.284.0
Changed
- Buffer searches now scan fixed 64 KiB blocks, use byte lookup tables for set membership, and preserve the caller's position across every search path
- Unicode, Latin-1, hexadecimal digest, and ARC4 conversions now reserve bounded output once instead of repeatedly growing strings or temporary arrays
- ASCII85 encoding now reads input streams in 32 KiB blocks, while decoding uses exact integer arithmetic and writes directly into a pre-sized output buffer
- MD5 string hashing now avoids a temporary memory stream, digest comparison examines every byte, and ARC4 key scheduling no longer allocates an expanded key array
Fixed
DistanceToAnyBytenow returns the correct offset beyond its first block instead of rereading the same prefix and overcounting skipped bytes- Stream-backed buffer reads now honour the actual byte count returned by custom streams, shrinking results and advancing positions only by bytes received
- Buffer length reductions now clamp the current position, and nil pointer or stream sources behave as empty inputs instead of exposing invalid memory
- Latin-1 decoding now maps the complete byte range 0x00-0xFF instead of replacing bytes 0x7F-0xFF
- ASCII85 decoding now preserves the valid maximum 32-bit group
s8W-!and stops at the first end marker without floating-point boundary loss
Version 3.283.0
Added
TPDFlibSignatureVerifiercan now enumerate signature fields and CMS signers, open files, streams, or strings, and verify a selected field and signer by index or field name- Detailed verification reports now separate cryptographic integrity from signed-revision coverage, current-file coverage, later revisions, strict Contents-gap validation, and native crypto errors
Changed
- Detached CMS validation now streams both ByteRange segments through Windows CryptoAPI in bounded chunks instead of materialising the complete PDF in memory
- Signature fields under nested AcroForm Kids arrays and inherited
/FT /Sigentries are now enumerated with fully qualified names, and direct signature value dictionaries are supported
Fixed
- ByteRange validation now rejects overflow, overlap, truncation, a gap that is not exactly the selected hexadecimal
/Contentstoken, and a signed revision that does not end at its own%%EOF - Certificate lookup no longer falls back to an unrelated embedded certificate when the selected CMS signer identifier has no exact issuer-and-serial match
- Incremental updates that use cross-reference streams now include the cross-reference stream object's own type 1 entry, preventing strict PDF validators from reporting a missing self entry after signing
Version 3.282.1
Changed
- Full saves now rebuild imported object streams from the live object graph, preserve private trailer roots, and retain free-object generations without reusing structural object numbers
- Cross-reference streams now size their offset fields for large files, preallocate their payload, include their own entry, and preserve trailer extension keys
Fixed
- Object-stream packing now writes real
/ObjStmcontainers and type 2 member entries instead of only switching to an xref stream - Garbage collection no longer writes missing object numbers as in-use entries at offset zero and now emits a linked free-object chain in both plaintext and stream cross-references
- Loaded packed PDFs can now be saved repeatedly with packing enabled or disabled without retaining stale object streams, losing live members, or requiring cross-reference repair
Version 3.282.0
Added
- Imported ICCBased colours now use the embedded ICC profile across vector painting, function and mesh shadings, indexed palettes, raw bitmap, CCITT and JBIG2 images, CMYK JPEG images, and JPEG 2000 images
Changed
- ICC transforms now use a bounded Windows Color System lookup table with multilinear interpolation, replacing the temporary PNG round trip used during image rendering
- The renderer now honours content-stream and graphics-state rendering intents, ICCBased
/Range, image/Decode, and original-domain colour-key masks while validating profile channel counts against the PDF colour-space dictionary - Repeated uses of the same profile and rendering intent now share one lookup table across vector colours, patterns, shadings, and images
Fixed
- Encrypted ICC profile streams are now decrypted only while decoded and restored afterward, and embedded profiles are no longer compressed twice while writing image output
Version 3.281.0
Added
- The built-in GDI+ renderer now paints imported PDF function-based shadings and free-form, lattice, Coons, and tensor mesh shadings (types 1 and 4-7), including transparency and clipping
- Shading dictionaries now support component Function arrays, calibrated Lab, CalGray, and CalRGB spaces, Separation and DeviceN tint transforms, PatternType 2 Background fills, and BBox clipping across the GDI+ and Cairo renderers
Changed
- Type 1 shading functions now use bounded adaptive colour sampling with additional quarter-cell probes for higher narrow-feature accuracy and lower work on constant or smooth regions
- PatternType 2 matrices around mesh shadings are now composed exactly once in both GDI+ and Cairo, preserving translated, scaled, and rotated pattern placement
- Mesh colour components are now interpolated in their source colour space before Function evaluation and conversion to RGB, preserving nonlinear functions, DeviceCMYK gradients, and the correct ordering for managed colour transforms
- Coons and tensor surfaces now use bounded device-pixel error subdivision for smoother high-curvature output at large render sizes
- Encrypted shading and Function streams are decoded through the document crypt callbacks, and Type 5 vertex records honour their required byte alignment
Version 3.280.1
Fixed
MergeFileList/MergeFileListFast/MergeFileListStrictleaked aTSmartPDFReader/TSmartPDFDocumentpair (and everything they own) when a non-PDF file appeared in the merge list: the reader and document were constructed before thetryblock that frees them, so a parse failure on the malformed file's content orphaned the already-constructed reader instead of being cleaned up by the surrounding exception handler; construction now happens inside the protectingtryin both the single-file and multi-file prescan paths- Mesh shading parsing (
TPLMeshShading.Parse, shading types 1 and 4-7) leaked the decoded/Functionobject on every parse - every early-exit path and the normal completion skipped freeing it; the function is now released in afinallyblock regardless of howParseexits TPDFlibSignDoc.Closenow nils its smart-reader/document/info fields after freeing them, and the exception paths inOpen,OpenStreamandOpenStringnow release any partially-constructed smart objects instead of only clearing the stream reference, preventing a leak when opening a signing target fails partway through
Version 3.280.0
Added
- Error category enumeration
TPDFlibErrorCategory(ecSuccess/ecStructure/ecSave/ecCrypto/ecGeneric/ecCompliance/ecAcroForm) layered on top of the existing numericLastErrorCodetaxonomy, so callers can classify failures without memorising code ranges; exposed viaTPDFlib.LastErrorCategory,TPDFlib.ErrorCategory(Code)andTPDFlib.ErrorMessage(Code) - Form-field error codes 701-704 (field not found, field read-only, no AcroForm, invalid value) with human-readable messages, letting callers distinguish "field is locked" from "no such field" instead of receiving a single generic failure
SetFormFieldValueForcedforce-write variant that bypasses the read-only guard, used internally bySetFormValues(SkipReadOnly=False)so bulk imports can still overwrite locked fields when the caller explicitly opts out
Changed
SetFormFieldValuenow setsLastErrorCodeto 701/702/703 on failure (field not found / read-only / no AcroForm) instead of returning 0 silently;LastErrorCategoryis a non-consuming read so callers can inspect the category before retrieving the numeric code
Version 3.279.0
Added
ReplacePageRangesreplaces visual page content from another open document without changing the target page count or target page object identities, preserving bookmarks, links, annotations, and form widgets already attached to those pages
Changed
- Cross-document page copying no longer creates and removes an extra placeholder page before importing the requested range
Version 3.278.0
Added
PrintPagesAdvancedapplies copies, collation, duplex, orientation, color, quality, paper-size and input-bin settings to arbitraryPrintPagesrange expressions while retaining one printer profile and one print job
Changed
- Advanced print settings are validated before the job starts, positive print-quality values above the four named presets are applied as DPI, and paper or input-bin identifiers may use the full positive range supported by the corresponding
DEVMODEfields
Fixed
- Damaged cross-reference recovery now dispatches its bounded block reads through the traditional
TStream.Readoverride on Win64, preserving instrumentation and custom-stream behavior while retaining 64 KiB sequential I/O
Version 3.277.0
Changed
- Damaged cross-reference recovery now scans source data in 64 KiB sequential blocks instead of seeking once for every matching character, keeping auxiliary memory bounded while scaling to large PDF files and non-memory streams
- Recovery validates complete indirect-object tokens, skips object-like data inside comments, strings, and streams, confirms stream endings with a following
endobjtoken, preserves headers split across read boundaries, and selects the last valid trailer dictionary
Fixed
- Trailer reconstruction now supports nested dictionaries and delimiter text inside literal strings and is no longer truncated to the first 2048 bytes or the first apparent
>>pair
Version 3.276.0
Added
ActivateWebLinksandActivateWebLinksExscan existing page text once per page and create non-duplicate URI link annotations for HTTP, HTTPS,www., FTP,mailto:, and bare email targets with selectable detection and border options- Generated links use matched-character geometry, precise quadrilaterals for rotated or skewed text when permitted, PDF/A print flags, progress and cancellation support, and selected-page restoration; tagged PDF and PDF/UA documents are protected from incomplete structure-tree updates
Changed
SetAutoCreateWebLinksnow uses the same boundary-aware detector and target normalization when creating links for newly drawn text, addingwww., FTP, and bare email support
Fixed
- Updating annotation
/Contents, name, date, title, or subject properties no longer overwrites the subtype of an existing action dictionary, so URI and other actions remain valid after annotation metadata changes
Version 3.275.0
Added
ExtractPageRangeText,SavePageRangeTextToStream, andSavePageRangeTextToFileextract a parsed page range in one traversal with caller-defined page separators; stream and file output writes UTF-8 data incrementally so large documents do not require a complete document-sized text bufferSetPageBoxRangeandRemovePageBoxRangeapply page-boundary changes across the standard page-range syntax while preserving the caller's selected pageSetPageTransitionRangeandSetPageTransitionRangeExapply legacy or extended presentation transitions to page ranges with per-page progress and cancellation supportGeneratePageThumbnailsrenders requested pages directly into reusable memory and attaches their/Thumbimages without intermediate files or nested progress operations
Version 3.274.0
Fixed
- GDI+ rendering of axial shading patterns now honours the PDF
/Extendarray:SetupGDIPlusPatternpassesWrapModeClampwhen either end is extended (matching the Cairo backend) instead of always usingWrapModeTile, so end colours paint the area outside the gradient axis correctly
Added
- The scroll-hint bubble (
"Page N / M") shown while dragging the vertical scrollbar now auto-hides after 3 seconds of inactivity via aWM_TIMERhandler, so it no longer lingers until a separate scroll event dismisses it ZoomInStep/ZoomOutStepnow snap ontoActualSize(100%),FitWidthandFitPagepercentages when they fall between the current zoom and the next preset on the 14-step ladder, matching the behaviour of professional PDF viewers- The viewer disk page cache writes a build-version marker (
cache.version) and wipes the whole cache root when the library version changes, so a build upgrade never reuses stale bitmaps rendered by an older code path
Version 3.273.1
Fixed
- Object-stream container and xref-stream objects created during save were leaked because they bypassed
TPDFStructure.AddObjectregistration; both call sites now use theNewStreamWithDictownership-tracking factory, eliminating theTPDFStreamleak reported by the test runner underReportMemoryLeaksOnShutdown - Cross-reference stream
/Sizewas off by one: it must be one past the highest object number in the whole file, and the xref stream is itself an indirect object numberedMaxObj+1, so/Sizeis nowMaxObj+2
Changed
- Peephole content-stream optimiser now also removes identity text-matrix operators (
1 0 0 1 0 0 Tm), covering bothcmandTmwith the same six-operand identity check - Mark-sweep GC preserves object 1 (the
/Linearizedparameter dictionary) when the source document was loaded linearized, since that dictionary is never referenced from/Rootbut must survive
Version 3.273.0
Added
- Object-stream packing on save (
TPDFDocument.PackObjectsIntoStreams) collects eligible non-stream indirect objects, serialises them into PDF 1.5 object streams (/Type /ObjStm) with Flate compression, and emits a binary cross-reference stream (/Type /XRef) carrying type-0, type-1 and type-2 entries, reducing the size of saved files 10-40% on object-dense documents TPDFlibSaveOptions.PackObjectStreamsflag plusTPDFlib.SetPackObjectStreams/GetPackObjectStreamsAPI; defaults to enabled, auto-gated by PDF version (1.5+ activates packing and xref streams, 1.4 and below keep the traditional plaintext xref for compatibility), andTPDFlib.GetLastSaveUsedObjectStreamsreports whether the last save actually packed
Version 3.272.0
Added
- Mark-sweep garbage collection of unreferenced indirect objects (
TPDFDocument.GarbageCollectUnusedObjects) walks the object graph from the trailer roots (/Root,/Info,/Encrypt) and removes every indirect object that is not reachable, stopping the file-size growth that accumulates when pages are deleted and their font, content and XObject resources become orphans TPDFlibSaveOptions.GarbageCollectflag plusTPDFlib.SetGarbageCollect/GetGarbageCollectAPI let callers opt in to GC during a full save (defaults to off for backward compatibility), andTPDFlib.GarbageCollectObjectsruns GC immediately and returns the number of orphaned objects removed
Version 3.271.0
Added
- Peephole content-stream optimiser (
TPDFContentPeepholeOptimizer) rewrites a parsed page content stream before Flate compression, removing semantically redundant PDF operators: identitycmmatrices, emptyq/Qpairs, emptyBT/ETobjects, no-op paths terminated bynwith no clip, duplicate graphics-state setters (colour, line width, cap/join, dash, text state), and deadnafter a painting operator - all transforms are output-equivalent so visible page output is unchanged TPDFlibSaveOptions.OptimizeContentStreamsflag and matchingTPDFlib.SetOptimizeContentStreams/GetOptimizeContentStreamsAPI let callers opt in or out of the peephole rewrite duringCompressContent/CompressPage; enabled by default
Changed
TPDFDocument.CompressPagenow forwards the optimisation flag to the page tree so the peephole pass runs insideTPDFPageTree.Compressbefore the existing Flate compression, stacking operator-level reduction on top of byte-level compression
Version 3.270.0
Added
- New
PLParseDefaultAppearancedecodes a/DAdefault-appearance byte string (ISO 32000-2 12.7.4.3) into the font resource name, font size and fill colour, covering therg,kandGcolour operators so form-field and annotation appearance generators can paint text with the author-intended styling
Changed
- Page content-stream assembly (
TPDFRenderer.GetContents) now concatenates multi-part/Contentsarrays through aTStringBuilderinstead of repeatedResult := Result + chunk, removing the O(n^2) string growth that penalised pages with many content-stream parts
Version 3.269.0
Added
- New
BeginMarkedContent/EndMarkedContentwrite inline marked-content sequences with accessibility properties (/Alt,/ActualText,/Lang,/E) directly in the BDC property list per ISO 32000-2 14.9.2–14.9.5, so screen readers and accessibility tooling can read substitute text without a structure-tree entry - Annotation reader exposes
GetAnnotEffectiveBorderimplementing the Errata #287 precedence (border style dict/BSwins over the legacy/Borderarray) and resolving width, style and dash pattern into one call - Signature documents expose
GetSignatureSeedValueto read the seed-value dictionary (/SV, ISO 32000-2 12.7.5.5 Tables 236–237): required filter, allowed SubFilters and allowed digest methods, so a signer can honour the constraints the author embedded GetSignatureFieldLockreads the/LockFieldMDP seed dictionary (Table 238): action (/All,/Include,/Exclude) and the affected field names that must be locked at sign time
Version 3.268.0
Added
- New
PLParsePDFDateparses ISO 32000-2 7.9.4 date strings (D:YYYYMMDDHHmmSSOHH'mm') into a localTDateTime, honouring the mandatoryD:prefix, the field-dependency ladder (each field only when all preceding fields are present) and the UT offset (+/-/Zwith optional apostrophe-minute), returning the local equivalent of the documented instant - Text-string decoding (
PLDecodeTextString) now recognises the PDF 2.0 UTF-8 BOM (EF BB BF) per 7.9.2.2.1, so UTF-8-authored metadata decodes correctly instead of being misread as PDFDocEncoding - File specifications expose
GetFileNamehonouring the PDF 2.0 precedence (Path > UF > F) per Errata #444, plusGetEmbeddedFileStreamandGetRelatedFilesaccessors for the/EFand/RFdictionaries - Annotation readers expose appearance-precedence helpers
GetAnnotNormalAppearance,GetAnnotDefaultAppearanceandGetAnnotOffStateAppearanceimplementing the Errata #23/#34/#42/#170 rules (AP/N is authoritative; DA is the byte-string fallback; Off state lives under the nameOff) - PDF/UA validation reports a new code 10045 when a non-standard structure type fails to terminate at a standard type through the role-map chain (ISO 14289-1:2014 7.1), with cycle protection to a depth of 8
- PDF/A and PDF/UA font audits now validate that embedded CIDFontType2 fonts carry a
/CIDToGIDMapwhose value is either the nameIdentityor a stream, not merely present (ISO 32000-1 9.7.4)
Changed
- Name-tree lookup (
NameTreeLookup) now binary-searches the sortedNamesarray per ISO 32000-2 7.9.6 before falling back to a linear scan, turning large EmbeddedFiles/JavaScript/Dests lookups from O(n) into O(log n) on conformant files - PDF/UA standard-structure-type set expanded with PDF 2.0 additions (
Artifact,DocumentFragment,FENote,MarkedContent,Title) so the role-map no-remap and chain-termination checks recognise the full tag vocabulary
Version 3.267.0
Added
EnumPageContentStatesExcan recursively enumerate Form XObject instructions with configurable depth, cycle protection and depth-first execution ordering- Content snapshots now expose invocation-tree identity, containing stream and parent XObject information, resource-scope identity, Form traversal status and descendant counts
- Standalone content trackers can register scoped fonts and initialise isolated Form execution state with matrix concatenation and bounding-box clipping
Changed
- Recursive content tracing selects each Form resource dictionary independently, inherits invoking resources for compatible legacy Forms, preserves inherited font identity and caches decoded Form programs across repeated invocations
Version 3.266.0
Added
- Text runs returned by
GetTextRunsnow carry the glyph origin (OriginX/OriginY) and the full text matrix components (Tm11/Tm12/Tm21/Tm22/TmDX/TmDY) captured by replaying BT, Td, TD, Tm and T* alongside the show operators, so consumers can locate glyphs without a separate text-funnel pass - Mesh shading decoding now routes Lab, CalRGB and CalGray colour spaces through the colour manager instead of falling through to black, producing correct fills for non-DeviceRGB free-form and coons patches
- Redaction now emits a real
/Subtype /Redactannotation with/Rect,/ICinterior colour and optional overlay text alongside the existing content removal, so redaction-aware viewers mark the sanitized region - Library operations emit structured log records at load and save boundaries through the previously dormant
Logger, with ISO-8601 UTC timestamps and a cachedTStreamWriterfile sink that no longer reopens the log file on every line - New
Tests.Memoryfixture guards create/draw/save/free andNewDocumentcycles against heap regression, and the console test runner now enablesReportMemoryLeaksOnShutdown - EMF interpretation now counts unknown or private records via the
UnknownRecordCountproperty so silent metafile gaps are observable
Changed
- Dictionary key lookup (
TPDFDictionary.FindIndexByKeyName) builds a lazy open-addressing hash index for dictionaries with more than 16 entries, turning the linear scan that dominated renderer Resources/ColorSpace/Font/ExtGState lookups into an O(1) probe - sRGB gamma conversion (
XYZ2RGB) uses a shared 4096-entry lookup table instead of threePower(x, 1/2.4)calls per pixel, and Lab-to-XYZ cubing now uses direct multiplies; both are the dominant per-pixel cost when decoding Lab or ICC-based images - Page lookup (
TPDFPageTree.GetPage) returns the cached page dictionary on repeat access instead of re-walking the page tree every call - Content-stream operator dispatch (
ContentOperatorFromName) buckets the 73 operators by first byte, cutting the per-token linear scan to a short residual compare - PDF/A colour-space audit now recurses into the base or alternate space of Indexed, Separation, DeviceN and ICCBased up to a depth of 8, so a hidden DeviceCMYK tint transform or bare Lab name is flagged rather than passing silently
- Shaped-font finalize now walks the used-glyph set recorded at draw time instead of scanning all 65536 glyph slots four times per save
- String escape routines (literal-string, XFDF, stamp and variable token expansion) build output through
TStringBuilderor two-pass allocation, removing O(n^2) concatenation from save and form-export hot paths - AES stream encrypt/decrypt reuse their chunk buffer across loop iterations instead of reallocating per block
- Composite-glyph parsing in the TrueType parser grows the components array geometrically instead of one element at a time
- Mesh shading
ReadBitsreads the minimum covering bytes in one pass andWriteBitspre-sizes the output buffer, eliminating per-bit reallocation - Painter circle control point uses a precomputed kappa constant and arc squaring uses
Sqrinstead ofPower
Fixed
- Fixed a non-Windows compile break in
PDFlibParallelwhere the stub body signature forPDFlibRenderPagesParalleldid not match the interface declaration
Version 3.265.0
Added
- Added 59 C++Builder console demos to align the C++Builder demo suite with Delphi, bringing the total from 33 to 92 demos covering the same API surfaces
- Added Demo/C++Builder/index.html expansion from 35 to 92 entries with Navigation, Color & ICC, Barcode & media, and Structure & compliance sections
Fixed
- Fixed all 33 existing C++Builder cbproj files that were missing 20 library units (PDFlibMeshShading, PDFlibGraphics, PDFlibWindows, PDFlibParallel, PDFlibLogger, PDFlibMail, PDFlibViewer, etc) from their DelphiCompile list, which prevented every C++Builder demo from compiling
Version 3.264.0
Added
- Content graphics-state snapshots now resolve
Dooperands as image, form or PostScript XObjects and report their resource names, object numbers and transformed bounds - Form snapshots expose the original
/Matrixand/BBoxtogether with resource, group, transparency-group and reference-form indicators - Standalone content trackers can pre-register XObject streams through
RegisterXObject
Changed
- Page content-state enumeration now precompiles selected-page XObject resources and calculates invocation bounds from all four transformed corners
Version 3.263.0
Added
- Content graphics-state snapshots now expose current path bounds, current point, path complexity, pending clipping rules and effective clipping bounds
- Standalone content trackers can initialise an explicit clipping boundary through
SetInitialClipBounds
Changed
- Page content-state enumeration now follows delayed
WandW*clipping, exact transformed cubic extrema,q/Qclipping restoration and selected-pageCropBoxboundaries
Version 3.262.0
Added
- Content graphics-state snapshots now report font writing mode, exact per-instruction text displacement and whether font metrics were resolved
- Standalone content trackers can provide font measurements through
OnMeasureText
Changed
- Page content-state enumeration now advances text matrices for
Tj,TJ,'and"using simple or composite font metrics, horizontal scaling, spacing and vertical writing rules
Version 3.261.0
Added
- Content graphics-state tracing can now resolve page
ExtGStateresources, including transparency, blending, overprint, soft masks, device controls and embedded font references TPDFContentStateTrackercan pre-register external graphics-state dictionaries for standalone content-program analysis
Changed
- External graphics-state parameters now apply cumulatively and participate in complete
q/Qsave and restore snapshots
Version 3.260.0
Added
- Added single-pass effective graphics-state tracing for structured content programs and complete selected pages
- Snapshots expose CTM, text matrices, line style, dash pattern, colours, text state and graphics-state stack depth before or after each instruction
Changed
- Image placement enumeration now maps all four unit-square corners, producing correct bounds under rotation and shear
Version 3.259.0
Added
- Added typed time, special-pattern and arbitrary-mask helpers for interactive form fields
- Added range validation with independently optional zero-safe bounds
- Added sum, average, product, minimum and maximum field calculations with automatic calculation-order registration
Security
- Generated JavaScript string values now escape quotes, backslashes, control characters and JavaScript line separators
Version 3.258.0
Added
- Added typed
SetOCGStateaction creation for form-field events, existing actions and action chains - Optional-content actions preserve left-to-right state changes, repeated groups and the optional radio-button relationship preference
Changed
- Optional-content action enumeration now returns canonical group handles that round-trip through the writer APIs
Version 3.257.0
Added
- Added complete explicit remote-destination writing with zero-based pages, all standard fit types, nullable XYZ values and tri-state window preferences
- Added complete launch-action writing for portable files, Windows parameters, default directories and open or print operations
- Existing action handles can now update these payloads or append them to action chains without container-specific duplicate APIs
Security
- Remote go-to and launch action builders now reject PDF/A mode before modifying an action chain
Version 3.256.0
Added
- Remote go-to action inspection now reports named and explicit destinations, zero-based target pages, fit types, coordinates and zoom values
- Launch action inspection now reports Windows application parameters, default directories and open or print operations
- Action information distinguishes an absent
/NewWindowpreference from an explicit false value and identifies array-based targets
Version 3.255.0
Added
- Added typed builders for remote named-destination and external application launch actions
- URI action builders now support coordinate-map requests through the standard
/IsMapflag - The new action kinds work across lifecycle, form-field and chained-action APIs through the existing extended builder interface
Version 3.254.0
Added
- Added 14 Delphi API-coverage demos for library surfaces that had no dedicated demo: OutlineBuilder, NamedDestinations, DocumentActions, EmbeddedFiles, LinearizeDemo, BarcodeGallery, XfaFields, TaggedPDF, OutputIntent, HtmlTextFlow, RichMediaAnnotations, MailSendDemo, TextBlockExtraction, and PadesDssDemo
- Added a Navigation section, Color & ICC section, Barcode & media section, and Structure & compliance section to the Delphi demo index, bringing the total from 56 to 92 listed demos
- Added Readme.en-us.html guides for the 20 demos that previously shipped without one
Changed
- Applied the project Formatter.config across all Delphi demo sources so operator spacing, indentation, and keyword casing follow one style, and set NewLineBeforeThen to False so If...Then stays on a single line
- Hardened error handling across the classic GUI demos: SaveToFile return values are now consistently checked, TPDFlib and secondary object lifetimes are always protected by try/finally, and failure messages include LastErrorCode
Fixed
- Fixed inverted SaveToFile polarity in ImageToPdf that treated success as failure, and stopped AddTrueTypeSubsettedFont from opening a stale file when the save failed
- Fixed resource leaks in CreateWithImageToStream, DoInTheStream, CanvasText, ExtractText, ExtractImage, PdfDecrypt, PdfEncrypt, and PdfPermission where TPDFlib, TStream, TBitmap, TOpenDialog, or TStringList instances could escape on an exception path
- Removed dead code in AddFormattedTitle (unused RectParts allocation, redundant try/except around StrToFloatDef) and MultiFunction (overwritten SetTextSize call)
Version 3.253.0
Added
- Added typed action details for thread, sound, movie, optional-content, rendition, transition and 3D-view actions
- Added reusable action-handle lookup and ordered optional-content state enumeration
- Added complete PDF transition records covering replacement, Fly, Push, Cover, Uncover and Fade styles
Fixed
- Wipe and Glitter transitions now store their direction in
/Di, read page display duration from the page dictionary and clear both transition and timing entries - Standard pre-PDF-1.5 transition styles no longer force a PDF 1.5 output version
Version 3.252.0
Added
- Added single-pass form-field action discovery with typed action details across primary, widget and field triggers
- Added complete calculation-order enumeration, per-field lookup and removal for interactive forms
- Extended bulk form-field snapshots with calculation order and action count
Changed
- Widget lifecycle triggers now support page-open, page-close, page-visible and page-hidden actions with the required PDF 1.5 version handling
Version 3.251.0
Added
- Added single-pass named-destination enumeration across legacy catalog entries and modern name trees with resolved page and view parameters
- Added named-destination removal, complete push-button captions, button text positioning and form-field mapping names
- Extended bulk form-field snapshots with mapping names, button captions and button text position
Fixed
- Name-tree editing now supports direct destination values and uses unambiguous multi-node index encoding
Version 3.250.0
Added
- Added single-pass form field snapshots with field identity, type, page, flags, values and Choice state
- Added typed Choice-field flag queries plus validated selected-index and top-visible-index accessors
Fixed
- Single-selection Choice fields no longer retain a multi-selection
/Iarray, and switching from multi-select to single-select now replaces the old/Varray with a string value
Version 3.249.0
Added
- Added one-pass stateful text search traversal so applications can iterate cached hits without extracting pages twice
- Added bulk form value export and name-based application with optional read-only field protection
Version 3.248.0
Added
- Added retained Viewer selections with page-space geometry, extracted text, enumeration, clearing and a vetoable marquee event
- Added exact current-viewport bitmap capture and file output including persistent overlays
Version 3.247.0
Added
- Added independent Viewer controls for user form editing and annotation activation
- Added configurable foreground colour for text and choice form editors
Version 3.246.0
Added
- Added typed line ending styles, shape interior colours, link highlight modes, FreeText alignment, Text annotation open state and Caret symbols
- Annotation setters validate compatible subtypes and automatically raise the minimum PDF version where required
Version 3.245.1
Fixed
- Corrected FastReport export page sizing and memo layout so A4 reports retain their intended scale, text stays within memo bounds and unconfigured memo frames remain hidden
Version 3.245.0
Added
- Added
OnPasswordso applications can supply another password after an encrypted document rejects the initial credential - Password retries now work consistently for file, stream and string loads, expose the next attempt number and allow the handler to cancel
Security
- Password callbacks are limited to sixteen total attempts and every retry uses a fresh parser and decryption state
Version 3.244.0
Added
- Added
SetXMPPropertyExfor safely writing scalar properties in caller-defined XMP namespaces - Custom XMP values are escaped through the XML DOM, repeated writes replace the matching namespace property and invalid or reserved XML names are rejected
Version 3.243.0
Added
- Added typed document lifecycle actions for before close, before save, after save, before print and after print triggers
- Added typed page open and close actions with shared support for URI, named, JavaScript, form and destination action builders
- Added action inspection and removal methods for every document and page lifecycle trigger
Version 3.242.0
Added
- Added
SaveChangesto append changes to the originally loaded file and automatically reload the updated xref chain for repeated incremental saves SaveChangesvalidates the reload password before writing and preserves the selected public document handle after reload
Changed
AppendToFilenow rejects a target whose current length differs from the loaded source, preventing stale incremental offsets from being appended to an externally changed file
Version 3.241.0
Added
- Added
GetLastOutlineandGetLastChildOutlinefor direct access to the tail of a bookmark list - Added
GetOutlineChildCountandGetOutlineSiblingIndexfor lightweight bookmark tree inspection without allocating a full tree snapshot
Version 3.240.0
Added
- Added
SaveAllAttachmentsExwith overwrite, skip and automatic rename conflict policies plus a per-attachment naming callback - Attachment exports now reduce requested names to safe leaf names and protect Windows reserved device names
Fixed
- Fixed
SaveAllAttachmentsreturning without writing files because its attachment snapshot was counted but not allocated and populated
Version 3.239.0
Added
- Added
OnPageMouseDown,OnPageMouseMoveandOnPageMouseUpso Viewer hosts receive one-based page numbers and top-down PDF point coordinates independent of zoom, scrolling and view rotation - Added
RegionAtClientPoint,ActiveRegionandOnActiveRegionChangeto distinguish links, non-link annotations and form fields as the pointer enters or leaves them - Added
CreatePDFlibViewerDefaultPopupMenuandInstallPDFlibViewerDefaultPopupMenu, which compose the existing Viewer action classes into a ready context menu for copy, zoom, fit, rotate, navigation, save and print
Version 3.238.0
Added
- Added
OnOperationProgresswith typed operation kind, lifecycle phase, current and total units, percentage and detail text while preserving the classicOnProgresspercentage callback - Load, save, search, merge and page-render file, stream and string entry points now report starting and terminal phases; operations with intermediate progress also report
opRunning - Setting
CancelduringopStartingoropRunningactivates the existingAbortstate, providing one cancellation path for old and new callers
Fixed
LoadFromFilenow preserves error code 404 for a wrong password instead of overwriting it with the generic load error 401 after cleanup
Version 3.237.0
Added
- Added
SearchTextEachandTPDFlibSearchHitEventto emit every text hit immediately without allocating or sizing a result array SearchTextandSearchTextEachnow report page progress throughOnProgressand honour bothAbortand callback cancellation; callback cancellation uses the existing abort state untilResetAbort- The Viewer search panel and search-highlight layer now consume the streaming API in one pass, removing their former 256-row and 512-highlight limits
Fixed
- Whole-word search now continues past an earlier substring occurrence in the same text block to find a later correctly bounded match
Version 3.236.0
Added
- Added
GetPrinterCapabilitiesto capture a live printer-driver snapshot without starting a print job - The typed
TPDFlibPrinterCapabilitiesresult includes paper IDs, names and millimetre dimensions, input-bin IDs and names, duplex, colour, landscape and collation support, the printer port and the maximum driver-reported copy count - Drivers that omit paper or bin metadata still return the remaining capabilities with empty arrays, while invalid printer names return a fully cleared snapshot
Version 3.235.0
Added
- Added
SendDocumentByMailfor saving the loaded document to a temporary PDF and delivering it as an SMTP attachment through the built-in Windows CDO provider - Added the reference-counted
IPDFlibMailProviderextension point so applications can supply another transport, support non-Windows hosts and test mail workflows without network access - Each send uses an isolated temporary directory, sanitises the attachment display name and removes both the PDF and its directory after the provider returns;
GetLastMailErrorreports validation, save, transport and platform failures
Version 3.234.0
Added
- Added variable placeholders to stamp, header and footer text:
<%PageNo%>,<%TotalPages%>,<%ShortDate%>,<%LongDate%>,<%ShortTime%>and<%LongTime%>expand per page alongside the classic &-tokens - Any custom
<%name%>placeholder resolves through the newOnCalcVariableevent, which receives the name and the page number and supplies the replacement - running numbers, batch codes and client fields stamp without pre-processing the text; without a handler unknown placeholders stay verbatim
Version 3.233.0
Added
- Added superscript/subscript detection to text extraction: the new
GetTextBlockVAlignreports each extracted text block's baseline classification (0 = baseline, 1 = superscript, 2 = subscript) relative to its visual line, so chemical formulas, exponents and footnote markers can be recognised - A block classifies as super-/subscript when it is markedly smaller than the line's dominant text and its vertical centre sits above/below the dominant centre within one text height
Version 3.232.0
Added
- Added character-level word splitting to text extraction:
SetTextExtractionOptions(17, 1)re-splits show-text runs that carry no space characters into words wherever a per-character advance step is much wider than the run's median glyph advance - documents that paint whole lines as a single operator with kerning gaps standing in for spaces now extract as separate words inGetPageTextmodes 7 and 9-11 - The advance arrays stay aligned with the widened text, so block quads and per-character width outputs remain consistent
Version 3.231.0
Added
- Added layout-preserving fixed-grid text export:
GetPageText(11)maps the page geometry onto a monospace character grid - rows cluster by baseline, every block lands at its column computed from the average character width, and shorter cells pad with real spaces - so tables and forms keep their visual alignment in plain-text viewers, terminals and diffs without relying on tab stops - The reference page for
GetPageTextnow documents the reading-order (9), tab-separated table (10) and fixed-grid (11) modes
Version 3.230.0
Added
- Added dehyphenation to text extraction:
SetTextExtractionOptions(16, 1)re-joins words hyphenated across line breaks ("inter-" at a line end followed by "national" becomes "international") in the line-oriented outputs ofGetPageTextmodes 7 and 9 - The heuristic only merges when a letter precedes the hyphen and a lowercase letter starts the next line, so numeric ranges, proper nouns and sentence-initial capitals keep their hyphens
Version 3.229.0
Added
- Added the
OnBeforeSnapshotevent to theTPDFlibViewercontrol: it fires before a snapshot drag is captured with the dragged region, and setting Handled cancels the default clipboard capture so applications can process the region themselves - Exposed
PrefetchEnabled: the background pre-render worker can now be switched off and on at run time (the worker stops immediately and restarts on the open document) - Exposed
DiskCacheMaxDocuments: the number of documents the cross-session disk page cache keeps before pruning is now tunable (default 10)
Version 3.228.0
Added
- Added precise navigation to the
TPDFlibViewercontrol:GoToPagePointjumps to a page and scrolls a given page point to the top-left of the viewport, so link destinations and search hits land exactly in view - Added programmatic scroll control:
ScrollBypixel stepping, read/writeHScrollPos/VScrollPosproperties (ideal for synchronising two side-by-side viewers over the same document), andGetScrollPosForPagereporting each page's scroll anchor in continuous mode - Added public coordinate bridges
ClientPointToPageandPageRectToClientRectconverting between client pixels and page user space through zoom, rotation and scroll; the internal hit-testing now shares the exact geometry of the paint path and also works on unparented (headless) controls
Version 3.227.0
Added
- Added view-state events to the
TPDFlibViewercontrol:OnZoomChangefires on every effective-zoom move (explicit zoom, preset steps, fit-mode recomputation on resize, rotation or DPI change) andOnHScroll/OnVScrollfollow the scroll position, so toolbars and status displays stay in sync without polling - Dragging the vertical scrollbar thumb now shows a floating "Page N / M" bubble that previews the page the view will land on - a big help in long documents; the
ScrollHintEnabledproperty (on by default) turns it off
Version 3.226.0
Added
- Completed the fill-and-save loop in the
TPDFlibViewercontrol:SaveToFileandSaveToStreamwrite the displayed document - committed form edits included - back to disk or a stream (any open in-place editor commits first) - Multiline text fields now edit in a proper multi-line memo: Enter inserts a line break, Ctrl+Enter commits, Escape cancels; single-line fields keep the plain Enter-commits behaviour
- Tab and Shift+Tab cycle the in-place editor through the document's editable text and choice fields, following each field's page;
FocusNextFormFieldexposes the same navigation programmatically
Version 3.225.0
Added
- Added preset-ladder zooming to the
TPDFlibViewercontrol:ZoomInStepandZoomOutStepsnap the zoom to the standard preset sequence (1, 5, 10, 25, 50, 75, 100, 150, 200, 400, 800, 1600, 2400, 3200 percent), starting from the zoom currently in effect so fit modes step naturally; the toolbar zoom actions now use the same ladder - Ctrl+mouse wheel now zooms along the preset ladder while a plain wheel keeps scrolling
- Added keyboard shortcuts: Ctrl+'+'/'-' step the zoom, Ctrl+1/2/3 switch to actual size, fit width and fit page, and Shift+Up/Down jump to the first and last page
Version 3.224.0
Added
- Added
CreateSelfSignedCertificatewith Delphi, DLL and ActiveX entry points: generates a self-signed RSA certificate (SHA-256 signature, configurable subject, validity and key length) and exports it with its private key to a password-protected PFX file, ready forSignFileand the sign-process APIs - so signing workflows can be built and tested without an external certificate authority - The certificate is created in a throwaway key container that is deleted after the export; only the PFX keeps the key material. Self-signed certificates are meant for testing and internal documents - viewers flag them as untrusted unless installed explicitly
Version 3.223.0
Added
- Added
TPDFlibShapeWatermarkto the composable watermark layer: rectangles, circles, ellipses, polygons, Bezier curve chains and straight lines stamp onto a page range with fill and stroke colours, line width and opacity, through the sameApplyWatermarkentry point as text and image watermarks - Rectangle, circle and ellipse shapes size themselves from Width/Height; polygon, curve and line shapes take their geometry from
SetPoints(local X,Y pairs), so the nine-point Position grid and custom placement apply to every shape kind; degenerate geometry (too few points) is rejected
Version 3.222.0
Added
- Added
AddLinkToEmbeddedPDFwith Delphi, DLL and ActiveX entry points: a page hotspot that opens a PDF embedded in the current document (by its EmbeddedFiles name) and jumps to a chosen page there, using the standard embedded go-to (/GoToE) action of ISO 32000-1 §12.6.4.4 with an optional new-window request; the document version rises to PDF 1.6 automatically GetAnnotActionInfoand its outline/form-field siblings now recognise embedded go-to actions, reporting the newakGoToEkind together with the embedded target name, the parent/child target relationship, the optional file specification and the /NewWindow flag
Version 3.221.0
Added
- Added
SetSignProcessAppearanceTextwith Delphi, DLL and ActiveX entry points: digital signatures can now show an automatically generated visible text appearance composed of the signer name, reason, location and signing date, with optional descriptive labels ("Signed by:", "Reason:", ...) selected through a bit mask - The text block lays out inside the signature field rectangle in Helvetica with a configurable colour; font size 0 auto-fits the lines to the field. A field image set through
SetSignProcessFieldImageFromFilekeeps precedence, and document time-stamp processes ignore the text appearance
Version 3.220.0
Added
- Added interactive form filling to the
TPDFlibViewercontrol: clicking a checkbox or radio button toggles it, and clicking a text or choice field opens an in-place editor over the field (Enter commits, Escape cancels, leaving the editor commits); read-only fields are left alone and the changed page re-renders automatically - Every write fires the new
OnFormFieldValueChangedevent, andHighlightFormFieldswithFormHighlightColorpaints a translucent backdrop over each fillable area so users can spot form fields - Added the programmatic counterparts
FormFieldAtPagePoint,GetFormFieldPageRect,ToggleCheckBoxField,SetFormFieldValueAndRefresh,BeginEditFormFieldandCommitInplaceEditor, driving the same machinery without mouse input
Version 3.219.0
Added
- Added annotation interaction to the
TPDFlibViewercontrol: clicking a non-link annotation fires the newOnAnnotClickevent with the page, annotation index and subtype, andAnnotAtPagePointexposes the hit test programmatically (Popup companions are skipped) - Hovering an annotation now shows its Contents text as the control's hint (the
AnnotHintsswitch, on by default, works with the standardShowHintproperty) - Added
SaveAnnotAttachmentToFileto write a FileAttachment annotation's embedded file to disk, completing click-to-save attachment workflows in the viewer
Version 3.218.0
Added
- Added a cross-session disk page cache to the
TPDFlibViewercontrol: settingDiskCacheFolderpersists rendered pages on disk so a recently viewed document reopens instantly without re-rendering - Cached pages are keyed by a fingerprint of the document's path, size and last write time, so editing the file automatically invalidates its stale pages; the cache keeps up to ten documents and prunes the least recently used ones
- Added the
DiskCacheHitscounter reporting how many page renderings the disk cache saved
Version 3.217.0
Added
- Added the
PDFlibViewerActionsunit with twenty ready-madeTActiondescendants forTPDFlibViewer, so toolbars and menus work without glue code: page navigation (First/Prior/Next/Last), zoom (In/Out/FitWidth/FitPage/ActualSize), view rotation (clockwise/anticlockwise), printing, file open and save-as dialogs, copy selected text, and the five mouse-tool mode switches - Each action targets a viewer through its
Viewerproperty and keeps its enabled state (document open, page position, selection present) and checked state (active zoom fit or mouse tool) up to date automatically; all actions register in the losLab PDF category for the Action List editor - Added
TPDFlibViewer.EffectiveZoomPercentreporting the zoom actually in effect (including computed fit-width/fit-page factors) so zoom steps can build on it
Version 3.216.0
Added
- Added search-hit highlighting to the
TPDFlibViewercontrol:HighlightSearchHitssearches the whole document and paints a translucent bar over every match that stays in place while scrolling, zooming and rotating, withClearSearchHighlights,SearchHighlightCountand a configurableSearchHighlightColor TPDFlibSearchPanel.RunSearchnow also paints the hit bars in the attached viewer (the newHighlightInViewproperty, on by default, turns this off), so search results are visible on the pages, not just in the hit list
Version 3.215.0
Added
- Added mouse tool modes to the
TPDFlibViewercontrol through the newViewerModeproperty:vmSelecttext selection (default),vmHandpan-by-dragging with a grab cursor (a plain click still follows links),vmZoommarquee zoom that magnifies the dragged band to fill the viewport,vmSnapshotregion capture to the clipboard, andvmHighlightpersistent translucent region highlighting - Added
CaptureRegionto render any client region (pages plus highlights) into a caller-owned bitmap, theOnSnapshotevent andSnapshotToClipboardswitch for snapshot handling, andAddHighlightRegion/ClearHighlightRegions/HighlightRegionCountwith a configurableHighlightColorfor page-anchored highlights that survive zoom, rotation and navigation
Version 3.214.0
Added
- Added printing to the
TPDFlibViewercontrol:PrintDocshows the standard Windows print dialog (printer choice, page range, copies, collation) and hands the job to the library's printing engine, whilePrintDoc(False)prints the whole document to the default printer without any UI - Added
PrintDocRangefor fully programmatic viewer printing with an explicit printer name, page range, copy count and collation flag
Version 3.213.0
Added
- Added view rotation to the
TPDFlibViewercontrol:RotateClockwise90andRotateAntiClockwise90turn the displayed pages in 90-degree steps, and theViewRotationproperty reads or sets the angle directly (0, 90, 180 or 270) - Rotation is a pure view attribute: the document is never modified, link clicking and text selection keep working at every angle, fit-width and fit-page zoom modes adapt to the rotated page shape, and opening a new document resets the view to 0 degrees
- Rotated page bitmaps are cached per angle, so switching between angles reuses previous renderings instead of re-rendering
Version 3.212.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept simple FormCalc-style predicate selectors such as$data.Receipt.Detail.[Total_Price > 200].Descriptionand update every matching data node when a predicate selects a subset
Version 3.211.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept Data DOM class selectors#dataGroupand#dataValuewith numeric or wildcard occurrences, allowing class-based paths such as$data.Receipt.#dataGroup[0].#dataValue[0]
Version 3.210.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept the$recordroot in non-record-processing packets, so paths such as$record.Taxand$record/Detail[0]/Total_Priceresolve from the outer data record element
Version 3.209.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard border style attributes
width,style, anddashesfrom PDF annotation/BSvalues, and annotation imports restore those attributes on inserted annotations
Version 3.208.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
creationdateandopacityattributes from PDF annotation/CreationDateand/CAvalues, and annotation imports restore those attributes on inserted annotations
Version 3.207.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
flagsnames from PDF annotation/Fvalues, and annotation imports restore those names to the inserted annotation flags
Version 3.206.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept direct child wildcard selectors such as$data.Receipt.*.Total_Priceto read or update matching child branches without selecting same-name fields on the parent node
Version 3.205.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept descendant selectors such as$data..Total_Priceand$data.Receipt..Total_Priceto read or update the first matching descendant data node
Version 3.204.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept theparentproperty in paths such as$data.Receipt.Detail[1].parent.Taxto read or update a selected node's parent sibling data
Version 3.203.0
Changed
- Improved XFA datasets SOM occurrence handling:
GetXFAFormFieldValueandSetXFAFormFieldValuenow support[*]selectors such as$data.Receipt.Detail[*].Total_Priceto read or update every matching repeated data node
Version 3.202.0
Changed
- Improved XFA SOM path compatibility: XFA datasets and template field APIs now preserve literal periods in slash-delimited field paths and accept escaped periods such as
Line\.Itemin dot-delimited SOM paths
Version 3.201.0
Changed
- Improved XFA datasets path compatibility: XFA field value APIs now accept slash-delimited paths after standard data SOM roots such as
$data/...,xfa.datasets.data/..., andxfa.datasets/...
Version 3.200.0
Changed
- Improved XFA datasets SOM compatibility: XFA field value APIs now accept the standard
!data...short form, including slash-delimited!data/...paths
Version 3.199.0
Changed
- Improved XFA template path compatibility: template editing APIs now accept slash-delimited field paths returned by XFA field-name enumeration, including
$template/...paths
Version 3.198.0
Changed
- Improved XFA datasets namespace compatibility: field value APIs now read and update data nodes by local XML name when the business data inside the datasets packet uses its own namespace prefix, and field-name enumeration returns prefix-free paths
Version 3.197.0
Changed
- Improved XFDF annotation interchange: annotation exports now include the common
nameanddateattributes from PDF/NMand/M, annotation imports restore those values on inserted annotations, andSetAnnotStrPropertynow accepts tag 104 for annotation modified dates
Version 3.196.0
Changed
- Improved XFA field-name enumeration: field list APIs now scan every top-level data record in the datasets packet and return leaf data fields without adding container groups as fields
Version 3.195.0
Changed
- Improved XFA datasets compatibility: XFA field value APIs now read and update complete XDP packets whose datasets packet uses an unprefixed
dataelement
Version 3.194.0
Fixed
- Improved XFA template field updates: XFA template field APIs now accept standard template SOM roots such as
$templateandxfa.template, and template-only changes in complete XDP streams are saved correctly
Version 3.193.0
Changed
- Improved XFA field addressing: XFA field value APIs now accept standard data SOM roots such as
$dataandxfa.datasets.datain addition to relative field paths
Version 3.192.0
Changed
- Improved XFA XML packet handling: XFA streams with UTF-16 byte order marks or UTF-16 XML byte patterns now decode before XML parsing, so UTF-16 encoded form values remain available through XFA field read/write APIs
Version 3.191.0
Changed
- Improved XFA packet authoring:
SetXFAFromStringnow creates the requiredAcroFormcontainer when a document does not already have form data, replaces stale parsed XFA state when a complete XFA packet is stored, and keeps the saved packet available through XFA field read/write APIs
Version 3.190.0
Changed
- Improved XFDF annotation interchange: annotation exports now write the common
colorattribute from the PDF/CRGB array, and annotation imports now restorecolor="#RRGGBB"values into the inserted annotation color array
Version 3.189.0
Added
- Added XFDF annotation interchange APIs:
ExportAnnotationsToXFDF,ExportAnnotationsToXFDFString,ImportAnnotationsFromXFDFandImportAnnotationsFromXFDFStringnow read and write ISO 19444<annots>data for text-style annotation comments, including page, rectangle, title, subject and plain contents data
Version 3.188.0
Changed
- Improved XFDF rich text field import: fields with
<value-richtext>now preserve the rich text XML in the fieldRVvalue while still applying the plain<value>fallback when present
Version 3.187.0
Changed
- Improved XFDF form-data interchange for multi-select choice fields: repeated
<value>elements now import into the selected-value array, and exporting a multi-select choice field now writes one<value>element per selected item instead of flattening them into one escaped text node
Version 3.186.0
Changed
- Improved XFDF form-data export for rich text fields: fields with an
RVrich text value now include a<value-richtext>element while preserving the plain<value>fallback
Version 3.185.0
Changed
- Improved XFDF form-data import for rich text fields: when a field provides
<value-richtext>without a plain<value>, the importer now extracts the XHTML text content and applies it to the matching AcroForm field instead of skipping the field
Version 3.184.0
Changed
- Improved XFDF form-data interchange: exports now use the standard XFDF namespace with
xml:space="preserve", emit nested<field>elements for hierarchical AcroForm names, skip non-terminal parent field values, write file exports as UTF-8, and import whitespace-flexible XFDF with nested fields, single-quoted attributes, CDATA, XML entities, and numeric character references
Version 3.183.0
Added
- Added
SanitizeDocument(Flags)which strips sensitive content in one call: removes all global JavaScript, removes the catalog OpenAction, strips /A actions from every annotation, blanks Author/Subject/Keywords/Creator/Producer metadata (both /Info and XMP), and optionally deletes all annotations. Flag bitsSANITIZE_JAVASCRIPT/SANITIZE_ACTIONS/SANITIZE_METADATA/SANITIZE_ANNOTATIONS/SANITIZE_OPEN_ACTIONcombine;SANITIZE_ALLapplies every strip. Closes the classic data-leak hole where redaction removes visible content but leaves metadata or hidden scripts recoverable - Added
TPDFAnnots.RemoveAnnotAction(Index)to strip the /A action dictionary from an individual annotation (used by SanitizeDocument, also useful standalone)
Version 3.182.0
Added
- Image elements returned by
EnumPageElementsnow carry their real placement rectangle (Left/Top/Right/Bottom) instead of zeros. Backed by a newTPDFContentProgram.EnumImagePlacementsmethod that walks the content stream tracking the CTM (cm/q/Q) and maps eachDooperator's 1x1 unit square into page coordinates - Added four showcase demos: DocumentProperties (DocInfo/page-box/rotation/transition/viewer-preferences/XMP round-trip), FormProperties (per-field property grid: type/value/readonly/MaxLength/MultiLine/description), SignatureValidator (enumerate signature fields + verify + signer certificate), Reader (VCL TPDFlibViewer with open/navigate/zoom/copy-text)
Version 3.181.0
Added
- Added
SetXMPPropertyexposing the existing schema-aware XMP engine (PDFlibXMP) through the public facade: set any Dublin Core (dc:), XMP Basic (xmp:), Adobe PDF (pdf:), PDF/A ID (pdfaid:), PDF/UA ID (pdfuaid:), or XMP Media Management (xmpMM:) property by namespace + key without hand-writing RDF XML - Added
ImportFormDataFromFDF/ImportFormDataFromFDFStringwhich parse an FDF /Fields array (each<< /T (name) /V (value) >>) and apply each value to the matching AcroForm field by title, inverting the EscapePDFText octal/paren escaping. Closes the asymmetric export-only gap - Added
ExportFormDataToXFDF/ExportFormDataToXFDFString/ImportFormDataFromXFDF/ImportFormDataFromXFDFStringfor XFDF (XML Forms Data Format) bidirectional interchange - the modern XML counterpart of FDF - Made the six namespace-scoped XMP setters (
SetDublinCore,SetXMPBasic,SetAdobePDF,SetPDFA,SetPDFUA,SetXMPMM) public onTPDFlibXMPso advanced callers can drive the engine directly
Version 3.180.0
Added
- Added
SearchAndReplaceTextInContentwhich performs TRUE content-stream text replacement (rewriting the Tj/TJ/'/" show-text operators in place viaTPDFContentProgram.ReplaceTextRun), unlike the existing mask-basedSearchAndReplaceTextthat only overlays a rectangle on top of the original glyphs. The original text is gone from the stream and cannot be recovered. Locates hits viaSearchText, maps each hit rect to its covering instruction viaFindInstructionsInRect, rewrites, and writes the layer back
Version 3.179.0
Added
- Added a structured internal logger (
TPDFlibLogger) in a newLib/PDFlibLogger.pasunit with four levels (Debug/Info/Warn/Error), a host callback (OnLog), an optional thread-safe file sink, and an error-code-to-message map (PDFlibErrorMessage) that finally gives the existing numeric codes (1xx/3xx/4xx/5xx) human text. Exposed onTPDFlibvia theLoggerproperty - Added
RenderPagesToFilesParallelwhich renders a page range to one file per page using aTTaskpool with oneTPDFlibinstance per worker (TPDFlib is not thread-safe) and per-threadCoInitializefor GDI+ apartment safety. Scales near-linearly with CPU cores for CPU-bound raster output
Version 3.178.0
Added
- Added
EnumCertificatesto enumerate every certificate in a Windows system store ("MY", "Root", ...) returning subject, issuer, serial number, validity window, HasPrivateKey, and Qualified (eIDAS QCStatements extension, OID 0.4.0.1862.1.7, detected via a new built-in DER decoder in PDFlibASN1) - replaces the previous single-cert-by-CNSetSignProcessCertFromStorelimitation - Added
SetSignProcessCertFromStoreByHandleto select a signing certificate by raw PCCERT_CONTEXT handle obtained from enumeration, letting callers pick by any criterion (qualified filter, validity, fingerprint) rather than only by Subject CN - Added
RedactRegionwhich truly removes text, vector paths, and image XObjects whose painted area intersects a rectangle (editing the content stream so removed content cannot be recovered, unlikeMaskRectwhich only covers it), with optional black fill and /Redact annotation. Backed by a CTM-tracking content-stream analyser in PDFlibContentModel (FindInstructionsInRect) - Added minimal DER decoder functions (
DERDecodeLength,DERFindExtensionByOID) to PDFlibASN1 for in-process certificate extension inspection without CryptDecodeObjectEx
Version 3.177.0
Added
- Added page stitching APIs that compose existing pages into new layouts via vector Form XObject capture (preserving full vector fidelity, unlike content-stream concatenation):
StitchPageOverlayoverlays one page onto another at a position with optional opacity,StitchPagesSideBySideplaces two pages left/right on a new wider page, andStitchPagesVerticallystacks a page range into a new tall poster-style page - Added a composable watermark template layer in a new
Lib/PDFlibWatermark.pasunit:TPDFlibWatermarkBasewith nine-point positioning (wpTopLeft..wpBottomRightpluswpCustom),TPDFlibTextWatermark,TPDFlibImageWatermark, andTPDFlibCompositeWatermarkwhich applies a list of sub-watermarks recursively across a shared page range - Added
TPDFlib.ApplyWatermarkas a convenience entry point that delegates to a watermark template's own page range and settings
Version 3.176.0
Added
- Added named render-output format constants (
PDF_RENDER_BMP,PDF_RENDER_EMF,PDF_RENDER_EMFPLUS,PDF_RENDER_EMF_DUAL, etc.) that map 1:1 to the integerOptionsvalues accepted byRenderPageToFile,RenderPageToStream,RenderPagesToFiles, andRenderDocumentToFile - Added
TPDFlibMetafileFormatenum and the convenience methodsRenderPageToMetafileStreamandRenderPageToMetafileFile, which accept a named metafile variant (mfEMF, mfEMFPlus, mfEMFDual, mfWMF) instead of a bare integer - Added EMF+ Dual output mode (Options value 11 / mfEMFDual), which records both GDI and GDI+ commands in the same metafile for compatibility with older GDI-only consumers
- Added
TPDFlibClipboardFormatenum andRenderPageToClipboard, which places a rendered page on the Windows clipboard as an enhanced metafile (CF_ENHMETAFILE), a DIB bitmap (CF_DIB), the page Unicode text (CF_UNICODETEXT), or all three at once - Added a new
Lib/PDFlibClipboard.pasunit with low-level Win32 clipboard placement helpers used byRenderPageToClipboard - Added full per-monitor DPI awareness to
TPDFlibViewer: a new publicScreenDPIproperty, aCreateWndoverride that auto-detects the host monitor DPI viaGetDpiForWindow(with aGetDeviceCapsfallback), and aWM_DPICHANGEDhandler that rebuilds the layout and clears the bitmap cache when the window moves between monitors - Added
TPDFRenderer.SetEMFPlusMetafileTypeto select between EMF+ Only and EMF+ Dual recording at the renderer level
Fixed
- Fixed the
RenderPageToFilereference page where the Options value list was misplaced in the Page row and the Options cell was empty
Version 3.175.3
Added
- Added a Lib/PDFlibTableExport.pas unit that renders any TDataSet (FireDAC, ClientDataSet, query result) into a paginated PDF table with styled header, zebra striping, right-aligned numeric columns, and automatic page continuation, plus a Demo/Delphi/DataSetExport console demo that loads the RAD Studio customer.FDS sample via FireDAC and exports it
Version 3.175.2
Added
- Added end-to-end Demo/ReportBridges projects that build a minimal report in FastReport, QuickReport, and ReportBuilder and export it to PDF through the matching Addons bridge, with a dedicated build-ReportBridges.cmd that supplies the engine source paths and gating symbols so the standard demo build still compiles the projects as stubs
Version 3.175.1
Added
- Added a Delphi JBIG2 options matrix demo that sweeps SymbolExtract, SkipBlackDots, BlackDotSize, and LossyLevel combinations against CCITT G4 and Flate baselines, with per-row PDF, CSV, and summary outputs
- Added a Delphi Pattern showcase demo covering axial and radial RGB shaders, a Coons-patch mesh shader, and a custom tiling pattern applied as fill, stroke, and text colour
- Added a Delphi CCITT fax matrix demo comparing Group 3 1-D, Group 3 2-D, and Group 4 compression with BlackIs1 and Interpolate option bits, reporting each output size and the resulting /Filter name
- Added FastReport, QuickReport, and ReportBuilder export bridges under Addons that render a prepared report into a PDFlibPas PDF via the engine's native object, metafile, and DrawCommand surfaces respectively
Version 3.175.0
Changed
- Expanded the WorkflowGallery demo with an annotation variant matrix that records text highlight fills, markup styles, note icons, free text, caret, and stamp annotations in companion CSV and HTML reports
Version 3.174.0
Changed
- Expanded the C++Builder AdvancedWorkflowMatrix demo to map action navigation, PDF/A and AcroForm workflows, font diagnostics, streaming delivery, and the latest scan-compression helpers into the generated matrix reports
Version 3.173.0
Added
- Added the DeliveryWorkflowMatrix Delphi demo for streamed Web and CGI PDF output, page-thumbnail validation, and watermark delivery workflows using one generated PDF byte buffer
Version 3.172.0
Added
- Added outline tree convenience APIs for ordered sibling insertion, child creation, subtree deletion, and preorder outline enumeration with parent, sibling, level, destination page, open-state, and title details
Version 3.171.0
Added
- Added the FontDiagnosticsMatrix Delphi console demo for CJK and Unicode font paths, TrueType subset updates, installed-font probes, document font enumeration, and font diagnostics reports
Version 3.170.0
Added
- Added the CanvasMigrationMatrix Delphi console demo for Canvas DC migration, raw content and path entry points, Delphi color helpers, pattern-filled text, watermarking, page thumbnail workflows, and rendered validation previews
Version 3.169.0
Added
- Added dedicated LayerCompositionMatrix, TransparencyMaskMatrix, and ComplianceFormWorkflowMatrix Delphi console demos for optional-content print/export policy, Pattern/Form XObject composition, transparency mask comparison, PDF/A-1b success and failure examples, AcroForm action workflows, appearance rebuilds, and visible signature templates
Version 3.168.0
Added
- Added dedicated ImageCompressionMatrix and SecurityPermissionMatrix Delphi console demos with generated PDF, CSV, and HTML reports for image compression strategy selection, scan compression, JPEG render quality, and encrypted permission profile auditing
Version 3.167.0
Added
- Added named helper APIs for JBIG2 bitmap encoding, EMF import options, AcroForm event actions, and chained actions so callers can use explicit option switches instead of composing integer bitmasks manually
Version 3.166.0
Added
- Added a runnable C++Builder AdvancedWorkflowMatrix console demo with PDF, CSV, and HTML outputs that map advanced canvas migration, EMF import, image compression, AcroForm, signature, security, PDF/A, optional-content, pattern, and Form XObject workflows to C++Builder project entry points
Version 3.165.0
Added
- Added a Delphi action navigation matrix demo that demonstrates open-document actions, document-level JavaScript, embedded-file links, remote GoTo links, AcroForm event actions, Submit/Reset/Hide link helpers, and chained Next actions with PDF, CSV, and HTML outputs
Fixed
- Fixed remote file link helpers so AddLinkToFile, AddLinkToFileEx, AddLinkToFileDest, and local file launch links create one annotation and return instead of looping indefinitely
Version 3.164.0
Added
- Se agregó una demo de matriz de protección PDF/A para Delphi que comprueba el rechazo anticipado o las decisiones de rutas permitidas para la configuración del modo PDF/A, la transparencia, los modos de fusión, el cifrado, JavaScript, multimedia, archivos incrustados y los flujos de trabajo de archivos asociados de PDF/A-3, con informes PDF, CSV y HTML generados
Version 3.163.0
Added
Version 3.162.0
Added
Version 3.161.0
Added
Version 3.160.0
Added
Version 3.159.1
Changed
SaveToStream y el guardado en flujo vinculado para escribir flujos PDF grandes en bloques acotados en vez de copiarlos a una cadena intermediaVersion 3.159.0
Added
Version 3.158.1
Added
Version 3.158.0
Added
Version 3.157.0
Added
Version 3.156.0
Added
- Añadidos helpers Delphi de flujo vinculado:
BeginOutputToStream,EndOutputStream,CancelOutputStreamyOutputStreamActivevinculan unTStream, finalizan por bloques o cancelan sin tomar propiedad
Version 3.155.0
Added
- Añadidos
Abort,AbortedyResetAbortpara marcar una instancia como cancelada e impedir guardado o anexado hasta limpiar el indicador
Version 3.154.0
Added
- Añadidos helpers de miniatura, búsqueda y estado de grupos de contenido opcional por nombre, y
SetOpenActionNamedDestinationpara abrir hacia destinos nombrados
Fixed
GetDestNameahora resuelve handles explícitos de arrays de destino, incluidos arrays devueltos por una acción de apertura nombrada
Version 3.153.0
Added
- Añadidas API de conveniencia para acciones de formulario encadenadas, disparadores Hide e ImportData, estados iniciales opcionales, EMF opcional e imágenes transparentes por color clave
Version 3.152.0
Added
- Añadida creación automática de enlaces URL al dibujar texto, importación CCITT Group 3/4, imágenes JBIG2 directas, EMF extendido, máscaras, firmas visibles y eventos/acciones de formulario
Version 3.151.0
Added
- Añadidos
DrawPie,DrawChord,DrawEllipticPieyDrawEllipticChordpara arcos circulares y elípticos cerrados con contorno, relleno o ambos
Version 3.150.0
Added
- Añadidos
NewGraphicsStateySetGraphicsStatepara crear recursos ExtGState reutilizables con transparencias, ancho, extremos, uniones y límite de inglete
Version 3.149.1
Fixed
- Corregidos dispatch IDs ActiveX duplicados para Form XObject y métodos de límite de inglete, evitando ambigüedad en COM de enlace tardío
Version 3.149.0
Added
- Añadido
SetMiterLimitpara controlar proporciones de límite de inglete en rutas con uniones de inglete - Expuestos
BeginFormXObject,EndFormXObjectyCancelFormXObjectmediante API DLL y ActiveX
Version 3.148.0
Added
- Añadidas API de Form XObject reutilizable para dibujar una plantilla con llamadas normales y colocarla repetidamente mediante API de página capturada
Version 3.147.0
Added
- Añadidos
SetTextTilingPatternySetLineTilingPatternpara reutilizar patrones capturados en texto, subrayado y gráficos trazados sin duplicar comandos
Fixed
- Los colores de shader y patrón de mosaico trazados ahora escriben el operador de color de patrón de trazo en vez de actualizar el estado sin trazo
Version 3.146.0
Added
- Añadidos
BeginOptionalContentyEndOptionalContentpara marcar solo comandos posteriores con un grupo opcional sin reescribir el flujo existente
Fixed
- Los operadores marked-content de cierre de ámbito ahora se vacían de inmediato al cerrar optional content, Tagged PDF o Artifact al final de un flujo
Version 3.145.0
Added
- Añadido
SetTransparencyExpara definir por separado transparencia de relleno y trazo en texto y gráficos posteriores conservando la actualización automática a PDF 1.4
Version 3.144.0
Added
- Añadido
AddLinkToNamedDestinationpara saltar desde un hotspot a un destino nombrado del mismo documento sin resolver la página al crear el enlace
Fixed
- Los lectores de acciones de anotación ahora devuelven ninguna acción para páginas sin anotaciones en vez de desreferenciar una caché vacía
Version 3.143.0
Added
- Añadidas API de gestión de acciones de campos para vincular acciones existentes a disparadores, inspeccionar acciones tipadas y quitar acciones principales o adicionales
Fixed
FormFieldJavaScriptActionahora rechaza documentos PDF/A y disparadores inválidos en vez de escribir diccionarios de acciones no conformes
Version 3.142.0
Added
- Se añadieron API de encadenamiento de acciones para que los llamadores puedan anexar acciones siguientes URI, con nombre y JavaScript a una anotación, un esquema o una acción de campo de formulario existentes, e inspeccionar las acciones encadenadas mediante
GetActionNextCountyGetActionNextInfo
Version 3.141.0
Agregados
- Se agregaron
AddLinkToSubmitFormyAddLinkToResetFormpara que los puntos interactivos de la página puedan enviar o restablecer campos AcroForm mediante acciones estándar de PDF sin JavaScript
Version 3.140.0
Agregados
- Se agregó
AppendToStreampara que los flujos de trabajo de actualización incremental puedan escribir directamente en un flujo provisto por el llamador en lugar de materializar primero la actualización como unAnsiString
Modificados
SaveToStreamahora serializa directamente en el flujo de destino, yAppendToString(1)ahora devuelve solo la sección de actualización incremental sin copiar los bytes de origen originales en un búfer temporal
Version 3.139.0
Agregados
- Se agregaron
GetAnnotReplyToyGetAnnotReplyTypepara que las respuestas de anotaciones anidadas puedan inspeccionarse a través de descriptores de acceso de solo lectura con nombre en lugar de etiquetas de propiedades de anotaciones genéricas
Version 3.138.0
Agregados
- Se agregó el ejemplo de Delphi
DocumentInspectionWorkbenchpara inspeccionar archivos PDF por lotes con diagnósticos de fuentes combinados, muestreo de imágenes, descubrimiento de espacios de color, tiempos de carga e informes en JSON, CSV y HTML
Version 3.137.0
Agregados
- Se agregó el ejemplo de Delphi
ImageDecodeBenchmarkpara medir el descubrimiento de imágenes de la página, los bytes de imagen decodificados y el descubrimiento del espacio de color de la página con informes de tiempo en CSV y HTML
Version 3.136.0
Agregados
- Se agregaron
GetDocumentFontDiagnosticsyTPDFlibFontDiagnosticspara resumir la incrustación de fuentes en el documento, la creación de subconjuntos, Standard 14, CID, Type3 y recuentos de fuentes desconocidas en una sola llamada
Version 3.135.0
Agregados
TPDFlibSignatureVerifier.VerifySignerCertificateChainahora construye la cadena de certificados del firmante incrustada con Windows CryptoAPI y devuelvevsValidsolo cuando la cadena satisface la política de confianza base de Windows, mientras que los certificados autofirmados o de otra manera no confiables devuelvenvsInvalidsin cambiar el resultado de integridad del contenido deVerifySignature
Version 3.134.0
Correcciones
TPDFlibSignatureVerifier.VerifySignatureahora valida las firmasadbe.pkcs7.sha1heredadas, devolviendovsValidcuando el resumen firmado coincide con los bytes cubiertos en/ByteRangeyvsInvaliddespués de que cambia el contenido cubierto
Version 3.133.0
Agregados
- Se agregaron
RenderPagesToFilesyDARenderPagesToFilespara renderizar rangos de páginas arbitrarios a archivos de salida numerados mientras se reutiliza la configuración del renderizador en las páginas seleccionadas
Version 3.132.0
Agregados
- Se agregaron los estampadores de conveniencia
AddPageHeaderyAddPageFooterque colocan texto en un margen superior o inferior fijo en cada página de un rango, con alineación izquierda/centro/derecha y expansión de tokens (&Ppágina actual,&Ntotal de páginas,&Dfecha,&Ttítulo del documento,&&ersand literal) StampTextyStampImageconsoUnderlayahora colocan verdaderamente el contenido debajo del contenido existente de la página anteponiendo una nueva capa de contenido (anteriormente dibujaba en la parte superior comosoOverlay); respaldado por un nuevo método de árbol de páginasPrependContentLayer
Version 3.131.0
Agregados
- Se agregó
ScalePage(ScaleX, ScaleY, Anchor)que escala el contenido de la página seleccionada envolviendo cada capa de contenido en un bloque de estado gráficoq sx 0 0 sy tx ty cm ... Qy redimensionando el MediaBox y el CropBox; el anclaje mantiene el origen inferior izquierdo (0), centra el contenido (1) o mantiene el superior izquierdo (2) - Se extendió
EnumPageElementscon un nuevo tipo de elementoekPath: cada página ahora también informa sus trazados vectoriales con un cuadro delimitador, recuento de puntos, indicador de cierre y operador de pintura, extraídos de los flujos de contenido a través del modelo de contenido estructurado
Version 3.130.0
Agregados
- Se agregaron tres API de optimización de tamaño de archivo que reducen los documentos cargados al volver a guardar:
SubsetEmbeddedFontsreescribe cada programa de fuente TrueType incrustado (FontFile2) a los caracteres Unicode que el documento realmente renderiza a través del servicioCreateFontPackagede FontSub.dll;DownsampleImages(MaxDPI, Quality, Filter)decodifica cada XObject de imagen por encima del DPI objetivo, lo remuestrea (caja o bilineal) y lo vuelve a codificar como JPEG o PNG;NormalizeLZWStreamsreescribe cada flujo que todavía está filtrado con LZWDecode a FlateDecode a través del decodificador LZW existente y el codificador Flate, preservando los parámetros Predictor
Version 3.129.0
Agregados
- Se agregaron API de creación de sombreado de malla para los cuatro tipos de sombreado que anteriormente solo tenían soporte de lectura/análisis:
NewRGBFreeFormTriangleMesh(ShadingType 4, triángulos de Gouraud de forma libre),NewRGBLatticeTriangleMesh(ShadingType 5, Gouraud de forma de celosía),NewRGBCoonsPatchMesh(ShadingType 6, malla de parches de Coons) yNewRGBTensorPatchMesh(ShadingType 7, malla de parches de productos tensoriales) — cada uno construye un patrón de sombreado de malla con nombre a partir de una lista plana de vértices o parches con profundidad de bits de coordenadas/color seleccionable y un cuadro delimitador, seleccionable conSetFillShader/SetLineShader/SetTextShadercomo los sombreadores axiales y radiales existentes
Version 3.128.0
Agregados
- Se agregó una tira de miniaturas para el visor:
TPDFlibThumbnailBarmuestra una miniatura de cada página, renderizada de forma diferida a medida que las filas se desplazan a la vista, con el número de página debajo; al hacer clic en una miniatura, el visor adjunto salta a esa página — completando la familia de controles del visor (visor, panel de marcadores, panel de búsqueda, miniaturas)
Version 3.127.0
Agregados
- Se agregó un panel de búsqueda para el visor:
TPDFlibSearchPanel.RunSearchbusca en todo el documento adjunto y enumera una fila por coincidencia con su número de página y texto coincidente; al hacer clic en una coincidencia, el visor salta a esa página
Version 3.126.0
Agregados
- Se agregó un panel de marcadores para el visor:
TPDFlibOutlineViewerenumera el árbol de esquema del documento con sangría y hace que el visor adjunto (a través deAttachViewer) salte a la página de destino de un marcador al hacer clic; está construido sobre una clase base de panel reutilizable que luego comparten otros paneles laterales
Version 3.125.0
Agregados
- Se agregó selección de texto al control del visor: arrastre con el botón izquierdo del mouse para seleccionar, presione Ctrl+C o llame a
CopySelectedTextpara copiar la selección al portapapeles; el texto capturado está disponible a través de la propiedadSelectedText, ordenado de arriba a abajo con saltos de línea entre bandas - Se agregó
GetTextInRegion, que devuelve directamente el texto de una región rectangular de la página — la misma búsqueda basada en bloques que utiliza la selección del mouse, disponible para interfaces de selección personalizadas
Version 3.124.0
Agregados
- El control del visor ahora pre-renderiza las páginas vecinas en un hilo en segundo plano, por lo que avanzar o retroceder de página muestra la siguiente página instantáneamente; el trabajador usa su propia instancia de documento y entrega las representaciones terminadas a la caché sin bloquear la interfaz de usuario
- Se agregó interactividad de enlaces al visor: al hacer clic en una anotación de enlace se dispara
OnLinkClickcon el número de página y el mismo resumen de acción tipificado que produceGetAnnotActionInfo(dirección web, destino del documento, acción nombrada, etc.);LinkActionAtPagePointexpone la prueba de impacto subyacente para un manejo personalizado
Version 3.123.0
Agregados
- El control del visor obtuvo desplazamiento continuo:
SetDisplayModecambiaTPDFlibViewerentre una visualización de una sola página y un desplazamiento vertical continuo a través de todo el documento, con solo las páginas visibles en la ventana gráfica renderizadas y la página actual rastreando la posición de desplazamiento (disparandoOnPageChangea medida que las páginas aparecen a la vista) - Las páginas renderizadas ahora se mantienen en una caché de mapas de bits de uso menos reciente (LRU), por lo que desplazarse hacia adelante y hacia atrás no vuelve a renderizar; el presupuesto de memoria es de 128 MB por defecto y se ajusta con
SetCacheLimit, desalojando las páginas más antiguas cuando el presupuesto se reduce o se llena - Se agregó desplazamiento con la rueda del mouse y navegación por teclado al visor: RePág/AvPág (pasos de página en modo de página única, pasos de ventana gráfica en modo continuo), teclas de flecha, Inicio y Fin
Version 3.122.0
Agregados
- Se agregó un control de visor de PDF interactivo:
TPDFlibVieweres un control de desplazamiento VCL que abre un documento desde un archivo o se adjunta a una instancia deTPDFlibexistente, muestra páginas a través del motor de renderizado seleccionado (GDI+, Cairo o PDFium) y ofrece navegación de páginas (GoToPage/NextPage/PrevPagecon un eventoOnPageChange) y control de zoom — un porcentaje fijo, ajustar al ancho o ajustar a la página, recalculado automáticamente cuando el control cambia de tamaño; las páginas más anchas que la ventana gráfica se desplazan, las páginas más estrechas se centran - Se agregó un paquete de tiempo de diseño (
Package\PDFlibViewerPkg.dpk) que registra el control en la página de la paleta PDF de losLab para su uso de arrastrar y soltar en el IDE
Version 3.121.0
Agregados
- Formación automática de scripts complejos en
DrawText: el texto que contiene árabe, hebreo, índico u otros caracteres de scripts complejos ahora se detecta y forma automáticamente — las formas de letras contextuales, las ligaduras obligatorias y el orden de derecha a izquierda salen correctamente sin cambios en el código; los nombres estándar-14 se mapean a sus fuentes instaladas compatibles con métricas (Helvetica a Arial, Times a Times New Roman, Courier a Courier New) yGetTextWidthmide a través del mismo paso de formación para que la alineación se mantenga constante; el texto latino, cirílico, griego y CJK mantiene su ruta de dibujo existente byte por byte - Se agregó
SetTextShapingpara alternar el enrutamiento automático (habilitado por defecto; pase 0 para restaurar el comportamiento exacto previo a la formación)
Version 3.120.0
Modificados
- Las fuentes complementarias de texto formado ahora se subconjuntan al momento de guardar solo a los glifos que muestra el documento, reduciendo drásticamente los archivos de salida (un programa de fuente completo de más de un megabyte se reduce a los glifos utilizados); la fuente subconjuntada mantiene su numeración de glifos, lleva un nombre
BaseFontetiquetado como subconjunto y anchos/Wreales por glifo, y obtiene un mapa ToUnicode que traduce cada glifo formado de nuevo a sus caracteres de origen — por lo que copiar o extraer la salida deDrawShapedTextdevuelve la cadena original, incluyendo ambas letras detrás de una ligadura lam-alef
Version 3.119.0
Agregados
- Se agregó dibujo de texto de scripts complejos:
DrawShapedTextforma árabe, hebreo y otras cadenas de scripts complejos antes de dibujarlas — las formas de letras contextuales, las ligaduras obligatorias como lam-alef y el orden de derecha a izquierda salen correctamente — y escribe los glifos formados a través de una fuente complementaria Type0 (Identity-H) que incrusta todo el programa de la fuente, por lo que las formas sin un código de caracteres propio se renderizan exactamente; se crea una fuente complementaria por tipo de letra y se reutiliza entre llamadas - Se agregó
GetShapedTextWidth, que mide el texto a través del mismo paso de formación, por lo que el texto ligado se mide en su verdadero ancho dibujado — utilícelo para alinear a la derecha o centrar párrafos formados
Version 3.118.0
Agregados
- Se agregó la base para la formación de texto de scripts complejos: un nuevo enlace Uniscribe (usp10.dll) convierte el árabe, hebreo y otras cadenas de scripts complejos en ejecuciones de glifos ordenadas y formadas correctamente — formas árabes contextuales, ligaduras obligatorias como lam-alef y ordenación de derecha a izquierda — reportando el índice de glifo de fuente, el avance y el grupo de caracteres fuente de cada glifo; este es el motor de formación sobre el que las versiones posteriores construyen la ruta de dibujo, y se carga de forma diferida para que las plataformas sin Uniscribe simplemente mantengan la ruta existente por carácter
Version 3.117.0
Agregados
- Se agregó la introspección del perfil ICC:
GetOutputIntentICCInfoanaliza el perfil ICC adjunto a OutputIntent del documento y reporta su versión, clase de dispositivo, espacio de color de datos, espacio de conexión de perfil, intención de renderizado y recuento de componentes — útil para inspeccionar la condición de impresión de archivos PDF/A y PDF/X; el manejo del espacio de color ICCBased del renderizador ahora también deriva el recuento de componentes del encabezado del perfil en sí cuando el espacio de color de un sombreado no lleva/Alternateni/N
Version 3.116.0
Agregados
- Se agregó un modo de extracción de texto consciente de tablas: la opción 10 de
GetPageTextagrupa los bordes izquierdos de los bloques de texto de la página en posiciones de columna globales y emite filas separadas por tabulaciones, por lo que los diseños tabulares se extraen como TSV listos para importar con las celdas alineadas verticalmente manteniéndose alineadas en todas las filas
Version 3.115.0
Agregados
- Se agregó imposición de páginas:
ImposePagesNUpdiseña cada página del documento en hojas nuevas en una cuadrícula n-up (2-up, 4-up, 9-up o cualquier disposición Columnas x Filas) con cada página ajustada al aspecto y centrada en su celda como contenido vectorial activo, o — con la opción de folleto — produce hojas de encuadernación a caballete cuyo emparejamiento de páginas se pliega en un folleto cuando se imprime a doble cara y se apila
Version 3.114.0
Agregados
- Se extendieron los lectores de acciones tipificadas
GetAnnotActionInfoyGetOutlineActionInfoa cuatro tipos de acciones más — Ocultar (con la cantidad de objetivos ocultos y el indicador ocultar/mostrar), EnviarFormulario (URL de envío y recuento de campos), RestablecerFormulario (recuento de campos) e ImportarDatos (archivo de origen) — y para exponer la carga útil del nombre de las acciones Nombradas (por ejemplo,NextPage); ambos lectores ahora comparten un analizador, por lo que los enlaces de anotación y los marcadores informan información idéntica
Version 3.113.0
Agregados
- Se agregaron ayudantes de formato de campo de formulario:
SetFormFieldNumberFormat(lugares decimales, estilo de separador, estilo negativo y ubicación de moneda),SetFormFieldPercentFormatySetFormFieldDateFormat(cadenas de imágenes de fecha de Acrobat comomm/dd/yyyy) cada uno escribe el par JavaScript de formato de Acrobat estándar en las acciones adicionales del campo — un filtro de pulsaciones de teclas más un formateador de visualización — para que los visores conformes validen la entrada y rendericen los valores formateados sin JavaScript escrito a mano
Version 3.112.0
Agregados
- Se agregó la creación de anotaciones de sonido:
AddSoundAnnotationFromFilelee un archivo WAV PCM sin comprimir (8 o 16 bits, mono o estéreo) e incrusta sus muestras detrás de una anotación de icono de altavoz como una secuencia/Sounden la codificación firmada que espera la maquinaria de sonido PDF, completando el viaje de ida y vuelta con los lectores existentesGetAnnotSoundToFile/GetAnnotSoundToString
Version 3.111.0
Agregados
- Se agregaron respuestas de anotación enhebradas (ISO 32000-1 §12.5.6.3):
AddAnnotationReplyagrega una respuesta a cualquier anotación existente como una anotación de texto oculta cuyo/IRThace referencia al objetivo con la relación de respuesta/RT, por lo que Acrobat y otros visores lo muestran enhebrado bajo el objetivo en el panel de comentarios; se combina conAddAnnotationStatey el intercambio de comentarios FDF para completar viajes de ida y vuelta de revisión colaborativa
Version 3.110.0
Agregados
- Se agregó el renderizado de sombreado basado en funciones y mallas, completando la cobertura de los siete tipos de sombreado PDF: mallas triangulares Gouraud de forma libre (tipo 4), mallas Gouraud de forma de celosía (tipo 5), mallas de parches de Coons (tipo 6) y mallas de parches de productos tensoriales (tipo 7) se decodifican a partir de sus flujos de datos empaquetados de bits — incluyendo indicadores de parches de borde compartido, mapeo de valores
/Decodey rampas de color/Functionopcionales — y se pintan a través de los gradientes de malla nativos del motor Cairo; los sombreados basados en funciones (tipo 1) se aproximan muestreando la función de sombreado en su dominio en una cuadrícula fina de parches; los espacios de color admitidos cubren DeviceRGB, DeviceGray, DeviceCMYK y alternativas ICCBased (el motor GDI+ no tiene primitiva de gradiente de malla y deja las áreas sombreadas con malla sin pintar)
Version 3.109.0
Agregados
- Se completó el marco de edición de contenido (fase 4) con edición a nivel de texto:
TPDFContentProgram.GetTextRunsenumera las instrucciones de visualización de texto de una página con el recurso de fuente y el tamaño activo en cada una (rastreando el estado de la fuente a través del anidamiento de guardado/restauración), yReplaceTextRunintercambia el texto mostrado en su lugar — un verdadero reemplazo de flujo de contenido que mantiene la posición, fuente y color originales, a diferencia de los enfoques basados en superposiciones que enmascaran el texto antiguo y vuelven a dibujar encima
Version 3.108.0
Agregados
- Se agregó un modelo de objetos para la geometría de la página al marco de edición de contenido (fase 3):
TPDFContentProgram.LiftPatheleva un objeto de ruta (operadores de construcción de mover/línea/curva/rectángulo más los operadores de recorte y pintura que lo terminan) en unTPDFPatheditable de subrutas y segmentos;TPDFPath.Transformaplica una matriz afín a cada punto (mover, escalar, rotar o sesgar la ilustración existente);LowerPathreescribe la geometría modificada sobre las instrucciones originales, lista paraWritePageContentLayer
Version 3.107.0
Agregados
- Se extendió el marco de edición de contenido (fase 2) con comodidades a nivel de instrucción en
TPDFContentProgram:InsertFromSourceanaliza un fragmento de contenido y empalma sus instrucciones en cualquier posición;SetOperandreescribe un solo operando de la sintaxis de origen (renumerar una coordenada, volver a colorear un relleno);OperandTextlee un operando hacia atrás;InstructionGroup,FindNextOpyFindNextGroupnavegan por la lista de instrucciones por operador o por la categoría de operador ISO 32000-1
Version 3.106.0
Agregados
- Se agregó la primera fase del marco de edición de contenido estructurado:
ParsePageContentLayerdecodifica una capa de contenido de página en unTPDFContentProgrameditable — una lista de instrucciones, cada operador de contenido PDF (los 73 operadores de ISO 32000-1 Tabla 51) con sus objetos operandos decodificados — yWritePageContentLayerserializa el programa de nuevo en la página, para que los llamadores puedan analizar, inspeccionar, eliminar o reordenar las instrucciones de dibujo y reescribir la página;GetPageContentLayerCountinforma la cantidad de capas de contenido, que se editan de forma independiente; el emisor preserva el comportamiento (un viaje de ida y vuelta no modificado se renderiza con identidad de píxeles), los operadores desconocidos sobreviven sin cambios y las imágenes incrustadas se transportan de manera textual
Version 3.105.0
Agregados
- Se agregó un modo de extracción de texto en orden de lectura: la opción 9 de
GetPageTextdevuelve el texto de la página en orden de lectura visual usando análisis de espacio en blanco recursivo (corte XY), por lo que los diseños de varias columnas salen columna por columna — primero un encabezado de ancho completo, luego toda la columna izquierda, luego la columna derecha — en lugar de intercalar las columnas línea por línea como lo hacen los ordenamientos geométricos de arriba hacia la izquierda
Version 3.104.0
Agregados
- Se agregó la introspección del certificado del firmante al verificador de firmas:
GetSignerCertificatedecodifica la carga útil PKCS#7 del primer campo de firma y devuelve un resumen tipificado del certificado del firmante incrustado — los nombres de visualización del sujeto y del emisor, el número de serie en forma hexadecimal convencional, la ventana de validez UTC (NotBefore/NotAfter) y un indicador de conveniencia que informa si el certificado se encuentra actualmente dentro de esa ventana; el firmante coincide con los certificados incrustados por emisor y número de serie
Version 3.103.0
Agregados
- Se agregó
NewRGBRadialShader, la contraparte radial deNewRGBAxialShader: registra un gradiente radial de dos círculos con nombre (ShadingType 3, ISO 32000-1 §8.7.4.5.3) mezclando entre dos colores RGB, con extensión de color opcional más allá de los círculos; selecciónelo con los existentesSetFillShader,SetLineShaderoSetTextShaderpara pintar rellenos, trazos y texto de "resplandor" circulares
Version 3.102.0
Agregados
- Se agregó representación de gradiente radial (ShadingType 3) (ISO 32000-1 §8.7.4.5.4): el renderizador de páginas ahora pinta los sombreados radiales de dos círculos utilizados por los operadores
shy los rellenos de patrones de sombreado, además de los gradientes axiales (ShadingType 2) admitidos anteriormente; compatible con los motores de trama GDI+ y Cairo con funciones de color de varias paradas, espacios de color DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased y manejo/Extend
Version 3.101.0
Agregados
- Se agregaron efectos de bordes nublados (ISO 32000-1 §12.5.4):
SetAnnotCloudyEffectconvierte el borde de una anotación de Cuadrado, Círculo, Polígono o Texto Libre en una "nube de revisión" de semicírculos conectados escribiendo el diccionario de efectos de borde/BE, con una intensidad de 1 o 2 que coincida con los estilos nublados de Acrobat y 0 eliminando el efecto nuevamente;GetAnnotCloudyEffectlee el ajuste hacia atrás (0 = sin nube, de lo contrario la intensidad de 1..2)
Version 3.100.0
Agregados
- Se agregaron estados de revisión de anotaciones (ISO 32000-1 §12.5.6.3):
AddAnnotationStateregistra un cambio de estado de revisión para una anotación existente agregando una anotación de Texto oculta cuyo/IRTapunta al objetivo y cuyo/State+/StateModellleva el estado, admitiendo el modeloReview(None/Accepted/Rejected/Cancelled/Completed) y el modeloMarked(Unmarked/Marked) utilizado por el flujo de trabajo de revisión de comentarios de Acrobat;GetAnnotStateyGetAnnotStateModelleen las cadenas grabadas de cualquier anotación (vacías cuando están ausentes)
Correcciones
- Se corrigió una falla en el tiempo de carga que impedía que se iniciaran las aplicaciones compiladas con versiones de desarrollo recientes (una búsqueda de nombre de certificado de Windows estaba vinculada a un punto de entrada DLL inexistente) y se repararon las regresiones de compilación en la importación de comentarios FDF, la rotación de rango de página y las rutas de indicadores de firma
Version 3.99.0
Agregados
- Se agregaron las API de lectura de transiciones y huella digital del documento:
GetDocumentFileIDdevuelve el identificador de documento permanente de la matriz/IDdel tráiler (primer elemento codificado en hexadecimal), útil como una clave de caché estable o huella digital del documento;GetPageTransitiones la contraparte del lado de lectura deSetPageTransition, que devuelve el estilo de transición como un valor tipadoTPDFlibPageTransitionademás de la duración de visualización y la duración de la transición mediante la asignación inversa de las entradas/S,/Dmy/Malmacenadas de/Trans
Version 3.98.0
Agregados
- Se agregaron la rotación de un rango de páginas y la introspección de miniaturas:
RotatePageRangeaplica una rotación de 0/90/180/270 a cada página en un rango (envolviendo elRotatePagede una sola página existente para que los llamadores ya no necesiten un bucle por página);HasPageThumbnailinforma si una página contiene una entrada/Thumb;GetPageThumbnailInfolee el ancho, el alto y los bits por componente del XObject de la imagen en miniatura
Version 3.97.0
Agregados
- Se agregaron los lectores de propiedades de anotación extendidas:
GetAnnotColorlee la matriz de color/C(RGB 0..1, con un indicador HasColor que distingue “sin color explícito” de “negro explícito”);GetAnnotBorderWidthlee/BS /W, recurriendo a la matriz/Borderheredada;GetAnnotOpacitylee el alfa de trazo/CA(predeterminado 1.0);GetAnnotCreationDatelee la marca de tiempo/CreationDate;GetAnnotFlagslee el byte de indicadores de impresión/visibilidad/F
Version 3.96.0
Agregados
- Se agregaron las API de introspección de seguridad del lado de lectura:
IsEncryptedinforma si el documento cargado contiene un diccionario/Encrypt;GetEncryptionLeveldevuelve una intensidad tipada (0=ninguno, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X) que coincide con las opciones de cifrado del lado de escritura;GetUserPermissionsdevuelve la palabra de permiso/Psin procesar para pruebas de bits directas;IsOwnerPasswordinforma si el documento se abrió con la credencial de propietario
Version 3.95.0
Agregados
- Se agregaron el reemplazo de texto y la impresión avanzada:
PrintDocumentAdvancedcontrola el DEVMODE completo de la impresora (doble cara, orientación, color, calidad de impresión, tamaño de papel, bandeja de papel) además de copias/intercalación a través de un registro tipadoTPDFlibPrintSettings, aplicando cada campo no predeterminado mediante el mecanismo de perfil de impresora personalizada existente;SearchAndReplaceTextejecuta una búsqueda en un rango de páginas y, por cada coincidencia, oculta el bloque de texto original con un rectángulo blanco opaco y vuelve a dibujar el texto de reemplazo en el origen del bloque con la fuente seleccionada por el llamador, reflejando el comportamiento de superposición y reemplazo de PDFtoolkit SearchAndReplace
Version 3.94.0
Agregados
- Se agregó el intercambio FDF de anotaciones (“Exportar/Importar comentarios” de Acrobat):
ExportAnnotationsToFDFStringyExportAnnotationsToFDFrecorren el/Annotsde cada página y serializan cada anotación como una entrada/Type /Annotdentro de una matriz/Annotsde FDF, con la inclusión de/Subtype,/Contents,/Rect, la etiqueta de autor/T,/Subjy el índice/Pagebasado en 0;ImportAnnotationsFromFDFStringyImportAnnotationsFromFDFanalizan dicho FDF con una pequeña máquina de estados y vuelven a crear cada entrada como una nueva anotación en la página correspondiente, preservando el diccionario de anotaciones completo en lugar de colapsarlo en una nota adhesiva
Version 3.93.0
Agregados
- Se agregaron las API de propiedades de campos de formulario y certificación de firmas:
SetSignProcessDocMDPconvierte la siguiente firma producida por un proceso de firma en una firma certificadora (autor) al adjuntar una transformación DocMDP/Referenceen el nivel 1/2/3 (sin cambios / llenado de formularios / anotaciones) y establecer el bit AppendOnly de/SigFlagsde AcroForm;GetSigFlags/SetSigFlagsleen y escriben directamente el byte/SigFlagsde AcroForm sin procesar;GetFormFieldIsComb,GetFormFieldIsMultiLine,GetFormFieldJustificationyGetFormFieldAllowedValuesexponen los bits de estilo/Ffpor campo, el justificado de texto/Qy la matriz de opciones/Optcomo valores tipados
Version 3.92.0
Agregados
- Se agregaron las API de conveniencia de campos de formulario y exportación de archivos adjuntos:
SaveAllAttachmentsrecorre la lista unificada de archivos adjuntos (el elemento/EmbeddedFilesa nivel de documento además de las anotaciones/FileAttachmentpor página) y escribe cada flujo en un directorio bajo su nombre de especificación de archivo, eliminando la ambigüedad de colisiones con un sufijo numérico;RemoveFormFieldByNameresuelve un nombre de campo completamente calificado en su índice y lo elimina;RenameFormFieldcambia el nombre de un campo por nombre sin una búsqueda de índice separada
Version 3.91.0
Agregados
- Se agregaron las API de enumeración en todo el documento:
EnumDocumentFontsrecorre cada diccionario de fuente (llamando aFindFontsprimero si es necesario) y devuelve unTPDFlibDocumentFontpor fuente con su número de objeto, nombre de/BaseFont, tipo, codificación y estado de incrustación/subconjunto, eliminando la necesidad de llamar aSelectFonten cada entrada y consultar captadores escalares;EnumAttachmentsunifica el árbol de nombres/EmbeddedFilesa nivel de documento con las anotaciones/FileAttachmentpor página en una sola lista deTPDFlibAttachment, registrando la fuente de cada entrada, el índice de fuente basado en 1, el nombre del archivo, el subtipo MIME, la descripción y el tamaño en bytes
Version 3.90.0
Agregados
- Se agregaron las API de introspección de solo lectura para las anotaciones, los marcadores y la versión del documento:
GetPDFVersiondevuelve la cadena de versión del PDF efectiva (por ejemplo,1.7);GetAnnotType,GetAnnotTitle,GetAnnotSubject,GetAnnotContentsEx,GetAnnotModifiedDate,GetAnnotNameyGetAnnotRectExexponen los campos por anotación como envoltorios con nombre (para que los llamadores ya no necesiten números de etiqueta de propiedad mágicos) a través de la caché existenteAnalyseAnnot;GetOutlineLeveldevuelve la profundidad de un marcador en relación con la raíz del esquema yGetOutlineIsOpeninforma si está expandido en un visor (un/Countnegativo significa colapsado), reflejando el estado de diseño que representaría un panel de marcadores
Version 3.89.0
Agregados
- Se agregó una unidad de codificador de imagen JBIG2
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray), migrada desde el producto hermano HotPDF, con dos backends: en Win64, el codificador aritmético C++jbig2enc(ITU-T T.88) está vinculado estáticamente a través dePDFlibJBIG2EncC+HPDFCLibs(228 objetos leptonica/jbig2enc enthirdparty/Win64x/) y registrado como backend predeterminado, coincidiendo con la ruta de producción de HotPDF; en otros objetivos, o cuandoUseExternalEncoderes Falso, una alternativa MMR pura de Pascal comprime líneas de escaneo de dos niveles con el codificador CCITT G4 y las envuelve en encabezados de segmento JBIG2 (información de página tipo 48 + región genérica inmediata tipo 38) - Se agregó una unidad de codificador LZW
PDFlibLZWEnc(TPLLZWEncoder.Compress), la contraparte codificadora del decodificador existentePDFlibLZW: produce una secuencia/LZWDecodede especificación PDF con códigos de ancho variable de 9..12 bits, ClearCode/EOI y semántica EarlyChange predeterminada en PDF, además del Predictor TIFF 2 (diferenciación horizontal) opcional para que un viaje de ida y vuelta a través del decodificador reproduzca los bytes originales
Version 3.88.0
Agregados
- Added a CCITT Group 3 / Group 4 (T.6) bi-level image encoder unit
PDFlibCCITTEnc(TPLCCITTEncoder), the encoder counterpart to the existingPDFlibCCITTdecoder: it encodes apf1bitbitmap to a CCITT G3 1D / G3 2D / G4 (T.6) byte stream viaCompressImage/Execute, ported from the HotPDF sibling product (both share the losLab license); this supplies the missing encoder so monochrome image data can be produced forCCITTFaxDecodeoutput, with full image-pipeline andRenderPageToMonochromeFileG4-output integration to follow
Version 3.87.0
Agregados
- Implemented cryptographic signature verification for detached PKCS#7 signatures:
TPDFlibSignatureVerifier.VerifySignature(previously a stub returningvsUnknown) now recomputes the document digest over the two/ByteRangesegments and validates it against the signedmessageDigestattribute and the signer's public key via the Windows CryptoAPI (CryptVerifyDetachedMessageSignature), returningvsValid/vsInvalidforadbe.pkcs7.detachedandETSI.CAdES.detachedsubfilters; this is the first verification layer and covers digest+signature integrity only (certificate chain, CRL/OCSP revocation and RFC 3161 timestamp-token validation remain out of scope and will be added in later layers)
Version 3.86.0
Agregados
- Added a merge-time per-bookmark callback: the
OnMergeOutlineevent fires for each top-level source outline whileMergeFileList/MergeFileListFast/MergeFileListStrictlinks the merged outline tree, letting the caller rename (Title) or drop (Skip=True) an incoming bookmark before it lands in the target document; the callback receives the 0-based source document index so callers can apply per-document policies
Version 3.85.0
Agregados
- Added signing from the Windows system certificate store:
SetSignProcessCertFromStoreresolves the signing certificate from a named store ("MY"/"Root"/...) by Subject simple-display name (typically the CN, matched case-insensitively; an empty name picks the first certificate that has a private key) and reuses the existing PKCS#7 sign pipeline, so a document can be signed without supplying a.pfx/.p12file; pair it withSetSignProcessKeysetto chooseCURRENT_USER(1) vsLOCAL_MACHINE(2)
Version 3.84.0
Agregados
- Added font program embedding for already-loaded documents:
EmbedMissingFontswalks every Font dictionary, reads the matching installed system font program by BaseFont name and writesFontFile2orFontFile3back, returning the number of fonts that gained a program;EmbedFontProgramembeds a single font by name using the installed system font;EmbedFontProgramFromFileembeds a single font using a caller-supplied.ttfor.otffile for fonts not installed on the system - Added
SetEmbedAllFonts, a writer-side guard that promotesAddTrueTypeFontEmbed=0toEmbed=1so newly created documents cannot accidentally reference non-embedded system fonts outside PDF/A mode as well
Version 3.83.0
Añadido
- Se añadieron API de conveniencia para renderizado:
RenderPageToMonochromeFilerenderiza la página a un mapa de bits monocromático de 1 bit (escenarios de fax/archivo/OCR), rebajando la calidad desde 24 bits mediante interpolación de medios tonos GDI, sin alterar el núcleo de renderizado;RenderPageRegionToFilesolo renderiza el subrectángulo especificado de la página (“Left,Top,Width,Height”) a un mapa de bits, conectando la canalización de clipRenderPageToDCClippreviamente desconectada
Version 3.82.0
Añadido
- Se añadió exportación de datos de formulario FDF:
ExportFormDataToFDFescribe todos los nombres y valores de campos de formulario del documento actual en un archivo FDF independiente (arreglo/Fieldsenvuelto en%FDF-1.2),ExportFormDataToFDFStringdevuelve una cadena con la misma estructura, lo que facilita el almacenamiento separado de datos de formulario fuera del PDF o su fusión posterior; los bytes no ASCII se escapan en octal de 3 dígitos según ISO 32000-1
Version 3.81.0
Añadido
- Se añadieron API de conveniencia para páginas y estructura:
SetPageTransitionescribe el efecto de transición de presentación para la página especificada (17 transiciones estándar para/Trans, que incluyen Split/Blinds/Wipe/Dissolve/Glitter, etc.) y la duración de visualización de la página;GetPageFontCount,GetPageFontIDenumeran las fuentes referenciadas por la página especificada;SetMeasurementUnitacepta un enumerador de unidad con tipo (añadiendo twips y points a la base existente de píxeles/milímetros/pulgadas), junto a los ayudantes de conversión de unidadesConvertToPoints,ConvertFromPoints;SaveToFileOptionsusa un registro para agregar las opciones de guardado como compresión, linealización y preservación de la fecha de modificación
Version 3.80.0
Añadido
- Se añadieron API de conveniencia para seguridad y firma:
EncryptFileExacepta un conjunto de permisos con nombre tipado (TPDFlibUserPermissions, distinguiendo 8 bits de permisos con nombre, tales como impresión de baja e impresión de alta resolución) en lugar del entero de bits de permiso original;TPDFlibSignatureVerifier.GetSignatureMetadatalee el nombre del campo, Filter, SubFilter, tiempo de firma, razón, ubicación, información de contacto, firmante y verificación de estructura ByteRange directamente del diccionario de firma, sin necesidad de decodificación PKCS#7;PrintDocumentExespecifica el número de copias y el modo de intercalación en una sola llamada
Version 3.79.0
Añadido
- Se añadieron API de conveniencia para edición:
MaskRectdibuja un rectángulo con relleno opaco cubriendo el área especificada en la página (para enmascarar/censurar);SetPageThumbnailFromFileadjunta/Thumba la página directamente desde el archivo de imagen sin contaminar el estado de dibujo del flujo de contenido;FlattenFormFieldsOnPageRangeaplana todos los campos de formulario por rango de páginas (horneando la apariencia como contenido estático y eliminando los campos activos);InsertAnnotationinserta un diccionario de anotación ya construido en la ubicación especificada;NewMarkupAnnotationcrea anotaciones de marcado de resaltado/tachado/subrayado/ondulado en un solo paso y escribe los puntos quad, color y opacidad;StampText,StampImageaplican marcas de agua por rango de páginas, soportando opacidad, ángulo de rotación y posición Z-order
Version 3.78.0
Añadido
- Se añadieron API para consulta de texto y enumeración de elementos de página:
SearchTextbusca el término de consulta por rango de páginas especificado, devolviendo el número de página y el rectángulo envolvente para cada coincidencia, soportando opciones de distinción entre mayúsculas/minúsculas y palabra completa;EnumPageElementsenumera todos los bloques de texto y elementos de imagen incrustados de la página especificada, devolviendo uniformemente el tipo de elemento, rectángulo, texto, nombre de fuente e ID de imagen;GetTextInAreaExes la versión con rectángulo deGetTextInArea, que devuelve cada bloque de texto dentro del área junto a su rectángulo envolvente
Version 3.77.0
Añadido
- Se añadieron API de introspección de solo lectura, completando la asimetría previa de "poder escribir pero no leer":
FindOutlineByTitlebusca marcadores por título (soportando tres niveles de profundidad: solo hermanos / solo hijos / subárbol completo),GetOutlineActionInfoyGetAnnotActionInfodevuelven el tipo de acción (GoTo/GoToR/URI/Launch/Named/JavaScript) y cargas útiles de URI, JavaScript o nombre de archivo de un marcador o anotación mediante una estructura con tipo,GetOutlineDestinationInfodevuelve la página de destino y el tipo de Fit (XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV) junto a las coordenadas,EnumSignatures,GetSignatureFieldCount,GetSignatureFieldInfoenumeran los campos de firma y reportan si ya están firmados
Version 3.76.3
Cambiado
- El perfil Factur-X EXTENDED del demo E-Invoice ahora usa el valor de conformance y el guideline ID estándar, y la factura ZUGFeRD 1.0 agrega los elementos de suma
ChargeTotalAmountyAllowanceTotalAmount; los 6 perfiles ahora producen salidas PDF/A-3b y PDF/A-3u que pasan tanto veraPDF (conformidad PDF/A) como Mustang (reglas de negocio de factura electrónica)
Version 3.76.2
Corregido
- Los metadatos XMP de las facturas híbridas Factur-X/ZUGFeRD ahora declaran el esquema de extensión PDF/A (
pdfaExtension:schemas) para describir las propiedades de facturafx:; la ausencia previa de esta declaración hacía que el PDF/A-3 generado fuera rechazado como no conforme por validadores como veraPDF
Cambiado
- El XML de factura del demo E-Invoice ahora incluye las direcciones electrónicas del vendedor y del comprador así como el teléfono del vendedor, permitiendo que más perfiles pasen la validación de reglas de negocio ZUGFeRD/Factur-X
- El catálogo de perfiles, la construcción del XML y el flujo de generación PDF/A-3 del demo E-Invoice se extrajeron a una unidad compartida que la GUI y la nueva herramienta de prueba de validador externo reutilizan
Version 3.76.1
Corregido
- Se corrigió un cierre al presionar Generar en el demo E-Invoice: las fuentes estándar integradas no están disponibles en modo PDF/A, por lo que el demo ahora incrusta una fuente TrueType para renderizar la página de la factura
Cambiado
- El demo E-Invoice elimina la opción PDF/A-3a (poco común en facturación electrónica), y el perfil XRechnung ahora usa PDF/A-3u por defecto
Version 3.76.0
Cambiado
- La GUI del demo E-Invoice ahora es data-driven: el número de factura, la fecha de emisión, comprador y vendedor, importe neto, tasa de impuesto y moneda son editables, y el XML de la factura coincide exactamente con los importes visibles de la página, en lugar de usar contenido de marcador fijo
- El demo genera XML de factura estructuralmente correcto por perfil: Factur-X, XRechnung y ZUGFeRD 2.0 usan la estructura
CrossIndustryInvoice, mientras que ZUGFeRD 1.0 COMFORT usa su propia estructuraCrossIndustryDocumentcon líneas de detalle, totales de impuesto y condiciones de pago - Los importes se escriben al XML con formato inglés fijo de punto decimal para evitar que separadores de miles localizados o comas rompan el esquema, y la entrada del usuario se escapa antes de escribirla
- El demo agrega una vista previa XML en vivo, autoverificaciones de contenido a nivel de perfil, el análisis del reporte de validación externo
.validation.jsondel mismo nombre, y carga explícitamente el intent de salida ICC sRGB del repositorio al generar
Version 3.75.6
Añadido
SetPDFAModeagrega el modo7, que permite metadatos PDF/A-3u y sigue admitiendo archivos asociados PDF/A-3; la demo gráfica E-Invoice también ofrece una opción PDF/A-3u, y el perfil ZUGFeRD 2.0 BASIC usa PDF/A-3u de forma predeterminada
Version 3.75.5
Añadido
- Agrega una demo gráfica Delphi E-Invoice que permite elegir perfiles Factur-X, ZUGFeRD y XRechnung, generar facturas híbridas PDF/A-3, incrustar el nombre de archivo XML y el guideline ID correspondientes, ejecutar la validación del contenedor en la interfaz y mostrar la información XMP de la factura, los problemas de validación y el XML extraído
Version 3.75.4
Añadido
- Agrega compatibilidad con archivos asociados PDF/A-3 y XML de factura electrónica:
AddPDFA3AssociatedFileFromStringpuede crear archivos asociados Catalog/AFdirectamente desde bytes en memoria,AddFacturXAssociatedFileFromStringpuede escribir XML Factur-X, ZUGFeRD y XRechnung, sincronizar metadatos XMP y validar la combinación de nombre de archivo, perfil, espacio de nombres XMP y guideline ID XML, mientras que el lado de lectura agrega APIs de detección, validación, lista de problemas y extracción XML
Version 3.75.3
Corregido
- Función de combinación de PDF: las variables locales
GlobalRootObjNum,GlobalRootGenNum,StructRootGlobalObjNumyStructRootGlobalGenNumsólo se asignaban dentro de bloques condicionales, lo que provocaba advertencias W1036 “la variable podría no estar inicializada” en los compiladores Delphi Win64 26 y 29 (RAD Studio 12 y 16); se añadió la inicialización a cero al inicio de la función
Version 3.75.2
Corregido
- Compatibilidad de compilación entre varias versiones: el bucle
fordel analizador de cadenas hexadecimales (PDFlibStruct) usaba una variable de controlInt64, que Delphi XE3/XE5 (compiladores 26/27) rechazan por no ser ordinal; se reescribió como un bucleWhilepara restablecer la compatibilidad con RAD Studio 12 y 14 - Comprobador de XObject de referencia (
PDFlibPDFUA): el puntero de diccionarioDno se inicializaba en la rama sin stream/sin diccionario, lo que provocaba una sugerencia del compilador en todos los destinos; se reestructuró la rama para asignar siempreDantes de la comprobaciónAssigned - Envoltorio
CreateFontPackage(PDFlibFont): se suprimió la advertencia espuria W1035 “el valor de retorno podría no estar definido” en Delphi ≤ XE8, al tiempo que se evitó la sugerencia complementaria H2077 de asignación muerta en compiladores más nuevos, mediante la protección{$IF CompilerVersion} - Escritor BMP DPI y ruta de guardado incremental de PDF: se reemplazaron las llamadas obsoletas
TStream.Seek(Longint, Word)por asignacionesPosition :=(PDFlibPDFium,PDFlibDocument)
Version 3.75.1
Corregido
- Analizador TIFF de varias páginas: la protección de terminación del bucle contra conteos de páginas excesivamente grandes era ineficaz porque
FPageCountestaba declarado comoWord(máximo 65 535), lo que hacía que la comparación> 65535siempre fuera falsa; se cambió aIntegerpara que la protección se active ahora correctamente en archivos patológicos - Analizador de conjuntos de caracteres CFF/Type 2 (Format 1 y Format 2): se eliminaron las asignaciones muertas
Done := Trueque precedían inmediatamente a unBreaky por lo tanto nunca se leían, eliminando las sugerencias del compilador
Version 3.75.0
Seguridad
- Se reforzó el análisis de fuentes incrustadas no confiables (TrueType, Type 1, CFF y CMap) contra escrituras fuera de límites, recursión ilimitada de charstrings y asignaciones de memoria desmesuradas a partir de datos de fuente malformados
- Se reforzaron los decodificadores de imágenes (PNG, GIF, TIFF, JBIG2 y CCITT Group 3 and 4) contra lecturas y escrituras fuera de límites, desbordamiento entero en los cálculos de ancho y alto, y desreferencias de paleta vacía a partir de imágenes maliciosas
- Se reforzaron los filtros de flujo (LZW, ASCII85 y predictores Flate) contra lecturas excesivas del búfer, división por cero y bucles que no terminan en datos de flujo manipulados
- Se reforzó el análisis de referencias cruzadas, reconstrucción del documento y árboles de nombres contra accesos fuera de límites y bucles infinitos causados por datos de referencias cruzadas malformados o circulares
- El descifrado AES-CBC ahora valida la alineación de los bloques de texto cifrado e inicializa su búfer de salida a cero, evitando que memoria de heap no inicializada se filtre en cadenas y flujos descifrados
Corregido
- Los resúmenes de firmas separadas SHA-256, SHA-384 y SHA-512 ahora se generan con el proveedor criptográfico correcto; antes devolvían un resumen vacío y producían firmas inválidas
- La decodificación ASCII85 y RC4 ya no devuelve datos no inicializados ni genera una excepción con entradas truncadas o una clave vacía
- Ahora el color de fondo GIF se lee con el canal azul correcto en lugar de duplicar el canal verde
Version 3.74.1
Corregido
- Se corrigió un error de compilación E2010 de tipos incompatibles en el soporte de datos de validación de firma PAdES (VRI) que impedía compilar la biblioteca
- Se eliminaron la última advertencia del compilador y las sugerencias de variable no usada; ahora todas las compilaciones de biblioteca trial y release para Win32 y Win64 compilan sin advertencias
Version 3.74.0
Añadido
- Las rutas directas de archivo de
EncryptFileyDecryptFileahora leen PDFs cuyos datos de referencias cruzadas viven en flujos de referencias cruzadas, incluidas cadenas actualizadas incrementalmente y archivos de referencia híbrida con una sección lateral/XRefStm, en lugar de recurrir al lector completo más lento: la protección AES-256 de un documento de referencia de 1.25 GB bajó de aproximadamente 4.4 a 2.5 segundos y el descifrado de aproximadamente 1.7 a 1.3 segundos - Las reescrituras que transportan objetos almacenados en flujos de objetos comprimidos ahora emiten un final de flujo de referencias cruzadas, manteniendo esos objetos direccionables en la salida cifrada o descifrada
Corregido
- Una revisión sin un
/IDde documento en un archivo actualizado incrementalmente ya no borra el identificador heredado de una revisión anterior durante una reescritura directa
Version 3.73.2
Cambiado
DASaveAsFileahora agrupa sus escrituras de salida y localiza la palabra de cierre de cada objeto sin asignaciones de cadenas paso a paso, reduciendo la reescritura de un documento de referencia de 2 GB con más de un millón de objetos de aproximadamente 57 a 11 segundos
Version 3.73.1
Cambiado
- Las rutas directas de archivo de
EncryptFileyDecryptFileahora leen el origen a través de una ventana deslizante y agrupan las escrituras de salida, de modo que la protección AES-256 de PDFs muy grandes con millones de objetos corre varias veces más rápido: en un documento de referencia de 2 GB, el cifrado bajó de aproximadamente 123 a 32 segundos y el descifrado de aproximadamente 127 a 23 segundos - Los cuerpos de objeto que caben en la ventana de lectura ya no se obtienen del disco dos veces durante una reescritura directa AES-256
Corregido
- Las reescrituras directas AES-256 de PDFs de referencia híbrida (archivos que llevan una entrada de trailer
/XRefStm) ahora recurren al lector completo en lugar de arriesgar la pérdida de objetos comprimidos - El análisis de referencias cruzadas en la ruta directa de archivo ya no lee todo desde la sección de referencias cruzadas hasta el final del archivo de una sola vez, lo que podía agotar la memoria en archivos de varios gigabytes cuya cadena
/Prevapunta cerca del inicio del archivo, y una cadena/Prevrota ahora vuelve al lector completo en lugar de producir un documento incompleto
Version 3.73.0
Añadido
- La demo SigningWorkbench ahora realiza una verificación completa del resumen criptográfico de firmas CMS separadas (
adbe.pkcs7.detachedyETSI.CAdES.detached) a través de Windows CryptoAPI: los rangos de bytes firmados se vuelven a resumir y se comparan con la firma CMS, un documento alterado se informa con el nuevo código de falla SG203, y cada firma lleva un campodigestValidde tres estados en los informes JSON, CSV y HTML - Nuevos interruptores de automatización de SigningWorkbench:
--quietimprime sólo el resumen por lote y las rutas de informe,--fail-fastdetiene el lote en el primer archivo que falla, y el informe JSON ahora registra la versión de la biblioteca
Version 3.72.0
Añadido
- La demo ComplianceWorkbench gana flujos de trabajo profesionales por lote:
--policy-filecarga la política de auditoría desde un archivo JSON para que los equipos puedan versionar y compartir sus reglas de documento,--baselinecompara la ejecución con un compliance-report.json anterior y enumera nuevas fallas, archivos corregidos y archivos que siguen fallando, y--preflight-detailsincrusta líneas de incidencias de preflight en los informes JSON y HTML - Nuevos interruptores de automatización de ComplianceWorkbench:
--quietimprime sólo el resumen por lote y las rutas de informe,--fail-fastdetiene el lote en el primer archivo que falla, y el informe JSON ahora registra la versión de la biblioteca
Version 3.71.2
Corregido
AppendToFilevuelve a anexar actualizaciones incrementales al mismo archivo PDF que se cargó conLoadFromFile; el cargador por streaming ahora mantiene legible el archivo de origen sin bloquear el identificador de escritura necesario para la actualización
Version 3.71.1
Añadido
- Los informes de ComplianceWorkbench y SigningWorkbench ahora incluyen etiquetas de severidad de hallazgos, campos por archivo de mayor severidad, resúmenes de frecuencia de severidad por lote y salidas coincidentes en JSON, CSV, HTML y consola para un triage de políticas más rápido
Version 3.71.0
Añadido
- La inspección de la demo SigningWorkbench ahora informa el orden de revisión y el nivel de certificación DocMDP de cada firma, marca algoritmos de firma de certificado MD5/SHA-1 débiles y el SubFilter heredado adbe.pkcs7.sha1 con
--forbid-weak-digest(SG303/SG405), certificados autofirmados con--forbid-self-signed(SG406), documentos sin una firma de certificación con--require-certified(SG304), y siempre comprueba si el tiempo de firma cae dentro del período de validez del certificado (SG407) - El modo de firma de SigningWorkbench ahora usa la API de proceso de firma con nuevos interruptores
--subfilter(sha1, detached o cades para firmas base PAdES) y--digest(auto hasta sha512), y el modernoadbe.pkcs7.detachedcon SHA-256 es ahora el valor predeterminado de firma - El nuevo acceso de sólo lectura
TPDFlibSignDoc.GetSignatureDocMDPLevelByNamedevuelve el nivel de certificación DocMDP de un campo de firma según ISO 32000-1 §12.8.2.2
Version 3.70.0
Añadido
- La demo ComplianceWorkbench ahora también aplica políticas de permisos, metadatos y tamaño:
--require-print-allowedy--require-copy-allowedrevisan los bits de permiso del documento (PC205/PC206),--require-authory--require-creation-daterevisan la completitud de los metadatos (PC306/PC307), y--max-pagesy--max-file-sizelimitan la escala del documento (PC308/PC309) - El perfil de archivo ahora también exige un autor y una fecha de creación, y el perfil accesible exige el permiso de copia en el que se apoya la tecnología de asistencia
- Los informes de ComplianceWorkbench ahora agregan un resumen de frecuencia de códigos de falla en todo el lote, y las métricas por archivo incluyen autor, fecha de creación, tamaño de archivo y los estados de permiso de impresión y copia
Version 3.69.1
Corregido
DecryptFilevuelve a quitar el cifrado de documentos protegidos con AES-128 y RC4, incluidos los documentos que sólo llevan una contraseña de propietario; desde v3.67.4 la ruta rápida para archivos grandes informó incorrectamente estos documentos como si tuvieran una contraseña errónea (error 404) en lugar de enviarlos a la ruta normal de descifrado, mientras que los documentos AES-256 no se veían afectados
Version 3.69.0
Añadido
- Nueva demo SigningWorkbench Delphi: una herramienta de consola tipo banco de trabajo para firmas y certificados que inspecciona los campos de firma de un PDF o de todo un directorio (SubFilter, tiempo de firma, cobertura de ByteRange y el certificado de firma con comprobaciones de expiración), firma PDFs por lotes con un certificado PKCS #12 y audita archivos PFX; cada violación se asigna a un código estable de falla de política (SG101–SG501) y los resultados se escriben como informes JSON, CSV y HTML con guías de demo localizadas para los 18 idiomas de documentación
- Nuevos accesos de sólo lectura de firma en
TPDFlibSignDoc:GetSignatureFieldNamesenumera los campos de firma de un documento,GetSignatureTextValueByNamedevuelve las entradas /M de tiempo de firma, /Name, /Reason, /Location, /ContactInfo y /Type (con descifrado en documentos cifrados), yGetSignatureValueByNamedevuelve /Filter, /SubFilter, /Contents y las entradas de ByteRange por nombre de campo
Corregido
- Se corrigió la importación de Windows CryptoAPI
CertCloseStore, que se declaraba sin su parámetro flags y podía corromper la pila del llamador en Win32 al cerrarse un almacén de certificados
Version 3.68.0
Añadido
- Nueva demo ComplianceWorkbench Delphi: una herramienta de consola para auditoría de políticas por lotes que revisa un PDF o todo un directorio contra una política de cumplimiento configurable que cubre preflight PDF/A y PDF/UA, reglas de cifrado, rango de versión PDF, Tagged PDF, linearization y título del documento, informa cada violación como un código estable de falla de política (PC101–PC501) y escribe informes JSON, CSV y HTML con códigos de salida aptos para automatización
- La nueva demo incluye perfiles de política que agrupan conjuntos de requisitos comunes—archive, accessible, secure y web—con interruptores explícitos de línea de comandos que sobrescriben los valores del perfil, e incluye guías de demo localizadas para los 18 idiomas de documentación
Version 3.67.4
Cambiado
EncryptFileyDecryptFileahora usan una ruta directa de reescritura AES-256 para PDFs grandes de classic-xref, transmitiendo datos cifrados entre archivos en lugar de cargar y volver a serializar cada objeto; un archivo de referencia de 2 GB ahora completa el cifrado y descifrado AES-256 de archivo a archivo a través de la Direct File API con código de resultado 1 yLastErrorCode0
Corregido
- Se corrigió el manejo directo de tokens de cadena AES-256 para que los delimitadores de diccionario no se confundan con cadenas hexadecimales y las cadenas vacías cifradas se descifren correctamente
Version 3.67.3
Cambios
- Se ampliaron los demos de Delphi y C++Builder para DrawShapes, CreateWithImage, CreateTable, EditFormField y EmbeddedFonts, de modo que los PDF generados ahora muestran flujos de trabajo prácticos de dibujo, colocación de imágenes, diseño de tablas, estilo de campos de formulario y comparación de incrustación de fuentes en vez de una salida mínima de una sola acción
Correcciones
- Se corrigió el demo CreateTable para definir un tamaño de página A4 explícito antes de renderizar la tabla, evitando la variable de tamaño de página sin inicializar que tenía antes el ejemplo Delphi
Version 3.67.2
Corregido
- Se corrigió una regresión de la detección diferida del lado del cargador introducida en v3.67.0: la detección de características de contenido podía ejecutarse al guardar y sobrescribir una versión de guardado solicitada explícitamente (SetInformation 0) o una versión bloqueada (LockSaveVersion), por lo que un guardado estricto a una versión inferior ya no rechazaba contenido de versión superior y una versión bloqueada podía subir; ahora la detección se ejecuta antes de cualquier versión establecida explícitamente y nunca se ejecuta en documentos creados en lugar de cargados, restaurando el comportamiento de control de versión anterior a v3.67.0 mientras conserva el ahorro del tiempo de carga diferida
Version 3.67.1
Cambiado
- La detección de características ahora lee los objetos de flujo con un análisis superficial que inspecciona solo el diccionario del objeto y omite el cuerpo del flujo, ya que el escaneo nunca examina el contenido de los flujos; en documentos con grandes flujos de imágenes esto evita leer los bytes del cuerpo durante la detección, reduciendo el tiempo de lectura de objetos de una pasada de detección en aproximadamente un 40% (unos 13 s en lugar de 20 s en un archivo de 2 GB con 1,6 millones de objetos), mientras la lista de características detectadas y la versión PDF efectiva permanecen idénticas
Version 3.67.0
Cambiado
- La detección de características de contenido del lado del cargador ahora es diferida (lazy) – en lugar de escanear todo el documento durante la carga, se ejecuta en el primer uso, al consultar la versión PDF efectiva o la lista de características detectadas, o al guardar el documento; las cargas de trabajo de solo lectura como el conteo de páginas, la extracción de texto o imágenes y el renderizado que nunca consultan la versión ni vuelven a guardar omiten por completo el escaneo, reduciendo el tiempo de carga de documentos muy grandes en aproximadamente un 80% (unos 10 s en lugar de 56 s en un archivo de 2 GB y 1,6 millones de objetos), mientras que el conjunto de características detectadas y la versión PDF efectiva permanecen idénticos una vez que se ejecuta la detección
Version 3.66.1
Cambiado
- La carga de documentos muy grandes de varias páginas ahora es mucho más rápida: la detección de características de contenido del lado del cargador omite verificaciones de reglas que no pueden cambiar el resultado – tanto reglas que ya coincidieron como reglas que no se pueden aplicar a un objeto dado – lo que reduce aproximadamente a la mitad el tiempo de carga en archivos enormes y mantiene idénticas las características detectadas y la versión efectiva de PDF
Version 3.66.0
Cambiado
- Cargar documentos multipágina muy grandes ahora requiere mucho menos memoria en su punto máximo. La detección de características de contenido en el cargador ya no materializa todo el modelo de objetos de una sola vez – va leyendo un objeto a la vez a través del lector de acceso aleatorio – lo que reduce el working set máximo aproximadamente un 90 % en archivos enormes sin alterar las características detectadas ni la versión PDF efectiva.
Version 3.65.0
Añadido
- Ahora se pueden abrir documentos de más de 2 GB. Se eliminó el búfer en memoria anterior que limitaba el tamaño del documento a unos 2 GB.
Cambiado
- Al cargar un PDF desde un archivo, los datos de los objetos ahora se leen a demanda desde el origen en lugar de almacenar todo el documento en memoria, lo que reduce notablemente el uso máximo de memoria con archivos grandes.
- Un documento cargado desde un archivo mantiene ese archivo abierto con acceso de lectura compartida hasta que el documento se cierra o se vacía.
Corregido
- Mayor robustez al cargar documentos que contienen bytes iniciales antes del encabezado %PDF- y al procesar datos de cross-reference con formato incorrecto.
Version 3.64.0
Cambiado
- Las operaciones de la API Direct en archivos PDF muy grandes o con muchos objetos – EncryptFile, DecryptFile y DASaveAsFile – ahora son drásticamente más rápidas y ya no se bloquean. Un documento de 2 GB con alrededor de 1.6 millones de objetos que antes no podía completarse ahora se cifra en aproximadamente un minuto, y el tiempo de procesamiento escala de forma casi lineal con el documento en lugar de desplomarse a medida que crece el número de objetos.
- El cifrado de documentos grandes es considerablemente más rápido – una operación que antes tardaba muchos minutos ahora se completa en segundos o aproximadamente un minuto – sin cambios en la fuerza del cifrado, la compatibilidad del texto cifrado ni la salida.
Version 3.63.0
Corregido
- Se corrigió un bloqueo del proceso al cargar archivos PDF grandes cuyos desplazamientos de bytes internos cruzan el límite de 32 bits (unos 2 GB); el cargador ahora usa desplazamientos de 64 bits en todo momento, por lo que los archivos cercanos a 2 GB se cargan de forma confiable y los archivos de 2 GB o más informan de un error de carga correctamente en lugar de bloquearse.
Version 3.62.0
Cambiado
- El cifrado y descifrado AES-256-CBC ahora también toman la ruta AES-NI acelerada por hardware en Windows de 32 bits, no solo en 64 bits, manteniendo el repliegue automático a la implementación en C portable en procesadores sin AES-NI. El texto cifrado no cambia en ninguna plataforma.
Version 3.61.0
Cambiado
- El cifrado y descifrado AES-256-CBC ahora utilizan un backend AES-NI acelerado por hardware en Windows de 64 bits, con un repliegue automático a la implementación de software portable en procesadores que carecen de AES-NI. El texto cifrado es idéntico en todas las plataformas; solo cambia la velocidad del cifrado PDF AES-256 basado en contraseña.
Version 3.60.0
Añadido
MergeFileListahora combina los árboles de estructura lógica (Tagged PDF) de los documentos de entrada en un único árbol de estructura accesible, en lugar de conservar solo el árbol del primer documento y dejar los demás como objetos inalcanzables. Los elementos de estructura de nivel superior, el parent tree (con las claves de página/StructParentsy de anotación/StructParentreasignadas),/RoleMap,/ClassMape/IDTreese combinan, y el catálogo combinado se marca como Tagged (/MarkInfo /Marked true).
Cambiado
- Al combinar documentos con claves
/RoleMap,/ClassMapo/IDTreeen conflicto se conserva la primera aparición. La ruta rápida (MergeFileListFast) sigue descartando la información de estructura.
Version 3.59.0
Cambiado
MergeFileListahora combina los documentos en una sola pasada (O(N) en lugar de O(N²)), lo que acelera notablemente la combinación de muchos archivos; además incorpora la combinación de marcadores multidocumento agregada a la ruta rápida.- De forma predeterminada,
MergeFileListahora omite los archivos de entrada ilegibles o cifrados y continúa combinando el resto, en lugar de abortar toda la operación al encontrar el primer archivo defectuoso. Use el nuevoMergeFileListStrictpara restaurar el comportamiento anterior de detenerse ante la primera falla. - Los objetos de estructura lógica (Tagged PDF) de las entradas ahora se conservan en
MergeFileList(la ruta rápida los sigue descartando).
Añadido
MergeFileListStrictcombina una lista de archivos pero se detiene en el primer archivo ilegible o cifrado, manteniendo la semántica estricta de detención ante fallas de versiones anteriores.
Version 3.58.0
Añadido
MergeFileListFastahora combina los marcadores (esquemas) del documento de todos los archivos de entrada, por lo que la ruta de combinación rápida conserva los marcadores además de los campos de formulario AcroForm.- Los marcadores combinados conservan su jerarquía y sus destinos de página; la cantidad de marcadores de nivel superior de la salida combinada es igual a la suma de las entradas.
Version 3.57.1
Cambiado
- El guardado mediante la Direct File API (
DASaveAsFile,DASaveToStream,DASaveCopyToStream) ahora es mucho más rápido en documentos muy grandes: los objetos sin cambios se copian directamente de los bytes de origen en lugar de volver a analizarse y serializarse. Volver a guardar un documento de 60,000 páginas / 883 MB bajó de unos 33 segundos a aproximadamente 23 segundos.
Version 3.57.0
Cambiado
- Se ha optimizado aún más
TPDFlib.MergeFileListFastpara fusiones de múltiples documentos: los objetos no modificados sin flujo en los documentos adjuntados ahora se reutilizan directamente desde sus bytes de origen originales con un desplazamiento de referencia indirecta a nivel de bytes, omitiendo el ciclo de análisis y reserialización y mejorando el rendimiento en documentos de varias páginas. La salida de fusión no cambia, con recuentos de páginas idénticos. - Los objetos que contienen flujos o pertenecen al árbol de estructura continúan utilizando la ruta de decodificación existente, por lo que la ruta de bytes más rápida se aplica solo donde es comprobablemente segura.
Version 3.56.44
Cambiado
- Se optimizó
TPDFlib.MergeFileListFastal preasignar los metadatos de fusión y escribir los objetos sin cambios del primer documento desde sus datos de origen originales, reduciendo la presión de memoria y el trabajo evitable de decodificación/salida de objetos en fusiones rápidas de varios archivos. - La GUI Delphi
MergePDFahora agrupa el registro de resultados del modo rápido y evita escaneos repetidos de todo el texto del memo, manteniendo más ágiles las listas de entrada grandes después de completar una fusión.
Version 3.56.43
Cambiado
- Se optimizó la ruta de combinación ordinaria de
TPDFlib.MergeFileListalternando sus archivos temporales intermedios en lugar de copiar el PDF combinado en crecimiento antes de cada entrada adicional, lo que reduce la E/S de disco en flujos con varios archivos y conserva el contrato existente de recuento devuelto.
Version 3.56.42
Añadido
- Se añadió cobertura de regresión AES para los casos en que el búfer de entrada y el resultado comparten el mismo destino durante la restauración de streams cifrados al guardar, incluidos payloads grandes de 504 KB que antes exponían el fallo.
Cambiado
- El flujo de la API normal
LoadFromFile,Encrypt,SaveToFile, recarga,DecryptySaveToFilevuelve a completarse en PDFs grandes cargados, conservando la optimización de descifrado AES-CBC con menos copias.
Corregido
- Se corrigió la ruta de descifrado AES-256 basada en búfer introducida en v3.56.41 para que los llamadores puedan asignar el resultado de descifrado al mismo
AnsiStringque proporcionó el búfer de texto cifrado sin provocar infracciones de acceso.
Version 3.56.41
Añadido
- Se agregó
TPDFlib.DACopyFilepara flujos Direct Access que necesitan el conteo de páginas y una copia de archivo sin cambios sin construir el grafo completo de objetos normal. - La demo Delphi
HugeFileBenchmarkahora incluye una filadirect-copyy filtros--opsy--skippara ejecuciones enfocadas en archivos grandes.
Cambiado
- Se optimizó el descifrado AES-256 agregando rutas AES-CBC basadas en búfer y usándolas al descifrar cadenas y streams cargados, lo que reduce copias adicionales de texto cifrado en streams cifrados grandes.
Version 3.56.40
Cambiado
- Las demos
HelloWorldde Delphi y C++Builder ahora crean un PDF inicial más completo con información del documento, salida con una fuente estándar seleccionada, un bloque de título con estilo, dibujo vectorial sencillo y orientación para los siguientes pasos, manteniendo el mismo flujo de compilación y ejecución. - Todas las notas de las demos de Delphi y C++Builder se han reemplazado por páginas
Readme.htmlfáciles de leer en el navegador, incluidas las notas auxiliares de contraseñas, archivos restringidos y resultados de firma; los índices de demos ahora dirigen a los usuarios a las notas HTML.
Version 3.56.39
Cambiado
- Las rutas de guardado de la API de archivos directos ahora construyen tablas de búsqueda de referencias cruzadas de forma lineal, lo que hace que
DASaveAsFiley las rutas de guardado directo relacionadas sean mucho más rápidas en PDFs con muchísimos objetos o árboles de páginas densos. - El escritor optimizado conserva la misma semántica de la cadena de objetos libres y evita escaneos repetidos de números de objeto durante la generación completa de xref, mejorando los flujos de guardado directo grandes sin cambiar la API pública ni el contrato de salida.
Version 3.56.38
Cambiado
- El flujo de la API normal
LoadFromFile,Encrypt,SaveToFile, recarga,DecryptySaveToFileahora conserva el estado cifrado antes delDecryptexplícito, igualando el comportamiento de la API de acceso directo a archivos para PDFs heredados grandes.
Corregido
- Se corrigió la salida de cifrado de la API normal para que
Encryptcree o conserve el identificador de trailer/IDantes de escribir los datos de seguridad AES-256, manteniendo los PDFs cifrados detectables al recargarlos medianteEncryptionStatus.
Version 3.56.37
Añadido
- Se anadio
TPDFlib.ComparePreflightReports, un comparador linea por linea para informes de preflight en texto sin formato que ignora las lineas de marca temporal volatilesGenerated:y devuelve una cadena vacia cuando el contenido estable del informe coincide. - La demo Delphi
PreflightReportahora admite--compare <file>en modo de archivo unico, escribe un informe UTF-8.diff.txty devuelve el codigo de salida 2 cuando el informe de texto generado difiere de la baseline.
Version 3.56.36
Añadido
- La demo Delphi
PreflightReportahora admite ejecuciones por lotes de directorios con--input-dir,--output-diry--recursive, escribiendo un informe por cada PDF como<basename>.preflight.<ext>.
Cambiado
- El modo por lotes escribe un archivo UTF-8
preflight-summary.csvque registra cada PDF de origen, el estado pass/fail, el recuento de problemas y la ruta del informe generado, conservando el contrato de codigos de salida existente para automatizacion.
Version 3.56.35
Añadido
ReportFormat = 3agrega salida CSV aTPDFlib.CreatePreflightReportExyTPDFlib.SavePreflightReportEx, generando filas UTF-8 para los metadatos del informe, cada comprobacion de cumplimiento seleccionada, codigos y mensajes de problemas individuales, y el resumen final.- La demo Delphi
PreflightReportahora admite--format csvy--csv, de modo que las ejecuciones de preflight desde la linea de comandos puedan alimentar hojas de calculo o analizadores de CI simples sin posprocesar JSON ni extraer texto.
Version 3.56.34
Añadido
- Se agregaron las API con formato
TPDFlib.CreatePreflightReportExyTPDFlib.SavePreflightReportExpara generar informes de preflight PDF/A y PDF/UA-1 como texto plano, JSON o HTML independiente, conservando las API existentes solo de texto. - La demo Delphi
PreflightReportahora admite--format text|json|htmly los atajos--jsony--html, por lo que el mismo flujo de línea de comandos puede producir informes legibles o artefactos de CI legibles por máquina.
Version 3.56.33
Añadido
- Se agregaron
TPDFlib.CreatePreflightReportyTPDFlib.SavePreflightReportpara que las aplicaciones puedan generar informes de texto reutilizables desde las comprobaciones integradas de conformidad PDF/A y PDF/UA-1 sin enumerar manualmente los identificadores de listas de cadenas.
Cambiado
- La demo Delphi
PreflightReportahora llama directamente a las API de informe de la biblioteca, manteniendo el ejemplo centrado en el flujo de línea de comandos, las comprobaciones seleccionadas, el modo de primer problema y los códigos de salida aptos para automatización.
Version 3.56.32
Añadido
- Se agregó un nuevo ejemplo de consola Delphi
PreflightReportque ejecuta comprobaciones PDF/A y PDF/UA-1 conCheckFileCompliance, enumera las listas de incidencias conGetStringListCountyGetStringListItem, y escribe un informe de preflight en texto plano.
Cambiado
- El ejemplo admite las opciones
--input,--output,--pdfa,--pdfua,--bothy--first-issue, además de códigos de salida para resultados aptos para automatización: correcto, incidencias encontradas y error de ejecución.
Version 3.56.31
Cambiado
GetCustomKeys(2)ahora oculta de forma consistente las entradas del sistema de catálogo gestionadas por la biblioteca, incluyendo/OutputIntents,/Extensions,/Requirements,/Collectiony/NeedsRendering.
Corregido
- Los perfiles de salida PDF/A creados por
SetPDFAModeya no aparecen como claves personalizadas en el catálogo, manteniendo la enumeración de metadatos de la aplicación separada de las estructuras de cumplimiento de PDF.
Version 3.56.25
Cambiado
- El componente GetPDFUADiagnostics en el lado del escritor ahora tiene el mismo problema que
MULTIPLE-H-CHILDREN:N, lo que lo alinea con el lector10044desde v3.56.24. ISO 14289-1 §7.4.4 prohíbe que un nodo de árbol de etiquetas tenga más de un hijo directo H; la verificación del lado del escritor se activa cada vez que el árbol FStructElems en memoria contiene una violación de este tipo. - Un nuevo componente CountMultipleHChildren auxiliar recorre el árbol en profundidad, contando los hijos H en cada nivel. La verificación se ejecuta junto con los recorridos existentes de LIST-STRUCT / LIST-NO-NUMBERING y comparte el mismo patrón de recorrido FStructElems.
Version 3.56.24
Cambiado
- La auditoría PDF/UA-1 ahora incluye una verificación de unicidad de etiquetas H ISO 14289-1 §7.4.4.
10044informa sobre cualquier nodo de estructura que tenga más de un hijo H directo; —, según la especificación, esto está prohibido en documentos con estructura rígida, y la misma restricción se aplica a cualquier nodo de árbol de etiquetas, independientemente del modo de estructura general. La otra sección § 7.4.4 SHALL (un documento debe tener una estructura rígida o débil, pero no ambas) requiere heurísticas a nivel de documento y se excluye intencionalmente de esta auditoría. - Un nuevo recorrido de árbol de estructura en preorden (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) cuenta los hijos H directos por nodo y se recursa en profundidad. Reutiliza el mismo decodificador en forma de K que los recorridos existentes de encabezado, lista y nota.
Version 3.56.23
Añadido
- El nuevo
Lib/PDFlibPDFUAFontInspect.pasimplementa un analizador de directorio de tablas tolerante y un analizador de directorio de subtables cmap. La tabla Adobe Glyph List de 4281 nombres, que se agregó como estructura de soporte en el commit de infraestructura anterior, ahora está conectada a través de la verificación de Diferencias. Los programas que no se analizan como SFNT (fuente PFB / PFA, colección OpenType, basura arbitraria) se omiten silenciosamente; se prefieren los falsos negativos a los falsos positivos en la capa de auditoría.
Cambiado
- La auditoría PDF/UA-1 ahora incluye dos verificaciones de programas de fuentes ISO 14289-1 §7.21.6 que las verificaciones de la capa de diccionario de v3.56.10 tenían que posponer hasta que estuviera disponible un analizador TrueType.
10034informa sobre programas TrueType no simbólicos cuyos cmap incrustados SFNT contienen solo la entrada simbólica (platformID=3, encodingID=0) — §7.21.6 El primer párrafo requiere al menos una subtabla cmap no simbólica para que el programa pueda renderizar los puntos de código declarados por su /Encoding..10035informa sobre arreglos TrueType no simbólicos/Encoding /Differencescuyas nombres de glifos no son miembros de la lista de glifos de Adobe (.notdefexcluido). — §7.21.6 El tercer párrafo requiere que cada entrada de Diferencias se encuentre en AGL.
Version 3.56.22
Cambiado
- La auditoría PDF/UA-1 ahora incluye verificaciones de datos de clip multimedia.
10042informa sobre diccionarios de datos de clip multimedia (identificados por/S /MCD, opcionalmente/Type /MediaClip) que carecen de la entrada obligatoria de tipo de contenido/CT.10043informa sobre los mismos diccionarios que carecen del arreglo/Altrequerido. ISO 32000-1 La Tabla 274 enumera ambas claves como opcionales, pero ISO 14289-1 §7.18.6 las promueve a obligatorias para que los lectores de pantalla puedan anunciar una descripción significativa para los multimedia integrados. - Esta es la Fase 6 del plan de auditoría profunda PDF/UA (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). Se ejecuta sin ninguna dependencia del analizador de programas de fuentes ni del flujo de contenido, por lo que es la primera subclase posterior a la serie v3.56.0..v3.56.13.
Version 3.56.21
Añadido
- El nuevo
SetSignProcessCommitmentTypeemite el atributo firmado CAdEScommitment-type-indication(OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) dentro del PAdES-B-B SignerInfo. Acepta códigos enteros del 1 al 6 que se mapean a los conocidos esquemas de compromiso ETSIid-cti-ets-proofOfOrigina través deid-cti-ets-proofOfCreation; pase 0 para borrar. Los códigos fuera de rango son rechazados. - El nuevo
SetSignProcessSignaturePolicyemite el atributo firmado CAdESsignature-policy-identifier(OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Toma la política en formato decimal punteado OID, el hash del documento de política como una cadena hexadecimal en mayúsculas y un código de algoritmo de resumen (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=auto/SHA-256). El atributo lleva laSignaturePolicyIdSEQUENCE consigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE).
Cambiado
- Ambos atributos solo tienen efecto cuando el SubFilter es
ETSI.CAdES.detached(la ruta PAdES-B-B); extienden el arrayrgAuthAttrexistente junto concontent-typeysigning-certificate-v2. La fila d) de la PAdES Tabla 1 prohíbe combinarcommitment-type-indicationcon la entrada del diccionario de firmas PDF/Reason; el llamador es responsable de no establecer ambos.
Version 3.56.20
Añadido
- El nuevo
AddPAdESDSSVRIadjunta una entrada de subdiccionario de Firma VRI al DSS que se está ensamblando, completando la estructura de Validación Relacionada con la cláusula 5.4.2.3 de ETSI EN 319 142-1 v1.2.1. La entrada se clavea con el SHA-1 en mayúsculas y hexadecimal de los bytes de la firma '; sus sub-arreglosCert/CRL/OCSPse completan haciendo referencia a los flujos principales correspondientes mediante índices basados en 0 proporcionados como listas separadas por comas (por ejemplo,"0,2,5").
Cambiado
- El
TSmartPDFDocument.AddPAdESDSSWithVRIsubyacente realiza un seguimiento de los números de objeto de flujo emitidos para cada certificado / CRL / OCSP y los utiliza para escribir los sub-arreglos VRI como referencias indirectas de nuevo a los mismos flujos a los que ya apuntan los arreglos principales DSS, cumpliendo con el requisito de la especificación de que las entradas de VRI compartan almacenamiento con el diccionario principal DSS. El punto de entradaAddPAdESDSSoriginal sigue funcionando sin cambios para los clientes que no necesitan VRI. - Cada subdiccionario VRI por firma lleva el marcador opcional
/Type /VRI, por lo que las herramientas que recorren el catálogo por etiquetasTypepueden reconocer la estructura sin volver a resolver la ruta principal.
Version 3.56.19
Añadido
- Nuevo flujo de trabajo PAdES-B-T para adjuntar una firma y una marca de tiempo (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) a una firma PAdES-B-B existente.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringabre un PDF firmado,SetPAdESSignatureTimeStampFieldnombra el campo,GetPAdESSignatureValueHashHexdevuelve el hash SHA-256 (o 384 / 512) del identificador del firmante ' para su envío a un TSA,GetPAdESSignatureCMSBytesexpone la carga útil existente CMS,SetPAdESSignatureCMSBytesacepta los bytes aumentados CMS que el llamador ensambla mediante su CMS biblioteca de elección, yEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringune la nueva CMS en el marcador de posición original/Contents. - El nuevo
SetSignProcessReserveContentsBytesamplía el marcador de posición/Contentsen el momento de la firma inicial para que el CMS aumentado posteriormente quepa sin desbordarse de la reserva original. Los atributos TimeStampTokens típicamente emitidos por13agregan de 2 a 6 KB al SignerInfo; pase 1024-8192 aquí para dejar espacio. Si no hay suficiente reserva, la llamada de aumento devuelve13(desbordamiento de salida).
Cambiado
BuildPAdESSignatureTimeStampAttributees un ayudante sin estado que envuelve un TimeStampToken emitido por TSA en el atributo CMS queSignerInfo.unsignedAttrsespera, por lo que los llamadores que ya tienen una biblioteca CMS a mano pueden omitir la parte de tuberías OID + SET.- La biblioteca no incluye un cliente TSA HTTP; el llamador recupera el TimeStampToken (típicamente 30-50 líneas de solicitud TSP + HTTP POST contra, por ejemplo, FreeTSA o DigiCert). En Windows,
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRCryptoAPI idealmente automatizaría la inyección CMS en la biblioteca, pero devuelveCRYPT_E_INVALID_INDEX(0x80091008) en la forma separada SignedData PAdES emitida, por lo que se utiliza la ruta de bytes suministrada por el llamador CMS.
Version 3.56.18
Añadido
- Los nuevos ayudantes ASN.1
DER_IntegerFromLittleEndian(maneja el orden de bytes Win32CRYPT_INTEGER_BLOB) yDER_ContextTagExplicit(envuelve una carga útil en una etiqueta contextual construida) completan el micro-codificadorPDFlibASN1. Las nuevas declaracionesCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTenPDFlibCryptoAPIdan al camino de firma acceso a los campos del certificado analizados.
Cambiado
- El atributo PAdES
signing-certificate-v2ahora incrusta el campo opcionalIssuerSerialdefinido por RFC 5035 (ESSCertIDv2). El nombre distinguido del emisor del certificado de firma se envuelve en unGeneralName [4] EXPLICIT directoryNameCHOICE dentro deGeneralNames, seguido del número de serie del certificado como un ASN.1 INTEGER. Los bytes del número de serie llegan en orden de bytes little-endian desde Windows CryptoAPI (CRYPT_INTEGER_BLOB) y se invierten a big-endian con la adición del byte de relleno de entero positivo cuando se establece el bit más significativo, lo que coincide con la forma en que OpenSSL y BouncyCastle emiten el mismo campo. - Los verificadores que comprueban el nombre del emisor + el par de números de serie contra su conjunto de candidatos de construcción de rutas (específicamente EU DSS en modo estricto) ahora encuentran ambos identificadores en el atributo signing-cert-v2; la salida anterior v3.56.17 proporcionaba solo la referencia
certHash.
Version 3.56.17
Añadido
- La nueva unidad
PDFlibASN1proporciona un microcodificador DER (X.690) enfocado — prefijo de longitud, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — usado para construir el valor del atributoSigningCertificateV2. El codificador sigue las reglas estándar para arcos OID base-128 y omite el campo opcionalhashAlgorithmcuando este solo repetiría el valor por defecto SHA-256, coincidiendo con lo que emiten OpenSSL y BouncyCastle.
Cambiado
- La ruta de firma incorporada
ETSI.CAdES.detachedahora produce firmas PAdES-B-B estructuralmente conformes. La biblioteca construye por sí misma los atributos autenticados CMS —content-type(id-data) ysigning-certificate-v2de RFC 5035 / RFC 5816 con un hash SHA-256 del certificado de firma — y los entrega aCryptSignMessagea través dergAuthAttr. Una vez que ese campo deja de ser NULL, la Windows CryptoAPI deja de auto-inyectar el atributosigning-timeque PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) prohíbe, por lo que elSignerInforesultante porta los atributos requeridos y solo esos. ApplySignatureahora enrutaETSI.CAdES.detachedpor la vía raw-byte (la misma que usaadbe.pkcs7.detached) en lugar de alimentar un digest precalculado. La CryptoAPI computa ahora el atributo autenticadomessageDigestsobre el contenido realmente firmado, que es lo que esperan los verificadores.- SHA-384 y SHA-512 también se respetan al construir el atributo signing-certificate-v2: el campo
hashAlgorithmse emite con elAlgorithmIdentifiercorrespondiente en lugar de depender del valor por defecto. SHA-1 se promueve silenciosamente a SHA-256 en este contexto porque PAdES-B-B no autoriza SHA-1 (clause 6.2.1).
Version 3.56.16
Añadido
- El nuevo
SetSignProcessDigestAlgorithmselecciona el algoritmo de message-digest para la firma:1= SHA-1 (deprecated),2= SHA-256 (valor por defecto moderno),3= SHA-384,4= SHA-512,0= auto (SHA-256 para cada SubFilter excepto la ruta heredadaadbe.pkcs7.sha1, que se mantiene en SHA-1 por compatibilidad binaria estable). ETSI EN 319 142-1 v1.2.1 §6.2.1 prohíbe MD5 y delega en ETSI TS 119 312 las suites criptográficas recomendadas, por lo que los firmantes PAdES deben elegir SHA-256 o más fuerte. - Se añaden los helpers de hash
SHA256StreamRange,SHA384StreamRangeySHA512StreamRangejunto alSHA1StreamRangeexistente; la ruta de firma los utiliza para resumir el ByteRange del PDF bajo el algoritmo seleccionado. Ahora se garantiza que el OIDSignerInfo.digestAlgorithmde PKCS#7 y los bytes de hash escritos coincidan (el código previo siempre pasaba el digest SHA-1 sin importar el algoritmo negociado).
Cambiado
TPDFlibPFXFile.SignDataahora toma un parámetroDigestAlgorithmy elige el OID correcto para cada par (SubFilter, algoritmo):2.16.840.1.101.3.4.2.1/.2/.3para SHA-256/384/512 en SubFilters detached y custom (RFC 5754), y los OIDs de la familiasha256WithRSAEncryptioncorrespondientes para la ruta heredadaadbe.pkcs7.sha1.
Version 3.56.15
Añadido
- El nuevo
SetSignProcessDocTimeStampcambia un sign process al modo PAdES Document Time-stamp según ETSI EN 319 142-1 v1.2.1 §5.4.3. El Signature Dictionary resultante lleva/Type /DocTimeStampy/SubFilter /ETSI.RFC3161, omite las claves no permitidas/M,/Reason,/Location,/ContactInfoy/Name, y reserva un marcador hex de 8192 bytes (o del tamaño especificado por el llamador) en/Contentspara un TimeStampToken RFC 3161 obtenido externamente.
Cambiado
- El passthrough se activa automáticamente cuando se selecciona el modo DocTimeStamp porque el TimeStampToken procede de una TSA externa. Las llamadas a
SetSignProcessInfohechas tras cambiar al modo DocTimeStamp se ignoran silenciosamente para mantener el signature dictionary conforme a la especificación. - La auto-inyección PAdES
/Extensions /ESICexistente añadida en v3.56.8 ya cubre DocTimeStamp porque su SubFilter comienza conETSI., de modo que un PDF Document Time-stamp declara la extensión de catálogo requerida sin cableado adicional.
Version 3.56.14
Añadido
- Nueva API de aumento PAdES Document Security Store (DSS).
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringabren un PDF previamente firmado,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPpreparan material de validación codificado en DER, yEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringescriben una actualización incremental que contiene un diccionario/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>según especifica ETSI EN 319 142-1 v1.2.1 §5.4.2.2. Esta es la pieza base para promover una firma PAdES-B-B / B-T a una validación a largo plazo PAdES-B-LT.
Cambiado
- El DSS process actualiza automáticamente la entrada
/Extensions /ESICdel catálogo a al menosExtensionLevel 1al añadir material de validación, ajustándose al requisito de §5.6, y fusiona nuevos certificados, CRLs y respuestas OCSP en los arrays existentes/Certs//CRLs//OCSPsen invocaciones repetidas, de modo que las revisiones se acumulan en lugar de sobrescribirse. GetPAdESDSSProcessResult/ReleasePAdESDSSProcesscompletan el ciclo de vida, reflejando la superficie existente de la APISignProcess.
Version 3.56.8
Cambiado
- Conformidad baseline PAdES: cuando se crea una firma con un SubFilter PAdES (
ETSI.CAdES.detachedoETSI.RFC3161), el catálogo del documento recibe ahora automáticamente la entrada/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>requerida por ETSI EN 319 142-1 v1.2.1 §5.6. La entrada se añade a través de la misma actualización incremental que lleva la firma, nunca rebaja un/ExtensionLevelsuperior existente, y sigue las referencias indirectas/Extensionso/ESICcuando el PDF de origen ya las almacena como objetos separados. - El marcador de extensión equivalente de Adobe escrito por SetSignProcessCustomSubFilter para PDFs creados a través de
TPDFlibes ahora/ADBE /BaseVersion /1.7 /ExtensionLevel 8(antesExtensionLevel 5), coincidiendo con la declaración alternativa que las firmas PAdES baseline pueden usar; el nivel 5 sólo cubría características de formularios / 3D / RichMedia de ISO 32000-2 y no identificaba en realidad las extensiones PAdES.
Version 3.56.13
Cambiado
- Cuando SetPDFUAMode está activo y el documento se guarda, todo elemento de estructura L (lista) que carezca de un atributo
ListNumberingexplícito recibe ahora automáticamente/O = List /ListNumbering = None. ISO 14289-1 §7.6 exige que toda etiqueta L declare su estilo de numeración; la nueva corrección en tiempo de guardadoApplyPDFUAListNumberingse une a la familia existenteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet. - Los autores que se preocupen por un estilo de lista específico deben seguir llamando a SetStructElemListNumbering antes de EndTag; la auto-corrección sólo se dispara cuando no hay atributo ListNumbering presente en tiempo de guardado, de modo que los valores explícitos se conservan.
- El mensaje de diagnóstico del lado del escritor
LIST-NO-NUMBERING:Nahora indica que la auto-corrección enmascarará el problema en tiempo de guardado, de modo que los usuarios entiendan tanto el atributo faltante como el comportamiento de reparación automática.
Version 3.56.12
Cambiado
- La auditoría PDF/UA-1 gana tres nuevas verificaciones ISO 14289-1.
10031informa de anotaciones Link cuyo diccionario de acción URI lleva/IsMap = true(prohibido por §7.18.5 a menos que se proporcione funcionalidad equivalente en otro lugar del contenido; los autores con un caso de uso legítimo de IsMap pueden suprimir el diagnóstico por su cuenta).10032informa de elementos de estructuraNotea los que les falta la entrada/ID— §7.9 exige que toda etiqueta Note declare un ID único.10033informa del recuento de pares duplicados cuando dos o más etiquetas Note comparten el mismo valor/ID. - La detección de colisión de IDs de Note se realiza recogiendo los IDs en una TStringList ordenada y recorriendo pares adyacentes, de modo que un grupo de tres Notes compartiendo un ID cuenta como dos pares duplicados.
- La verificación de la acción URI recorre el array
/Annotsde cada página, filtra por/Subtype /Link, y luego inspecciona/A /S /URIy el booleano/IsMap. Las referencias indirectas se desreferencian en cada paso de modo que los diccionarios de acción separados se comportan igual que los inline.
Version 3.56.11
Cambiado
- ISO 14289-1 §7.6 exige que todo elemento de estructura L (lista) lleve un atributo
ListNumberingexplícito.10030(lado lector) yLIST-NO-NUMBERING:N(lado escritor) informan de las etiquetas L que lo omiten. El walker del lado lector decodifica ambas formas de/A(diccionario único de atributos, o un array de diccionarios mezclados con enteros de revisión) y busca la clave/ListNumberingindependientemente del propietario. La verificación del lado escritor inspeccionaTPDFStructElem.Attributespara el mismo nombre tanto en la lista de estructura finalizada como en la pila de etiquetas aún abierta. - Los valores válidos de
ListNumberingsegún ISO 32000-1 Table 347 sonNone,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. La auditoría sólo verifica la presencia de la clave, no qué valor se elige — toda etiqueta L necesita uno de estos.
Version 3.56.10
Cambiado
- La auditoría PDF/UA-1 gana las reglas de codificación TrueType de ISO 14289-1 §7.21.6.
10028informa de fuentes TrueType no simbólicas cuyo/Encoding(o el/BaseEncodingdentro de un diccionario Encoding) no es niMacRomanEncodingniWinAnsiEncoding.10029informa de fuentes TrueType simbólicas que llevan una entrada/Encodingen absoluto (prohibido por el cuarto párrafo de §7.21.6). - Simbólico vs. no simbólico se decide a partir del bit 3 (máscara
4) de los/Flagsdel FontDescriptor, reutilizando el helper existenteUAFontDescriptorSymbolicde la subclase 4. El primer párrafo completo de §7.21.6 (el programa TrueType incrustado debe contener entradas cmap coincidentes) requiere analizar el programa de fuente TrueType y sigue pendiente; las reglas a nivel de diccionario anteriores son la capa práctica que esta auditoría puede verificar sin un parser TrueType. - Las reglas de array Differences de §7.21.6 (nombres de glifo sólo AGL, presencia de cmap Microsoft Unicode) quedan fuera de alcance por la misma razón — requieren la inspección del programa de fuente.
Version 3.56.9
Cambiado
- La auditoría PDF/UA-1 gana una verificación completa de ISO 14289-1 §7.18.4.
10027informa de anotaciones Widget cuyo/StructParentresuelve a través del/ParentTreedel árbol de estructura pero no aterriza en un elemento de estructura con/S = Form. La verificación parcial anterior de v3.56.7 (10026) sólo capturaba Widgets que carecían completamente de/StructParent; la nueva verificación completa la regla siguiendo el puntero del number-tree y verificando la etiqueta de destino. - Un nuevo helper
NumberTreeLookupimplementa la forma de number-tree de ISO 32000-1 §7.9.7 (raíz plana/Nums,/Kidsintermedios delimitados por/Limits). Auditorías futuras que necesiten resolver entradas de página/StructParentso etiquetas/PageLabelspueden reutilizarlo. - La verificación de la etiqueta Form para la anotación Widget usa un modelo de dos niveles: un Widget sin
/StructParentse informa como10026; un Widget cuyo/StructParentexiste pero no resuelve a/S = Formse informa como el más específico10027. Esto evita el doble recuento de la misma violación bajo ambos códigos.
Version 3.56.7
Cambiado
- Cuando SetPDFUAMode está activo y el documento se guarda, todas las entradas de anotación
TrapNetse eliminan ahora automáticamente del array/Annotsde cada página. ISO 14289-1 §7.18.2 prohíbe las anotacionesTrapNet; la nueva corrección en tiempo de guardadoApplyPDFUAStripTrapNetse une a la familia existenteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationshipde modo que los documentos en modo PDF/UA dejan de emitir silenciosamente restos deTrapNet. - La auditoría PDF/UA-1 gana una verificación parcial de §7.18.4.
10026informa de anotaciones Widget a las que les falta/StructParent— un Widget sin/StructParentno puede alcanzarse desde el árbol de estructura y, por tanto, no puede estar anidado en una etiqueta de estructuraForm. La verificación estructural completa (resolución de/StructParenta través delParentTreey confirmación de que el/Spadre esForm) se deja para una release de seguimiento. - GetPDFUADiagnostics del lado escritor gana el problema correspondiente
WIDGET-NO-STRUCTPARENT:N. El mensaje TRAPNET-ANNOT existente ahora también indica que SetPDFUAMode auto-elimina éstos en tiempo de guardado.
Version 3.56.6
Cambiado
- La auditoría PDF/UA-1 gana dos verificaciones de jerarquía de encabezados de ISO 14289-1 §7.4.2.
10024informa cuando el primer elemento de encabezado en orden de documento no es H1 (o H).10025informa del número de saltos de nivel de encabezado en una secuencia descendente (p. ej. H1 seguido de H3 sin H2). Ambas verificaciones comparten un único recorrido en preorden del árbol de estructura que decodifica las formas anidadas/K(StructElem único, array de StructElems / IndRefs / MCRs). - GetPDFUADiagnostics del lado escritor gana el problema correspondiente
FIRST-HEADING-NOT-H1, en paridad con el lector10024. La verificación del escritor HEADING-LEVEL-SKIP preexistente tiene ahora un compañero que también captura problemas del estilo "el primer encabezado fue H2".
Version 3.56.5
Cambiado
- Cuando SetPDFUAMode está activo y el documento se cifra más tarde, la clave de permisos de cifrado (
/Pen el diccionario de cifrado) tiene ahora automáticamente el bit 10 (máscara$200, "Extraer texto y gráficos en apoyo de la accesibilidad") establecido, incluso cuando el llamador no incluyóppCanCopyAccessen losTPDFExtraPermissionspasados a Encrypt. ISO 14289-1 §7.16 exige que todo archivo cifrado conforme permita la extracción para accesibilidad, y el bit es por lo demás fácil de olvidar. El bit es siempre seguro de establecer — sólo concede acceso adicional a la tecnología de asistencia, no a otras rutas de extracción. - GetPDFUADiagnostics del lado escritor gana un nuevo problema
ENCRYPT-NO-ACCESSque se dispara cuando PDFUAMode está activado y el bit 10 del/Pdel diccionario de cifrado está en cero. Esto captura el caso límite de orden de llamada en el que el usuario llamó aEncrypt()primero y a SetPDFUAMode sólo después — el diagnóstico le dice al usuario que llame aEncrypt()de nuevo para que el diccionario de cifrado se vuelva a emitir con el/Pcorregido.
Version 3.56.4
Cambiado
- GetPDFUADiagnostics del lado escritor gana cinco nuevas verificaciones ISO 14289-1 de modo que la auditoría del documento en memoria capture las mismas violaciones que la auditoría del lado lector CheckFileCompliance ComplianceTest=2.
SUSPECTS-TRUEseñala MarkInfo/Suspects=true (§7.1: los archivos PDF/UA conformes requieren Suspects=false).ROLEMAP-STANDARD-REMAP:Nseñala llamadas a AddRoleMap que reasignarían una etiqueta de estructura estándar — §7.1 prohíbe reasignar etiquetas estándar.DC-TITLE-MISSINGseñala un dc:title XMP vacío (separado de DOCINFO-TITLE-MISSING, que verifica /Info /Title).TRAPNET-ANNOT:Nseñala anotaciones TrapNet (§7.18.2 las prohíbe).ANNOT-PAGE-NO-TABS-S:Nseñala páginas que llevan anotaciones cuyo diccionario de página /Tabs no es /S (§7.18.3 exige el orden de tabulación basado en el árbol de estructura en esas páginas). - Las auditorías PDF/UA-1 del lado escritor y del lado lector están ahora aproximadamente en paridad: todo problema que la auditoría del lado lector levanta en un archivo guardado es también alcanzable desde el diagnóstico en memoria, salvo las convenciones de formato de cada función (texto separado por saltos de línea vs. lista de cadenas con código NNNNN).
Version 3.56.3
Cambiado
- La auditoría PDF/UA-1 gana sus verificaciones de fuente de §7.21.
10020informa de cualquier fuente no Standard-14 cuyo FontDescriptor carezca deFontFile/FontFile2/FontFile3(§7.21.4.1: toda fuente renderizada debe incrustar su programa).10021informa de descendientes CIDFontType2 sin una entrada/CIDToGIDMap(§7.21.3.2).10022destaca las fuentes Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats y variantes negrita / oblicua) que se referencian sin un programa incrustado — §7.21.4 NOTE 5 deja claro que no hay exención de incrustación para estas fuentes.10023informa de fuentes que carecen de un CMap/ToUnicodey no coinciden con la lista de exención de §7.21.7 (codificaciones predefinidas MacRoman / MacExpert / WinAnsi, Type 0 con colecciones de caracteres Adobe-GB1 / CNS1 / Japan1 / Korea1, TrueType no simbólico). - Las fuentes compuestas Type 0 se inspeccionan en ambas capas:
/ToUnicodeen el propio diccionario padre Type 0, e incrustación //CIDToGIDMapen el primer CIDFont descendiente. Las fuentes Type 3 omiten la verificación de incrustación (sus glifos son CharProcs inline) pero aún participan en la verificación/ToUnicode. - Los helpers PDFlibPDFA para trabajo de fuente similar no se compartieron intencionadamente — media docena de rutinas cortas (eliminación del prefijo de subset, tabla de nombres Standard-14, presencia de FontFile, flag Symbolic) se duplican localmente como helpers
UA*de modo que la auditoría PDF/A pueda seguir evolucionando sin romper PDF/UA, y viceversa.
Version 3.56.2
Cambiado
- La auditoría PDF/UA-1 gana cinco verificaciones ISO 14289-1 más que cubren anotaciones, archivos incrustados y contenido opcional.
10015informa de anotaciones Link que carecen de una descripción alternativa/Contentsno vacía (§7.18.5) para que los lectores de pantalla puedan anunciar los destinos del enlace.10016y10017señalan diccionarios FileSpec de archivo incrustado a los que les faltan las claves/Fo/UFrequeridas (§7.11).10018señala diccionarios de configuración de contenido opcional que omiten una cadena de texto/Nameno vacía (§7.10).10019señala diccionarios de configuración de contenido opcional que contienen la clave prohibida/AS(§7.10). - El recorrido de anotaciones por página que ya impulsaba las verificaciones de TrapNet y
/Tabs /Srecoge ahora también los datos Link //Contentsen el mismo pase, manteniendo la auditoría O(N) respecto al recuento de objetos.
Version 3.56.1
Cambiado
- La auditoría PDF/UA-1 gana cinco nuevas verificaciones ISO 14289-1.
10010verifica el permiso de extracción de accesibilidad (bit 10 de la clave/Pde cifrado) en archivos cifrados (§7.16).10011detecta formularios XFA dinámicos vía el elemento<dynamicRender>required</dynamicRender>dentro del paquete XFA XDP (§7.15).10012señala Form XObjects que llevan una entrada/Ref— los reference XObjects están prohibidos (§7.20).10013señala anotacionesTrapNet(§7.18.2).10014recorre cada página e informa de cualquier página que lleve anotaciones cuyo diccionario de página no establezca/Tabs /S(§7.18.3) para que el orden de tabulación siga el árbol de estructura. - Los cinco nuevos códigos fluyen a través del mismo par de handles CheckFileCompliance + GetStringListItem que añadió la release anterior — no hay nueva superficie pública de API.
Version 3.56.0
Añadido
- La nueva auditoría del lado lector
CheckCompliancePDFUAvalida un PDF externo contra ISO 14289-1 (PDF/UA-1). Complementa la verificación existente del lado escritor GetPDFUADiagnostics aceptando cualquier PDF de entrada (salida propia, salida de escáner, contenido de terceros) y listando las violaciones PDF/UA-1 del mismo modo en que CheckFileCompliance ya informa de problemas PDF/A.
Cambiado
- CheckFileCompliance acepta ahora
ComplianceTest = 2para ejecutar la nueva auditoría PDF/UA-1. El test PDF/A bajoComplianceTest = 1está sin cambios, y la lista de problemas sigue fluyendo a través del par de handles existente GetStringListCount / GetStringListItem. - El primer corte cubre las puertas de conformidad fundacionales de PDF/UA-1 de §5 (identificación XMP
pdfuaid:part) y §7.1 (flujo/Metadatadel catálogo, marcador tagged-PDF, árbol de estructura, preferencia de título del visor, idioma del documento,dc:titleXMP, valor de/Suspects, y la prohibición de reasignar etiquetas de estructura estándar). Se emiten ocho códigos de diagnóstico —10001a10009— manteniendo el rango numérico visualmente separado de los códigos PDF/A00xxx. - Las cláusulas PDF/UA-1 más profundas (seguridad, anotaciones, XObjects, subset de fuentes) están previstas para releases de parche de seguimiento sobre el mismo framework de auditoría.
Version 3.55.6
Cambiado
- Cada paquete XMP recién generado lleva ahora una propiedad xmpMM:InstanceID en el formato uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. El identificador se genera vía CoCreateGuid de Win32 y proporciona a cada documento producido una huella única e independiente de la versión, como recomienda ISO 19005-1 §6.7.2 (Cor2) y las guías de buenas prácticas PDF/A. Las builds no Windows (donde el paquete XMP permanece vacío) no se ven afectadas.
- El espacio de nombres xmpMM (http://ns.adobe.com/xap/1.0/mm/) forma ahora parte de los SelectionNamespaces del paquete XMP; los nuevos helpers SetXMPMM y GenerateInstanceID sustentan la emisión de InstanceID y proporcionan la base para el soporte futuro de xmpMM:History / xmpMM:DerivedFrom.
- El esquema de descripción PDF/A Extension Schema (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) no se añade en esta release. Crear un esquema de extensión personalizado requiere construcción multi-paso de propiedades bag / seq / estructuradas más allá de la forma actual de SetDublinCore / SetXMPBasic; el trabajo se prevé para una release futura. Los documentos que necesiten declarar propiedades XMP personalizadas siguen recurriendo a la ruta LoadFromString.
Version 3.55.5
Cambiado
- Los documentos PDF/A tienen ahora sus flags /F de anotación normalizados en tiempo de guardado. ISO 19005-1 §6.5.3 exige que el bit Print sea 1 y los bits Hidden / Invisible / NoView sean 0 en toda anotación; el escritor aplica ahora esa máscara en tiempo de guardado de modo que los llamadores no tengan que recordar el diseño de bits. El caso /Subtype /Popup está exento — los popups son hijos de otras anotaciones y tradicionalmente no se imprimen.
- El flag AcroForm /NeedAppearances se fuerza ahora a false en tiempo de guardado cuando el documento está en cualquier modo PDF/A. ISO 19005-1 §6.9 exige que el flag esté ausente o sea false; previamente el escritor dejaba el valor que el llamador hubiera establecido, lo que producía documentos que pedían al visor que regenerara las apariencias en tiempo de apertura y violaban silenciosamente la especificación cuando el llamador lo había puesto a true. La corrección también se ejecuta para documentos a los que les faltaba previamente el flag — el escritor emite un /NeedAppearances false explícito para no dejar ambigüedad al validador.
Version 3.55.4
Cambiado
- AddStandardFont rechaza ahora las llamadas en modo PDF/A. ISO 19005-1 §6.3.4 revoca la exención "Standard 14 may be unembedded" de la referencia PDF: cada programa de fuente en un archivo conforme debe estar incrustado, y la biblioteca no incluye los outlines Standard 14. La fachada devuelve 0 silenciosamente; los llamadores deben cambiar a AddTrueTypeFont o AddType1Font con un archivo de fuente real.
- AddTrueTypeFont promueve ahora silenciosamente Embed=0 (sin incrustación) a Embed=1 (incrustar fuente completa) cuando el modo PDF/A está activo. La ruta de referencia no incrustada producía PDF que dependía del fallback de fuente del visor a una instalación del sistema de Arial / Times / Courier, lo cual viola ISO 19005-1 §6.3.4. Los llamadores existentes que pidieron incrustación (Embed=1 o 2) no se ven afectados.
- La verificación de conformidad de /Encoding TrueType no simbólico (ISO 19005-1 §6.3.7 Cor2 exige WinAnsi o MacRoman como el nombre de codificación o BaseEncoding, sin /Differences) no se añade en esta release porque la biblioteca ya emite /WinAnsiEncoding para subsets TrueType no simbólicos, y la aplicación más profunda requeriría rastrear el despacho simbólico-vs-no-simbólico a través de la ruta de subset. CheckCompliancePDFA 00034 / 00035 (añadidos en v3.51.0) señalan cualquier salida no conforme en tiempo de validación.
Version 3.55.3
Cambiado
- Los diccionarios de fuente CIDFontType2 respaldados por TrueType llevan ahora /CIDToGIDMap /Identity explícitamente. ISO 19005-1 §6.3.3.2 (Cor2) exige que la entrada esté presente en cada CIDFont Type 2 incrustado; la referencia PDF permite el predeterminado implícito Identity, pero PDF/A exige un valor explícito. El escritor estaba omitiendo previamente la clave por completo, haciendo que veraPDF (y CheckCompliancePDFA 00033 añadido en v3.51.0) señalara el archivo. El nombre /Identity coincide con el diseño GID-como-CID que el escritor ya estaba produciendo implícitamente, de modo que los documentos existentes se renderizan idénticamente.
- FontDescriptor /CharSet (para subsets Type 1) y /CIDSet (para subsets CIDFont) siguen siendo TODO; el escritor necesitaría rastrear qué nombres de glifo / CIDs terminaron en el subset para rellenarlos con precisión. CheckCompliancePDFA 00031 y 00032 (también añadidos en v3.51.0) señalarán la ausencia para que los usuarios vean el problema en tiempo de validación.
Version 3.55.2
Cambiado
- AddImageDirectFromString rechaza ahora los filtros incompatibles con PDF/A en el punto de entrada. Pasar Filter = 'LZWDecode' es rechazado para cada parte PDF/A (ISO 19005-1 §6.1.10 más las reglas equivalentes ISO 19005-2 / -3). Pasar Filter = 'JBIG2Decode' o 'JPXDecode' es rechazado para PDF/A-1 (modos 1 y 2). PDF/A-2 y PDF/A-3 admiten JPXDecode bajo ISO 19005-2 §6.2.8.3 con restricciones de sub-especificación (recuento de canales de color, uniformidad de profundidad de bits, requisitos METH/APPROX) que la puerta del lado escritor no aplica — los llamadores en esos modos aún necesitan asegurarse de que el flujo JPEG 2000 sea conforme. La fachada devuelve 0 silenciosamente cuando se solicita un filtro prohibido.
- Las entradas TIFF, PNG, JPEG y JPEG 2000 cargadas a través de AddImageFromFile / AddImageFromStream no se ven afectadas: el importador descomprime los bytes de origen y los recodifica con FlateDecode (o DCTDecode para cargas JPEG), de modo que la entrada LZW nunca se propaga a la cadena Filter de salida. El validador CheckCompliancePDFA añadido en v3.50.0 (00004) y v3.52.0 (00022, 00023) proporciona una segunda línea de defensa en tiempo de validación para cualquier ruta indirecta que aún deslice un filtro prohibido en la salida.
Version 3.55.1
Cambiado
- AddLinkToHideField rechaza ahora las llamadas en modo PDF/A. La release anterior dejaba un comentario afirmando que la acción era compatible con PDF/A, pero ISO 19005-1 Cor2 añadió /Hide a la lista de acciones prohibidas (§6.6.1), e ISO 19005-2 / -3 heredan la restricción. La fachada devuelve 0 silenciosamente cuando se llama en modo PDF/A, coincidiendo con AddLinkToJavaScript y AddLinkToImportData.
- AddSWFAnnotationFromFile rechaza ahora las llamadas en modo PDF/A. Las anotaciones SWF / RichMedia envuelven medios Flash que están prohibidos por ISO 19005-1 §6.5.2 (sin subtypes Movie / Sound) y reforzados por ISO 19005-2 §6.3.1 (sin 3D / Sound / Screen / Movie). La fachada devuelve 0 silenciosamente.
- AddEmbeddedFile y AddLinkToEmbeddedFile rechazan ahora las llamadas en modos PDF/A-1 y PDF/A-2. ISO 19005-1 §6.1.11 prohíbe /EF, e ISO 19005-2 §6.8 sólo admite archivos PDF/A incrustados; en lugar de verificar la PDF/A-idad recursiva de la carga adjunta, el escritor simplemente rechaza la llamada en estos modos. PDF/A-3 (SetPDFAMode 5 o 6) sigue permitido — véase v3.55.0 para la inyección automática de /AFRelationship.
- SetOpenActionMenu rechaza ahora los valores MenuItem fuera de la lista blanca {NextPage, PrevPage, FirstPage, LastPage} cuando el documento está en modo PDF/A. ISO 19005-1 §6.6.1 restringe las acciones nombradas a ese conjunto, de modo que previamente la API producía silenciosamente diccionarios Open-Action Find / Print / FullScreen no conformes que veraPDF rechazaría.
- NewOptionalContentGroup rechaza ahora las llamadas en modos PDF/A-1 (SetPDFAMode 1 o 2). ISO 19005-1 §6.1.13 prohíbe la clave /OCProperties del catálogo. PDF/A-2 (modos 3/4) y PDF/A-3 (modos 5/6) admiten contenido opcional con las restricciones de su respectivo §6.9, de modo que la puerta sólo se dispara para PDF/A-1.
Version 3.55.0
Cambiado
- Los documentos PDF/A-3 reciben ahora automáticamente una entrada /AFRelationship en cada archivo incrustado. Previamente un archivo PDF/A-3 creado con la biblioteca podía fallar la validación porque ISO 19005-3 Anexo E, Tabla E.1 exige AFRelationship en cada especificación de archivo incrustado. El escritor inyecta ahora el valor predeterminado configurado ('Unspecified' por defecto) en cualquier diccionario FileSpec que carezca de la entrada en tiempo de guardado, reflejando la auto-inyección de AFRelationship PDF/UA introducida anteriormente. Sólo los modos PDF/A-3 (SetPDFAMode 5 = PDF/A-3b o 6 = PDF/A-3a) disparan la auto-inyección; PDF/A-1 y PDF/A-2 siguen rechazando archivos incrustados directamente según ISO 19005-1 §6.1.11 e ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship es una nueva API que sobrescribe el valor predeterminado escrito por el escritor cuando un archivo incrustado carece de una entrada /AFRelationship. Acepta los valores de la Tabla E.1 de ISO 19005-3 'Source' (el archivo incrustado es el material fuente que produjo el contenido PDF), 'Data' (el archivo son los datos estructurados que respaldan una tabla o gráfico visual), 'Alternative' (una representación alternativa como una versión de audio), 'Supplement' (una representación suplementaria como una forma MathML de una ecuación), 'Unspecified' (la relación no puede caracterizarse por lo anterior), o cualquier nombre de segunda clase registrado. La cadena vacía reinicia a 'Unspecified'. Las sobrescrituras por archivo siguen disponibles vía SetEmbeddedFileAFRelationship.
- Las nuevas APIs están expuestas en la fachada Delphi como TPDFlib.SetPDFA3DefaultAFRelationship y vía la DLL como DLSetPDFA3DefaultAFRelationship (PWideChar) y DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
Version 3.54.0
Cambiado
- LoadOutputIntentProfile es una nueva API que reemplaza el perfil OutputIntent sRGB incluido con un perfil ICC externo cargado desde disco. Requerido al producir documentos PDF/A en espacios de color DeviceCMYK o DeviceGray, ya que la biblioteca sólo incluye un perfil sRGB. El uso típico es llamar a SetPDFAMode primero (que inicializa el esqueleto OutputIntent), y luego a LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') para intercambiar los bytes del perfil y etiquetar el documento con el nuevo espacio de color. Devuelve 1 en éxito, 0 si no se encuentra el archivo o si el espacio de color es desconocido. Expuesto en la fachada Delphi como TPDFlib.LoadOutputIntentProfile y vía la DLL como DLLoadOutputIntentProfile (forma PWideChar) y DLLoadOutputIntentProfileA (forma PAnsiChar). ISO 19005-1 §6.2.2 permite cualquier perfil ICC registrado en el flujo DestOutputProfile.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep y SetTextColorSep tienen ahora éxito en modo PDF/A cuando el perfil OutputIntent del documento es DeviceCMYK. Previamente estas APIs rechazaban cada llamada en modo PDF/A independientemente del OutputIntent, lo que impidía producir documentos CMYK conformes. La puerta es ahora PDFAMode = 0 OR OutputIntentColorSpace = 'DeviceCMYK', coincidiendo con la regla ISO 19005-1 §6.2.3.3 que permite DeviceCMYK cuando el OutputIntent usa un perfil CMYK, e ISO 19005-1 §6.2.3.4 que permite alternativas Separation cuyo espacio de color base también sea conforme.
- SetTextShader tiene ahora éxito en modo PDF/A cuando el perfil OutputIntent es DeviceRGB o DeviceCMYK. Los shaders en sí no están prohibidos por PDF/A; el validador (lado lector) verifica que el espacio de color interno del shader coincida con el OutputIntent. El comportamiento anterior de rechazo estricto negaba el uso de shaders conformes.
- El desbloqueo de CMYK / Separation / Shader depende de la etiqueta OutputIntentColorSpace establecida por AddOutputIntent y LoadOutputIntentProfile (introducidas en v3.53.0). Llamar a SetPDFAMode sin LoadOutputIntentProfile mantiene el espacio de color como DeviceRGB (el perfil sRGB incluido), de modo que las llamadas CMYK siguen rechazándose por defecto — el nuevo comportamiento es opt-in vía LoadOutputIntentProfile.
Version 3.53.0
Cambiado
- El diccionario OutputIntent lleva ahora los campos completos del esqueleto PDF/A recomendados por ISO 19005-1 §6.2.2 y la preflight de Adobe Acrobat: /OutputCondition (descripción legible por humanos de la condición de color), /Info (texto de identificación de forma larga), y /RegistryName (URL del registro, por defecto http://www.color.org). Los valores predeterminados son "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" para los puntos de llamada heredados de un solo argumento; la nueva sobrecarga de AddOutputIntent toma los cuatro campos personalizados directamente para que los llamadores puedan rellenarlos para sus propias condiciones de color.
- AddOutputIntent gana una nueva sobrecarga de cinco argumentos: AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). La forma heredada de un solo argumento sigue funcionando sin cambios; ahora delega en la nueva sobrecarga con los predeterminados sRGB. El argumento ColorSpace también selecciona el recuento de componentes /N escrito en el diccionario del perfil ICC incrustado (3 para DeviceRGB, 4 para DeviceCMYK, 1 para DeviceGray); el propio perfil incrustado sigue siendo el flujo sRGB incluido hasta que la próxima API LoadOutputIntentProfile se publique en v3.54.0.
- TPDFDocument expone OutputIntentColorSpace como una propiedad de lectura/escritura que rastrea el espacio de color de la última llamada a AddOutputIntent. Ésta se convierte en la condición de puerta para las restricciones del lado escritor CMYK / Separation / Shader en v3.54.0, donde las APIs de color que hoy rechazan cada llamada en modo PDF/A rechazarán sólo cuando el espacio de color no coincida con el OutputIntent.
Version 3.52.0
Cambiado
- CheckCompliancePDFA audita ahora anotaciones, estado gráfico, acciones y form XObjects, completando la cobertura del validador del lado lector PDF/A de los capítulos 6.2-6.6 de ISO 19005-1 y las reglas diferenciales equivalentes PDF/A-2/-3. El validador informa de 14 nuevas clases de problemas (00050-00067): subtypes de anotación prohibidos (00050; ISO 19005-1 §6.5.2 prohíbe FileAttachment / Sound / Movie para PDF/A-1, e ISO 19005-2 §6.3.1 prohíbe 3D / Sound / Screen / Movie para PDF/A-2 y PDF/A-3), /CA de anotación distinto de 1.0 (00051; §6.5.3), /F de anotación ausente o con Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, con /Subtype /Popup exento), /AA de anotación (00054; §6.6.2), diccionario de apariencia de anotación con claves distintas de /N o valor /N no conforme (00055; §6.5.3 Cor2), anotación Widget con /A (00056; §6.9), ExtGState /TR (00058; §6.2.8), ExtGState /TR2 distinto de /Default (00059; §6.2.8), y sólo en PDF/A-1: ExtGState /SMask distinto de /None (00061; §6.4), /BM distinto de Normal o Compatible (00062; §6.4), /CA o /ca distinto de 1.0 (00063; §6.4).
- La auditoría de acciones en cualquier lugar (00064, 00065) reemplaza la verificación sólo de OpenAction de v3.50.0 con un barrido completo que señala valores de acción /S prohibidos (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) y acciones nombradas cuyo /N está fuera de {NextPage, PrevPage, FirstPage, LastPage} independientemente de dónde viva la acción (anotación /A, widget /A, esquema /A, catálogo /OpenAction, etc.). ISO 19005-1 §6.6.1.
- La auditoría de XObject (00066, 00067) informa de PostScript y Reference XObjects, más claves prohibidas en Form XObjects (/OPI, /PS, /Subtype2 = /PS) e Image XObjects (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
Version 3.51.0
Cambiado
- CheckCompliancePDFA audita ahora la conformidad de fuente y espacio de color además de las verificaciones estructurales añadidas en v3.50.0. El validador informa de nueve nuevas clases de problemas: al menos un programa de fuente no está incrustado (00030; ISO 19005-1 §6.3.4 exige que cada programa de fuente, incluidas las sustituciones Standard 14, esté incrustado), subset Type 1 sin /CharSet en su FontDescriptor (00031; §6.3.5), subset CIDFont sin /CIDSet (00032; §6.3.5), CIDFontType2 sin /CIDToGIDMap (00033; §6.3.3.2 Cor2), TrueType no simbólico con un /Encoding no conforme (00034; §6.3.7 Cor2 exige WinAnsi/MacRoman directamente o como BaseEncoding, sin /Differences), TrueType simbólico que aún lleva /Encoding (00035; §6.3.7 Cor2), al menos una fuente sin /ToUnicode en documentos PDF/A-Na o PDF/A-Nu (00036; §6.3.8 con la exención de cuatro clases aplicada), espacio de color ICCBased que no incrusta su flujo de perfil (00037; §6.2.3.2), y un archivo que usa tanto DeviceRGB como DeviceCMYK (00038; §6.2.3.3 prohíbe la mezcla).
- La verificación /ToUnicode (00036) está limitada a los niveles de conformidad A y U porque sólo esos niveles requieren mapeo Unicode según ISO 19005-1 §6.3.8 e ISO 19005-2 §6.2.11.7. Los archivos de nivel B (PDF/A-1b, PDF/A-2b, PDF/A-3b) no se señalan. La exención de cuatro clases reconoce las codificaciones predefinidas (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), las BaseFonts Standard 14 Type 1 como proxy de las fuentes con nombres de glifo Adobe Standard Latin / Symbol, y las fuentes Type 0 cuya CIDFont descendiente usa los registros Adobe-GB1, Adobe-CNS1, Adobe-Japan1 o Adobe-Korea1.
- La auditoría de fuentes recorre cada diccionario Font, lo clasifica por Subtype (Type1, MMType1, TrueType, Type3, Type0 con su descendiente CIDFontType0 o CIDFontType2), y luego despacha las verificaciones relevantes. Las fuentes compuestas Type 0 delegan las verificaciones de incrustación y de subset a su CIDFont descendiente mientras mantienen /ToUnicode en el envoltorio Type 0. La detección de subset usa la convención estándar de prefijo de seis letras mayúsculas.
Version 3.50.0
Cambiado
- CheckCompliancePDFA informa ahora de 15 problemas adicionales de no conformidad PDF/A que el validador previamente pasaba por alto: array /ID del trailer ausente (00013), flujo /Metadata del Catálogo del Documento ausente (00014), /Filter aplicado al flujo /Metadata (00015), diccionarios de flujo que referencian archivos externos vía /F, /FFilter o /FDecodeParms (00016), archivos incrustados declarados vía /EF en cualquier diccionario file-specification o vía la entrada /EmbeddedFiles del árbol de nombres en documentos PDF/A-1 (00017, 00018), /OpenAction apuntando a un tipo de acción prohibido (00019), diccionarios additional-action /AA en el Catálogo del Documento o cualquier Página (00020, 00021), filtros JBIG2Decode o JPXDecode en documentos PDF/A-1 (00022, 00023), filtros Crypt cuyo /Name no es /Identity (00024), /Requirements en el Catálogo del Documento (00025), /Perms con claves distintas de /UR3 y /DocMDP (00026), y /AcroForm /NeedAppearances establecido en true (00027). El validador señala ahora los tipos de acción /OpenAction del Catálogo prohibidos (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) y los valores /N de acción nombrada fuera de la lista blanca {NextPage, PrevPage, FirstPage, LastPage} según ISO 19005-1 §6.6.1.
- Las verificaciones específicas de filtro (JBIG2Decode, JPXDecode) y las verificaciones de archivo incrustado (/EF, /EmbeddedFiles) siguen limitadas a PDF/A-1 porque ISO 19005-2 §6.2.8.3 y §6.8 relajan explícitamente esas restricciones para PDF/A-2 y PDF/A-3. Las verificaciones de estructura del documento (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) se aplican a cada parte PDF/A.
Corregido
- El parser PDFAID acepta el sufijo de conformidad U (PDF/A-2U, PDF/A-3U) junto con las variantes A y B existentes, de modo que CheckCompliancePDFA ya no levanta una advertencia espúrea "00005 PDFA Mark NOT Found or invalid" al escanear un archivo PDF/A-2U o PDF/A-3U producido por otra herramienta. Los niveles de conformidad de mapeo Unicode añadidos en ISO 19005-2:2011 son ahora reconocidos por el validador.
Version 3.49.0
Cambiado
- AddLinkToImportData crea una anotación Link cuya acción es una acción de importación de datos PDF (/S /ImportData) que rellena los campos AcroForm del documento desde un archivo FDF externo cuando el usuario hace clic en el enlace (ISO 32000-1 §12.6.4.8, Table 198). El parámetro FileName se referencia como un diccionario filespec, con las mismas reglas de normalización de rutas usadas por AddLinkToFile / AddLinkToFileEx (las barras invertidas se convierten en barras según ISO 32000-1 §7.11.2.1). El bit 0 de Options activa el borde visible y los bits 1–3 seleccionan el modo de resaltado del enlace (Invert, Outline, Push), coincidiendo con las convenciones existentes de AddLinkTo*. PDF 1.4 o posterior. NO permitido en PDF/A porque la acción referencia un recurso externo; la fachada devuelve silenciosamente 0 cuando se invoca en modo PDF/A. Expuesto en la biblioteca Delphi y en la interfaz DLL como DLAddLinkToImportData / DLAddLinkToImportDataA (formas PWideChar y PAnsiChar).
Version 3.48.0
Cambiado
- AddLinkToHideField crea una anotación Link cuya acción es una acción de ocultación PDF (/S /Hide) que alterna la visibilidad de uno o varios campos AcroForm cuando el usuario hace clic en el enlace (ISO 32000-1 §12.6.4.10, Table 196). FieldNames acepta uno o varios nombres de campo completamente cualificados separados por comas, puntos y comas o saltos de línea; un único nombre escribe /T como cadena de texto y dos o más nombres escriben /T como un array, ambas formas permitidas por la especificación. HideFlag selecciona la dirección de visibilidad: un valor distinto de cero oculta los campos listados (/H true) y cero los muestra (/H false). El bit 0 de Options activa el borde visible y los bits 1–3 seleccionan el modo de resaltado del enlace (Invert, Outline, Push), coincidiendo con AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 o posterior. Compatible con PDF/A porque no se referencia ningún recurso externo. Expuesto en la biblioteca Delphi y en la interfaz DLL como DLAddLinkToHideField / DLAddLinkToHideFieldA (formas PWideChar y PAnsiChar).
Version 3.47.0
Cambiado
- AddLinkToNamedAction crea una anotación Link cuya acción es una acción nombrada PDF (/S /Named) que dispara uno de los cuatro comandos estándar de navegación del visor definidos en ISO 32000-1 §12.6.4.11, Table 194: NextPage, PrevPage, FirstPage y LastPage. El parámetro NamedActionType selecciona el comando (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage); los valores fuera de este rango caen de vuelta a NextPage para que el escritor siempre emita un nombre /N conforme a la especificación. El bit 0 de Options activa el borde visible y los bits 1–3 seleccionan el modo de resaltado del enlace (Invert, Outline, Push), coincidiendo con las convenciones existentes de AddLinkToWeb / AddLinkToPage. La anotación requiere PDF 1.1 o posterior y es compatible con PDF/A porque no se referencia ningún recurso externo. Disponible en la biblioteca Delphi y las interfaces DLL.
Version 3.46.1
Cambiado
- AddCaretAnnotation crea una anotación de marcado caret (PDF /Subtype /Caret) en el rectángulo dado, marcando una posición en la página donde se ha insertado u omitido texto o contenido, o donde se requiere de otro modo la atención del revisor. Soporta dos tipos de símbolo (None y Paragraph) vía SymbolType (0 / 1), color, opacidad, título, contenido y marcas de tiempo de creación/modificación configurables. Definido en ISO 32000-1 §12.5.6.11. PDF 1.5 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- Esta entrada completa la incorporación de anotaciones geométricas que comenzó con v3.44.0 Square+Circle. PDFlibPas ahora crea anotaciones Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink y Caret, además del soporte existente de Link, FileAttachment, SVG, U3D y SWF.
Version 3.46.0
Cambiado
- AddInkAnnotation crea una anotación de marcado de tinta (PDF /Subtype /Ink) que representa trazos manuscritos o marcas libres dibujadas en la página. Los trazos se proporcionan como una única cadena donde varios trazos se separan por '|' o salto de línea, y dentro de cada trazo los pares de coordenadas siguen el mismo formato de espacios/comas/puntos y comas/tabuladores que usa AddPolygonAnnotation. Por ejemplo "100 100 110 105 120 110 | 200 200 210 205" describe dos trazos separados. Soporta anchura de borde, color de tinta, opacidad, título, contenido y marcas de tiempo configurables. Definido en ISO 32000-1 §12.5.6.13. PDF 1.3 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- Cada trazo debe contener un número par de valores (al menos cuatro); de lo contrario la llamada devuelve 0 y no se escribe ninguna anotación. El /Rect se calcula automáticamente a partir de la extensión combinada de todos los trazos más un pequeño relleno para que los trazos permanezcan dentro del cuadro delimitador de la anotación.
Version 3.45.0
Cambiado
- AddPolygonAnnotation crea una anotación de marcado de polígono cerrado (PDF /Subtype /Polygon) con vértices proporcionados como una cadena de pares de coordenadas separados por espacios, comas, puntos y comas o tabuladores (p. ej. "100 100 200 100 200 200 100 200"). Soporta anchura de borde, color de borde, color de relleno interior opcional, opacidad, título, contenido y marcas de tiempo configurables. Definido en ISO 32000-1 §12.5.6.9. PDF 1.5 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- AddPolyLineAnnotation crea una anotación de marcado de polilínea abierta (PDF /Subtype /PolyLine) con el mismo formato de cadena de vértices y estilos de extremos configurables en cada terminal (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Definido en ISO 32000-1 §12.5.6.9. PDF 1.5 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- Ambas anotaciones requieren al menos dos puntos de vértice (cuatro números) y un número total par de números; la llamada devuelve 0 si la cadena de vértices no puede analizarse en una lista válida de pares. El /Rect se calcula a partir de la extensión de los vértices más un relleno proporcional al ancho del borde para que las decoraciones de los extremos permanezcan visibles.
- Ambas anotaciones elevan la versión del documento a PDF 1.5 cuando se emiten bajo un bloqueo de versión mínima inferior.
Version 3.44.1
Cambiado
- AddLineAnnotation crea una anotación de marcado de línea (PDF /Subtype /Line) entre dos puntos finales, con anchura de borde, color de línea, color de relleno interior opcional, estilos de extremo para ambos lados (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), opacidad, título, contenido y marcas de tiempo de creación/modificación configurables. Definido en ISO 32000-1 §12.5.6.7. PDF 1.3 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- El /Rect de la anotación se calcula a partir de los dos puntos finales más un relleno proporcional al ancho del borde para que las decoraciones de los extremos permanezcan dentro del cuadro delimitador de la anotación.
Version 3.44.0
Cambiado
- AddSquareAnnotation crea una anotación de marcado rectangular (PDF /Subtype /Square) en el rectángulo dado, con anchura de borde, color de borde, color de relleno interior opcional, opacidad, título, contenido y marcas de tiempo de creación/modificación configurables. Definido en ISO 32000-1 §12.5.6.8. PDF 1.3 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- AddCircleAnnotation crea una anotación de marcado elíptica (PDF /Subtype /Circle) inscrita en el rectángulo dado, con el mismo borde, relleno, opacidad, título, contenido y marcas de tiempo configurables que AddSquareAnnotation. Definido en ISO 32000-1 §12.5.6.8. PDF 1.3 o posterior. Disponible en la biblioteca Delphi y las interfaces DLL.
- Ambas nuevas anotaciones elevan automáticamente la versión del documento a PDF 1.3 cuando se emiten bajo un bloqueo de versión mínima inferior y emiten un conjunto estándar de campos de anotación de marcado (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P) para que los flujos de revisión existentes en Acrobat, Foxit y Edge puedan editarlas tras su creación.
Version 3.43.0
Cambiado
- SetStructElemSpaceBefore y SetStructElemSpaceAfter establecen los atributos /SpaceBefore y /SpaceAfter (Layout owner) en el elemento de estructura actualmente abierto, expresando el espaciado antes y después de los elementos de nivel de bloque en puntos. Definido en ISO 32000-1 §14.8.5.4.2 Table 340. Disponible en la biblioteca Delphi, ActiveX (Dispids 73008051/73008052) y las interfaces DLL.
- SetStructElemStartIndent y SetStructElemEndIndent establecen los atributos /StartIndent y /EndIndent (Layout owner), expresando la sangría desde los bordes de inicio y fin del rectángulo de contenido sensibles al modo de escritura, en puntos. Definido en ISO 32000-1 §14.8.5.4.2 Table 340. Disponible en la biblioteca Delphi, ActiveX (Dispids 73008053/73008054) y las interfaces DLL.
- SetStructElemColor establece el atributo /Color (Layout owner) como un triplete RGB (cada componente 0.0-1.0), describiendo el color de primer plano del elemento para motores de reflujo y verificadores de contraste de color descendentes. Definido en ISO 32000-1 §14.8.5.4.2 Table 340. Disponible en la biblioteca Delphi, ActiveX (Dispid 73008055) y las interfaces DLL.
Corregido
- Corregido un error de serialización en BuildStructElemDictRef: los valores numéricos de atributo de token único (como SpaceBefore, SpaceAfter, StartIndent, EndIndent) se escribían como nombres PDF en lugar de números PDF. La corrección se aplica tanto a las ramas de atributos de propietario único como de múltiples propietarios.
Version 3.42.0
Cambiado
- Se añaden tres nuevas verificaciones de conformidad: el código 00006 marca documentos cifrados (el cifrado está prohibido en todas las versiones PDF/A); el código 00007 marca documentos a los que les falta una entrada OutputIntents en el catálogo (requerida por todas las versiones PDF/A); los códigos 00011 y 00012 marcan documentos a los que les falta MarkInfo o StructTreeRoot cuando el nivel de conformidad es -a (accesibilidad).
Corregido
- CheckCompliancePDFA ahora valida correctamente los seis modos PDF/A (1a, 1b, 2a, 2b, 3a, 3b). La verificación PDFAID (código 00005) acepta cualquiera de los seis marcadores XMP válidos en lugar de sólo '1B'. La verificación del límite superior de versión (00002) aplica 1.4 para PDF/A-1 y 1.7 para PDF/A-2 y PDF/A-3.
- La verificación OCProperties (código 00003) ahora es condicional: se aplica sólo a documentos PDF/A-1, donde el contenido opcional (capas) está prohibido. PDF/A-2 y PDF/A-3 permiten capas y ya no se marcan.
Version 3.41.0
Cambiado
- El modo PDF/A ahora aplica las operaciones prohibidas a nivel de API. Cuando un modo PDF/A está activo (cualquiera de los modos 1-6), llamar a SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK o cualquier otra API CMYK/Separation/Shader devuelve 0 y no tiene efecto, en consonancia con el requisito de PDF/A de un único output intent sRGB.
- La transparencia está prohibida en PDF/A-1 (modos 1 y 2): SetTransparency, SetBlendMode y SetPageTransparencyGroup devuelven 0 y son no-ops cuando el modo activo es 1 o 2. PDF/A-2 y PDF/A-3 (modos 3-6) permiten transparencia limitada y no están restringidos.
- Las acciones JavaScript están prohibidas en todos los modos PDF/A (1-6): SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript y AddLinkToJavaScript devuelven todas 0 y son no-ops cuando cualquier modo PDF/A está activo. ISO 19005-1 §6.6.1 prohíbe explícitamente JavaScript en documentos PDF/A.
- Las API de adjuntar archivos (EmbedFile, AddFileAttachment) están bloqueadas en los modos PDF/A-1 y PDF/A-2 (1-4). Permanecen funcionales en PDF/A-3 (modos 5 y 6), que permite explícitamente archivos incrustados arbitrarios.
Version 3.40.0
Añadido
- SetPDFAMode ahora soporta los niveles de conformidad PDF/A-2 y PDF/A-3. Pase NewMode=3 para PDF/A-2b, 4 para PDF/A-2a, 5 para PDF/A-3b o 6 para PDF/A-3a. PDF/A-2 apunta a PDF 1.7 y permite capas, formularios interactivos, imágenes JPEG2000 y transparencia limitada. PDF/A-3 extiende PDF/A-2 permitiendo archivos incrustados arbitrarios (cualquier tipo MIME). Todas las variantes -a escriben automáticamente /MarkInfo y los marcadores de estructura tagged-PDF requeridos por el nivel de conformidad de accesibilidad.
Cambiado
- GetInformation(201) devuelve '1' hasta '6' coincidiendo con el modo PDF/A activo, en consonancia con la nueva numeración de modos.
Corregido
- Corregido: SetPDFAMode(1) (PDF/A-1a) era previamente un no-op debido a un error de enrutamiento interno introducido en v3.20.0. Ahora escribe correctamente /MarkInfo y /OutputIntents y establece XMP pdfaid:part=1/conformance=A.
Version 3.39.0
Cambiado
- SetStructElemWritingMode establece el atributo /WritingMode (Layout owner) en el elemento de estructura actualmente abierto. Los valores válidos son LrTb (de izquierda a derecha, predeterminado para escrituras latinas), RlTb (de derecha a izquierda, para árabe y hebreo) y TbRl (de arriba abajo y de derecha a izquierda, para texto vertical CJK tradicional). Definido en ISO 32000-1 §14.8.5.4.2 Table 340. Disponible en la biblioteca Delphi, ActiveX (Dispid 73008049) y las interfaces DLL.
- SetStructElemListNumbering establece el atributo /ListNumbering (List owner) en el elemento de estructura actualmente abierto. Los valores soportados incluyen None, Disc, Circle, Square (marcadores no ordenados) y Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (numeración ordenada). El atributo se establece en el elemento L (lista) y permite a la tecnología de asistencia anunciar correctamente el tipo de lista. Definido en ISO 32000-1 §14.8.5.3.2 Table 336. Disponible en la biblioteca Delphi, ActiveX (Dispid 73008050) y las interfaces DLL.
Version 3.38.0
Cambiado
- SetStructElemColSpan establece el atributo /ColSpan (Table owner) en el elemento de estructura actualmente abierto, indicando cuántas columnas abarca la celda. Definido en ISO 32000-1 §14.8.5.7.2 Table 337. Disponible en la biblioteca Delphi, ActiveX (Dispid 73008047) y las interfaces DLL.
- SetStructElemRowSpan establece el atributo /RowSpan (Table owner) en el elemento de estructura actualmente abierto, indicando cuántas filas abarca la celda. Definido en ISO 32000-1 §14.8.5.7.2 Table 337. Disponible en la biblioteca Delphi, ActiveX (Dispid 73008048) y las interfaces DLL.
- Ambas funciones son envoltorios de conveniencia equivalentes a llamar a AddTagAttribute con Owner='Table' y el nombre de atributo respectivo. Complementan a SetStructElemScope para celdas de tabla completamente descritas en tablas complejas o con cabeceras que abarcan varias columnas/filas.
Version 3.37.2
Cambiado
- GetPDFUADiagnostics ahora informa FORM-NO-TOOLTIP:N cuando a N campos de formulario interactivos (anotaciones Widget) les falta una entrada TU (tooltip / nombre accesible). ISO 14289-1 §7.18.4 exige que todos los campos de formulario interactivos lleven una entrada TU para que la tecnología de asistencia pueda anunciar el propósito del campo al usuario cuando el campo reciba el foco. /TU es el nombre accesible que los lectores de pantalla pronuncian en voz alta; es distinto de /T, que es el nombre parcial del campo usado para acceso programático y envío de formularios.
Version 3.37.1
Cambiado
- GetPDFUADiagnostics ahora informa LIST-STRUCT:N cuando N elementos de estructura LI o LBody aparecen fuera de su elemento padre requerido. ISO 32000-1 §14.8.4.4 exige que LI sea hijo directo de L (lista) y que LBody sea hijo directo de LI (elemento de lista). El anidamiento de listas mal formado impide que la tecnología de asistencia recorra y anuncie correctamente el contenido de la lista, y puede causar fallos de validación de la estructura del documento en validadores PDF/UA-1.
Version 3.37.0
Cambiado
- BeginTagEx2 es una nueva API que abre un elemento de estructura y establece todas las propiedades principales del elemento en una única llamada. Además de los parámetros TagType, AltText, ActualText y Lang de BeginTagEx, BeginTagEx2 acepta Title (/T, para el panel de navegación Tags), ElemID (/ID, identificador único del elemento) y Expansion (/E, texto completo de una abreviatura o acrónimo). Pasar una cadena vacía para cualquiera de estos tres parámetros adicionales equivale a omitir el setter correspondiente. BeginTagEx2 reduce el boilerplate para elementos bien descritos — en lugar de llamar a BeginTagEx seguido por SetStructElemTitle, SetStructElemID y SetStructElemExpansion por separado, las siete propiedades pueden establecerse en una sola llamada. La función está disponible en la biblioteca Delphi, ActiveX (Dispid 73008046) y las interfaces DLL.
Version 3.36.1
Cambiado
- GetPDFUADiagnostics ahora informa TABLE-TH-NO-SCOPE:N cuando a N elementos de estructura TH (celdas de cabecera de tabla) les falta un atributo Scope. ISO 32000-1 §14.8.4.3.4 Table 337 define Scope (Row, Column o Both) como el atributo que describe a qué celdas de datos se aplica una celda de cabecera. Sin él, los lectores de pantalla y otras tecnologías de asistencia no pueden asociar de forma fiable las celdas de cabecera con las celdas de datos en tablas complejas o con múltiples cabeceras, lo cual es requerido por ISO 14289-1 §7.5. Llame a SetStructElemAttr('Table','Scope', 'Column') (o 'Row' / 'Both') inmediatamente después de etiquetar cada elemento TH.
Version 3.36.0
Cambiado
- SetStructElemExpansion es una nueva API que establece la entrada /E (texto de expansión) en el elemento de estructura actualmente abierto (ISO 32000-1 §14.9.5). El texto de expansión es la forma completa deletreada de una abreviatura o acrónimo contenido en el elemento — p. ej. "World Wide Web" para un Span cuyo texto es "WWW". Los lectores de pantalla pronuncian la expansión en lugar de intentar pronunciar los caracteres abreviados, lo cual es crítico para la accesibilidad de contenido técnico y científico. PDF/UA-1 (ISO 14289-1 §7.2) exige que la lengua natural sea determinable de forma inequívoca; /E es el mecanismo estándar para abreviaturas y acrónimos. La función está disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.35.1
Cambiado
- GetPDFUADiagnostics ahora informa DOCINFO-TITLE-MISSING cuando la entrada /Title del diccionario de información del documento está ausente o vacía. PDF/UA-1 (ISO 14289-1) exige un título de documento para que los lectores de pantalla puedan anunciarlo al abrir el documento. La verificación existente DISPLAYDOCTITLE-FALSE confirma que el título se muestra en la barra de título del visor; DOCINFO-TITLE-MISSING es complementaria — confirma que el valor del título en sí está establecido. Llame a SetDocumentInfo('Title', ...) para proporcionar el valor.
Version 3.35.0
Cambiado
- SetStructElemTitle es una nueva API que establece la entrada /T (título) en el elemento de estructura actualmente abierto (ISO 32000-1 §14.7.2 Table 324). El título es una etiqueta legible por humanos que identifica la instancia específica del elemento — por ejemplo "Chapter 1", "Summary Table" o "Figure 3: Quarterly Sales" — y se muestra en el panel de navegación Tags de los visores PDF y es usado por herramientas de remediación de accesibilidad. /T es distinto de /Alt (texto alternativo para usuarios con problemas de renderizado) y /ActualText (corrección de texto a nivel de glifo); resulta más útil en elementos contenedores no textuales como Table, Figure, Form, Sect y Div. Pase una cadena vacía para borrar un valor establecido previamente. La función está disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.34.0
Cambiado
- SetStructElemAltText es una nueva API que establece la entrada /Alt en el elemento de estructura actualmente abierto (ISO 32000-1 §14.9.3). Es equivalente a pasar AltText a BeginTag, pero permite que la descripción de texto alternativo se establezca o se actualice después de haber abierto el elemento — útil cuando la descripción se calcula de forma separada del tipo de elemento. PDF/UA-1 (ISO 14289-1 §7.5) exige texto Alt en los elementos Figure y Formula; GetPDFUADiagnostics ya informa FIGURE-NO-ALT:N para los valores ausentes. La función está disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.33.1
Añadido
- GetPDFUADiagnostics ahora incluye una verificación ROLEMAP-UNMAPPED:N que detecta nombres de tipo de elemento de estructura personalizados usados en el documento que no tienen entrada en el diccionario /RoleMap. ISO 14289-1 §7.1 e ISO 32000-1 §14.7.3 exigen que cada tipo de estructura no estándar se asigne a un tipo PDF estándar (como P, Span o Figure) para que la tecnología de asistencia pueda determinar cómo manejar el elemento. Cuando se encuentran N tipos sin asignar, la descripción del problema incluye la lista de nombres de tipo para que los llamadores sepan qué entradas AddRoleMap se necesitan. Los 49 tipos de estructura estándar definidos en ISO 32000-1 Table 333 (PDF 1.7) son reconocidos y excluidos del informe.
Version 3.33.0
Cambiado
- SetStructElemLang es una nueva API que establece la entrada /Lang en el elemento de estructura actualmente abierto (ISO 32000-1 §14.9.2). La etiqueta de idioma sobrescribe el idioma a nivel de documento declarado por SetDocumentLanguage o SetPDFUAMode para el elemento y todos sus descendientes, permitiendo que los documentos multilingües marquen cada fragmento con su etiqueta de idioma BCP 47 correcta (p. ej. 'en-US', 'fr', 'zh-Hant-TW'). Los lectores de pantalla usan el /Lang a nivel de elemento para seleccionar el motor o la voz de síntesis de texto a voz apropiados al leer el documento en voz alta. La función está disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.32.0
Cambiado
- SetStructElemActualText es una nueva API que establece la entrada /ActualText en el elemento de estructura actualmente abierto (ISO 32000-1 §14.9.4). Úsela para especificar el texto Unicode exacto que representa una secuencia de glifos cuando la extracción del flujo de contenido produciría resultados incorrectos — los casos más comunes son los glifos de ligaduras OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) y las abreviaturas con expansiones no obvias. ActualText complementa, en lugar de reemplazar, el contenido renderizado; sobrescribe lo que la tecnología de asistencia y los extractores de texto leen para ese elemento sin suprimir el renderizado visual. La función está disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.31.1
Cambiado
- GetPDFUADiagnostics ahora verifica los elementos de estructura Formula además de los elementos Figure al informar la falta de texto Alt (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 exige descripciones alternativas tanto para las figuras gráficas como para las fórmulas matemáticas; previamente sólo se escaneaban los elementos Figure.
- GetPDFUADiagnostics ahora informa PDF-VERSION-LOW cuando la versión PDF del documento está por debajo de 1.7. PDF/UA-1 (ISO 14289-1) se define frente a PDF 1.7 (ISO 32000-1:2008); los documentos en PDF 1.5 o 1.6 no satisfarían los requisitos de la especificación base. Llame a SetPDFUAMode para elevar automáticamente la versión a 1.7.
Version 3.31.0
Corregido
- Ahora se soportan los IDs de elementos de estructura y la asociación de cabeceras de tabla. SetStructElemID asigna un identificador de cadena único (/ID) al elemento de estructura actualmente abierto; los IDs se recopilan en un árbol de nombres /IDTree en la raíz del árbol de estructura al guardar el documento, permitiendo que las herramientas de accesibilidad y las referencias cruzadas localicen elementos por ID (ISO 32000-1 §14.7.4). SetStructElemHeaders asocia la celda de tabla actual (TD o TH) con una o más celdas de cabecera vía una lista separada por comas de IDs asignados previamente, escribiendo el array /Headers en el diccionario del owner de atributo Table (ISO 32000-1 §14.8.5.7.2). Juntas, estas dos funciones soportan el marcado de tabla complejo para PDF/UA-1 (ISO 14289-1 §7.10) y WCAG 2.x SC 1.3.1. Ambas funciones están disponibles en la biblioteca Delphi, ActiveX y las interfaces DLL. AddTagAttribute también maneja ahora correctamente el atributo /Headers con valores delimitados por comas escritos como arrays de cadenas de texto PDF.
Version 3.30.1
Añadido
- GetPDFUADiagnostics ahora incluye una verificación HEADING-LEVEL-SKIP:N que detecta saltos de nivel de encabezado en el orden del documento (p. ej. un H1 seguido inmediatamente por un H3 sin un H2 en medio). La verificación realiza un recorrido en preorden de todo el árbol de elementos de estructura y cuenta cada aparición donde el siguiente nivel de encabezado excede al anterior en más de uno. Los elementos H genéricos se tratan como H1. Volver a un nivel de encabezado superior (H3 → H1) no se cuenta como un salto. El Criterio de Éxito 1.3.1 de WCAG 2.x e ISO 14289-1 §7.1 exigen que los encabezados se aniden sin huecos.
Version 3.30.0
Cambiado
- Ahora se soportan los atributos de los elementos de estructura para PDF etiquetado y documentos PDF/UA. Tres nuevas funciones de API permiten adjuntar atributos al elemento de estructura que se está construyendo actualmente en la pila de etiquetas: AddTagAttribute (de propósito general, cualquier owner/nombre/valor), SetStructElemScope (envoltorio de conveniencia que establece el atributo /Scope bajo el owner Table, para celdas de cabecera TH — ISO 32000-1 §14.8.5.7.2) y SetStructElemBBox (envoltorio de conveniencia que establece el atributo /BBox bajo el owner Layout, para figuras y otros elementos posicionados visualmente — ISO 32000-1 §14.8.5.4). Al guardar el documento, los atributos se escriben como diccionarios de atributos /A en cada elemento de estructura; múltiples atributos del mismo owner se agrupan en un solo diccionario, y atributos de diferentes owners se escriben como un array de diccionarios. Las tres funciones están disponibles en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.29.1
Añadido
- GetPDFUADiagnostics ahora incluye dos verificaciones adicionales: si a algún elemento de estructura Figure en el documento le falta un valor de texto Alt (informado como FIGURE-NO-ALT:N, según ISO 14289-1 §7.5 e ISO 32000-1 §14.9.3), y si algún elemento de estructura sigue abierto porque no se llamó a EndTag (informado como STRUCT-UNCLOSED:N). La verificación de figuras realiza un recorrido recursivo completo del árbol de elementos de estructura, cubriendo elementos en todas las profundidades de anidamiento.
Version 3.29.0
Cambiado
- GetPDFUADiagnostics es una nueva API de diagnóstico que verifica un documento en busca de posibles problemas de conformidad PDF/UA-1 (ISO 14289-1) y devuelve una lista de hallazgos separados por saltos de línea. Se realizan seis verificaciones: si MarkInfo/Marked está establecido (PDF etiquetado), si el catálogo del documento tiene una entrada /Lang, si ViewerPreferences/DisplayDocTitle es true, si los metadatos XMP contienen un identificador pdfuaid:part, el conteo de anotaciones no exentas que carecen de una entrada Contents, y el conteo de archivos incrustados que carecen de una entrada AFRelationship. Cada hallazgo se identifica con un código corto (p. ej. LANG-MISSING, ANNOT-NO-CONTENTS:3) seguido por una descripción legible por humanos. Devuelve una cadena vacía cuando no se encuentran problemas. Disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.28.5
Cambiado
- Mejora de accesibilidad de anotaciones PDF/UA-1: cuando una anotación FileAttachment no tiene una entrada Contents ni un campo /T, ahora se utiliza como descripción accesible alternativa el nombre del archivo procedente de la especificación de archivo incrustado de la anotación (/FS /UF o /F). Esto completa la cadena de respaldo del Contents de anotaciones: /T → URI de Link → nombre de Stamp → nombre de archivo FileAttachment. Los lectores de pantalla reciben el nombre del archivo adjunto en lugar de silencio, satisfaciendo ISO 14289-1 §7.18.1 para los tipos de anotación más comunes.
Version 3.28.4
Cambiado
- Mejora de accesibilidad de anotaciones PDF/UA-1: cuando una anotación Stamp no tiene una entrada Contents (o está vacía) ni un campo /T, ahora se utiliza como descripción accesible alternativa el nombre del tipo de sello procedente de la entrada /Name de la anotación (p. ej. "Approved", "Draft", "Confidential", "Final"). Esto extiende la cadena de respaldo del Contents de anotaciones introducida en v3.28.3 para cubrir las anotaciones Stamp, que son comunes en los flujos de trabajo que implican documentos revisados o aprobados y a menudo carecen de un valor Contents explícito.
Version 3.28.3
Cambiado
- Mejora de accesibilidad de anotaciones PDF/UA-1: cuando una anotación Link no tiene una entrada Contents (o está vacía) ni un campo /T, ahora se utiliza como descripción accesible alternativa el URI procedente de la acción URI de la anotación. Esto se aplica sólo durante el procesamiento de SetPDFUAMode y sólo a las anotaciones Link que llevan una acción /URI. Los lectores de pantalla reciben la URL como etiqueta de último recurso, satisfaciendo ISO 14289-1 §7.18.1 en el caso común en el que los autores crean hipervínculos sin proporcionar una descripción legible por humanos.
Version 3.28.2
Cambiado
- SetEmbeddedFileAFRelationship es una nueva API para establecer explícitamente el valor AFRelationship en el diccionario de especificación de archivo de un archivo incrustado. Requerido por ISO 14289-1 (PDF/UA-1) §7.11, esto permite a los llamadores especificar la relación semántica de un archivo incrustado con el contenido del documento eligiendo entre los cinco valores válidos: Source, Data, Alternative, Supplement o Unspecified. Cuando SetPDFUAMode está activo, cualquier archivo incrustado sin una clave AFRelationship recibe automáticamente Unspecified; use esta función para sobrescribir ese valor por defecto antes de guardar. Disponible en la biblioteca Delphi, ActiveX y las interfaces DLL.
Version 3.28.1
Cambiado
- Cuando se llama a SetPDFUAMode sobre un documento cuyos metadatos XMP llevan el título genérico por defecto de la biblioteca en lugar de uno específico del documento, el título se reemplaza ahora automáticamente con el valor de la entrada Title del /Info del documento (si está presente). Esto garantiza que el paquete XMP pdfuaid:part-1 refleje el título real del documento en lugar de un marcador de posición, satisfaciendo las expectativas de los verificadores PDF/UA-1.
- El parser XMP (LoadFromString) ahora lee el valor dc:title de los metadatos XMP existentes cuando se carga un documento, de modo que el round-trip de un PDF que ya tiene dc:title preserva correctamente ese título en lugar de revertir al marcador de posición por defecto.
Version 3.28.0
Cambiado
- BeginArtifactEx(ArtifactType, ArtifactSubtype) es una nueva API de PDF etiquetado que extiende BeginArtifact para expresar tanto el /Type del artifact como el /Subtype de Pagination en una sola llamada. Cuando ambos parámetros son no vacíos, el operador escrito es /Artifact << /Type /T /Subtype /S >> BMC, permitiendo artifacts Pagination completamente especificados como cabeceras y pies de página según ISO 32000-1 §14.8.2.2.1. Si sólo un parámetro es no vacío, se usa la forma de clave única correspondiente. También se exportan los puntos de entrada DLL DLBeginArtifactEx y DLBeginArtifactExA.
Version 3.27.2
Corregido
- BeginArtifact ahora distingue correctamente los tipos de artifact de los subtipos de paginación. Cuando el argumento es Pagination, Layout o Page (tipos de artifact según ISO 32000-1 §14.8.2.2.1 Table 330), el operador de contenido marcado escribe /Type en lugar de /Subtype. Otros valores como Header, Footer y Watermark se siguen escribiendo como /Subtype. Esto corrige la salida incorrecta anterior que escribiría /Subtype /Pagination cuando el llamador pretendía marcar un artifact de paginación.
Version 3.27.1
Cambiado
- Cuando el modo PDF/UA está activo y el documento contiene archivos incrustados, cada diccionario de especificación de archivo que carece de una entrada AFRelationship recibe ahora una automáticamente al guardar. El valor escrito es /Unspecified, satisfaciendo el requisito ISO 14289-1 §7.11 de que cada archivo incrustado lleve una clave AFRelationship. Esto se aplica tanto a los archivos añadidos vía EmbedFile como a los archivos incrustados ya presentes en un documento cargado.
Version 3.27.0
Cambiado
- AddRoleMap(CustomType, StandardType) es una nueva API de PDF etiquetado que registra una asignación de un nombre de tipo de elemento de estructura personalizado (no estándar) a un tipo de estructura PDF estándar. Al guardar, las asignaciones se escriben en el diccionario RoleMap en la raíz del árbol de estructura, satisfaciendo el requisito ISO 14289-1 §7.1 para documentos que usan nombres de etiqueta específicos de la aplicación. Se pueden registrar múltiples asignaciones; las claves duplicadas se sobrescriben con la última llamada. También se exportan los puntos de entrada DLL DLAddRoleMap y DLAddRoleMapA.
Version 3.26.0
Cambiado
- BeginTagEx(TagType, AltText, ActualText, Lang) es una nueva API de PDF etiquetado que extiende BeginTag con un atributo explícito de lengua natural. Cuando Lang es no vacía se escribe en el atributo /Lang del elemento de estructura, permitiendo la anotación de idioma por elemento requerida por ISO 14289-1 §7.2 para documentos multilingües. Pase una cadena Lang vacía para que se comporte de manera idéntica a BeginTag. También se exportan los puntos de entrada DLL DLBeginTagEx y DLBeginTagExA.
Version 3.25.1
Cambiado
- Las fuentes TrueType no subset cargadas con la página de códigos predeterminada de Windows (WinAnsiEncoding) reciben ahora un flujo CMap ToUnicode, permitiendo una extracción fiable de texto Unicode y copiar/pegar para estas fuentes. Anteriormente sólo se escribía un flujo ToUnicode cuando estaba presente una sobreescritura explícita de página de códigos o un array Differences; la ruta común con codificación por defecto carecía de él.
- La misma corrección se aplica a las fuentes TrueType cargadas con una página de códigos no predeterminada explícita pero sin array Differences, y a las fuentes cargadas mediante el formato de fuente empaquetado.
Version 3.25.0
Cambiado
- Cuando el modo PDF/UA está activo, las anotaciones no exentas (todos los tipos excepto Widget, PrinterMark y TrapNet) que carecen de una entrada Contents no vacía reciben ahora una automáticamente al guardar. Se usa como valor de respaldo el valor /T (título / autor) de la anotación, satisfaciendo ISO 14289-1 §7.18.1 para las anotaciones que llevan un título pero ninguna descripción accesible explícita.
Version 3.24.0
Cambiado
- Cuando el modo PDF/UA está activo, los campos de formulario interactivos que carecen de una entrada TU (tooltip / descripción alternativa) reciben ahora una automáticamente al guardar. Se usa como valor de respaldo el nombre parcial del campo (entrada /T), garantizando que los lectores de pantalla puedan identificar cada campo. Los botones de tipo push se excluyen correctamente de este requisito según ISO 14289-1 §7.18.4.
Version 3.23.1
Cambiado
- GetInformation(200) devuelve '1' cuando el modo PDF/UA-1 está activo en el documento seleccionado, permitiendo a los llamadores consultar el estado del modo de conformidad en tiempo de ejecución.
- GetInformation(201) devuelve '1' para PDF/A-1a, '2' para PDF/A-1b, o una cadena vacía cuando el modo PDF/A está desactivado.
- GetInformation(313) devuelve la cadena de versión PDF en la que el objetivo de guardado está actualmente bloqueado, o una cadena vacía para documentos con versionado libre.
Corregido
- GetInformation(311) y GetInformation(312) devuelven ahora correctamente la cadena de requisito de versión y el nombre de función del conflicto más reciente de bloqueo de versión (anunciado anteriormente en la entrada de v3.20.3 pero aún no implementado).
Version 3.23.0
Cambiado
- SetMarkInfo(Marked) es ahora una API pública, permitiendo que la bandera MarkInfo.Marked se establezca de forma independiente de la configuración completa de PDF/UA-1 realizada por SetPDFUAMode. Cuando Marked es 1, MarkInfo.Suspects también se establece a false como requiere ISO 14289-1 §7.18.6.
- Cuando el modo PDF/UA está activo, todas las páginas reciben automáticamente una entrada /Tabs /S al guardar, satisfaciendo el requisito de orden de tabulación basado en estructura de ISO 14289-1 §7.18.4.
- Se añade documentación de referencia HTML para SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact y EndArtifact, con tablas de sintaxis completas y ejemplos de uso.
Version 3.22.0
Cambiado
- BeginTag(TagType, AltText, ActualText) abre un elemento de estructura de PDF etiquetado en el flujo de contenido actual, escribiendo un operador BDC con un MCID asignado automáticamente y registrando el elemento en el árbol de estructura del documento. TagType es cualquier tipo de estructura estándar PDF (P, H1, Figure, Table, etc.). AltText y ActualText son cadenas opcionales de accesibilidad codificadas como cadenas de texto PDF (UTF-16BE).
- EndTag cierra el elemento de estructura abierto más recientemente, escribiendo el operador EMC correspondiente en el flujo de contenido.
- BeginArtifact(SubType) marca una región de contenido como un artifact PDF (artifact de paginación, fondo, etc.), escribiendo un operador BMC. SubType es opcional; cuando se proporciona se escribe como /Artifact << /Subtype /SubType >>.
- EndArtifact cierra la región del artifact con un operador EMC.
- Al guardar, cuando se han registrado elementos de estructura etiquetados, la biblioteca construye automáticamente el StructTreeRoot completo, asigna claves StructParents a las páginas afectadas y escribe el árbol numérico ParentTree, satisfaciendo los requisitos de ISO 32000-1 §14.7 para PDF etiquetado.
- Las fuentes Type 1 estándar (familias Helvetica, Times, Courier, Symbol) y las fuentes Type 1 incrustadas con codificación WinAnsi reciben ahora un flujo CMap ToUnicode, permitiendo una extracción fiable de texto Unicode y copiar/pegar para estos tipos de fuente.
Version 3.21.0
Cambiado
- SetPDFUAMode(Language) activa el modo de conformidad PDF/UA-1 (ISO 14289-1): eleva automáticamente el documento a PDF 1.7, escribe MarkInfo.Marked y MarkInfo.Suspects, habilita DisplayDocTitle en ViewerPreferences, establece Catalog.Lang cuando Language es no vacía, y escribe la entrada de espacio de nombres XMP pdfuaid:part = 1 requerida por ISO 14289-1 Section 6.7.11.
- SetDocumentLanguage(Language) escribe la entrada Catalog /Lang directamente, permitiendo que el idioma del documento se declare de forma independiente del modo PDF/UA.
- MarkInfo.Suspects se establece ahora a false siempre que MarkInfo.Marked se establece a true, satisfaciendo el requisito de estructura de PDF etiquetado de ISO 14289-1 (Section 7.18.6).
- Encrypt fuerza ahora la bandera de permiso CanCopyAccess (copia de contenido para accesibilidad) cuando el documento está en modo PDF/UA, como requiere ISO 14289-1 Section 7.17.
Corregido
- Los campos de formulario Choice (desplegables) ya no llevan un valor de tooltip codificado sin sentido; TU se deja sin establecer para que el llamador pueda asignar una etiqueta significativa vía la API de propiedades de campo de formulario.
Version 3.20.3
Cambiado
- Encrypt y AddSWFAnnotationFromFile devuelven ahora 0 inmediatamente con LastErrorCode 602 cuando la versión de guardado está bloqueada por debajo del mínimo requerido por la fuerza de cifrado o tipo de anotación seleccionados, en lugar de proceder silenciosamente y fallar sólo al guardar.
- GetInformation(311) y GetInformation(312) reflejan ahora el requisito de versión conflictivo en el momento de la escritura cuando una versión bloqueada impide funciones de nivel de extensión como AES-256 o anotaciones RichMedia.
Version 3.20.2
Cambiado
- AddU3DAnnotationFromFile eleva ahora automáticamente la versión del documento a PDF 1.6 cuando se añade una anotación 3D a un documento de versión inferior, en consonancia con el comportamiento de elevación automática de versión de todos los demás puntos de entrada de API PDF 1.6+.
Version 3.20.1
Cambiado
- Los objetivos de guardado PDF 1.2 se imponen ahora como contratos estrictos de PDF 1.2. Guardar objetos PDF 1.3+ como los datos de TrimBox de página bajo un objetivo PDF 1.2 falla antes de escribir la salida en lugar de emitir un archivo de versión mixta.
- El cumplimiento del nivel de extensión Adobe de PDF 1.7 es ahora parte del preflight de guardado. AESV3, AES-256, RichMedia, Projection, los diccionarios geoespaciales y los subfiltros de firma ETSI se verifican contra el ExtensionLevel requerido.
- El cifrado AES-256, las anotaciones RichMedia, los diccionarios geoespaciales y los subfiltros de firma ETSI declaran ahora la entrada Adobe Extensions correspondiente cuando PDFlib eleva automáticamente un documento al contenido de extensión PDF 1.7.
- Los guardados Append usan ahora la misma puerta de cumplimiento de versión que los guardados completos.
- Las DLLs opcionales de runtime PDFium incluidas se actualizaron para Win32 y Win64. GDI+ sigue siendo el renderizador por defecto; PDFium permanece opt-in vía SetPDFiumFileName y SelectRenderer(3).
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 207/207 cada una, y la suite GoogleTest C++Builder Win64x pasó 61 tests con 2 tests existentes dependientes de muestras omitidos.
Version 3.20.0
Cambiado
- Ocho puntos de entrada de escritura PDFlib más se enrutan ahora a través de Phase 3 EnsureMinVersion, de modo que la versión del documento se eleva automáticamente al mínimo requerido por la función que se emite: SetDocumentMetadata (PDF 1.4 - /Metadata XMP stream) SetPDFAMode(1 or 2) (PDF 1.4 - /MarkInfo + /OutputIntents) PageJavaScriptAction (PDF 1.5 - Page /AA + JavaScript) DocJavaScriptAction (PDF 1.4 - Catalog /AA + JavaScript) SetTabOrderMode (PDF 1.5 - Page /Tabs) NewOptionalContentGroup (PDF 1.5 - /Type /OCG) SetNeedAppearances (PDF 1.5 - AcroForm /NeedAppearances) NewFormField(ftSignature) (PDF 1.5 - AcroForm /SigFlags AppendOnly)
- Combinado con el conjunto de v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) y el conjunto de v3.17.0 (ocho entradas de JavaScript / archivo incrustado / XFA / SWF), PDFlib eleva ahora automáticamente FVersion a través de veintiun puntos de entrada de escritura.
- NewOptionalContentGroup elevaba previamente FVersion directamente; ahora pasa por EnsureMinVersion para que se respete LockSaveVersion y la elevación se registre en AutoBumpedFeatures.
Version 3.19.0
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado y carga reconoce ahora también cuatro funciones previamente diferidas: Btn /Ff bit 15 NoToggleToOff (radio-button-only) -> PDF 1.4 DeviceN /Subtype /NChannel (color-space refinement) -> PDF 1.6 FontFile3 /Subtype /OpenType (font program type) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached or ETSI.RFC3161 -> PDF 1.7
- La regla NChannel coincide con la forma de array de espacio de color DeviceN [/DeviceN names alternateSpace tintTransform attributes] cuando el diccionario de atributos en el índice 4 lleva /Subtype /NChannel.
- La regla OpenType FontFile3 se dispara sólo cuando el flujo se alcanza a través de una clave padre llamada 'FontFile3', de modo que los flujos no relacionados que casualmente llevan /Subtype /OpenType no se marcan.
- La tabla PDFFeatureRules tiene ahora 103 reglas (99 + 4 nuevas).
Version 3.18.6
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado y carga reconoce ahora /AA (acciones adicionales) con conciencia del tipo de contenedor: Catalog /AA (document-level triggers) -> PDF 1.4 Annot /AA (annotation triggers) -> PDF 1.4 Page /AA (page triggers) -> PDF 1.5
- /AA de campo de formulario (PDF 1.2) sigue cubierto por el contrato de guardado PDF 1.3 existente; no se necesita ninguna regla.
- La tabla PDFFeatureRules tiene ahora 99 reglas (96 + 3 nuevas).
Version 3.18.5
Añadido
- Nueva regla: AcroForm /NeedAppearances se reconoce como una función PDF 1.5 según la Table 218 de PDF 1.5.
Cambiado
- La tabla PDFFeatureRules tiene ahora 96 reglas (95 + 1 nueva).
Corregido
- El cumplimiento de versión PDF en tiempo de guardado y carga clasifica ahora correctamente Page /Tabs como una función PDF 1.5; antes estaba clasificada erróneamente como PDF 1.4. El documento de cambios de la especificación PDF 1.4 (Adobe TN #5409) no lista /Tabs, y la Table 8.10 de PDF 1.5 introduce "Tabs (Optional; PDF 1.5)".
Version 3.18.4
Añadido
- La cobertura de regresión de zlib-ng incluye ahora cargas de tamaño límite, datos de línea de escaneo tipo PNG, flujos almacenados multi-bloque, y flujos zlib conocidos a través de los runners de test Delphi y C++Builder.
Cambiado
- PDFlibZLib usa ahora siempre el backend de objetos estáticos zlib-ng incluido en las builds normales de la biblioteca, eliminando la ruta de respaldo restante de System.ZLib.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 194/194 cada una, y la suite GoogleTest C++Builder Win64x pasó 58 tests con 2 tests existentes dependientes de muestras omitidos.
Version 3.18.3
Cambiado
- Las demos Delphi y C++Builder que generan salida PDF o de texto abren ahora el documento generado automáticamente después de un guardado exitoso.
- El empaquetado del instalador mantiene ahora los artefactos de build fuera de las carpetas de demo y hace que las muestras C++Builder más los módulos DLL y ActiveX/OCX sean componentes opt-in; sus archivos correspondientes se instalan sólo cuando se selecciona el componente.
Version 3.18.2
Cambiado
- Las demos EditFormField Delphi y C++Builder borran ahora /NeedAppearances antes de actualizar los valores de los campos, de modo que cada campo de texto editado obtiene un flujo de apariencia normal refrescado en el PDF guardado.
- Esto mantiene el flujo /AP guardado en sincronía con el valor /V almacenado y evita diferencias dependientes del visor en las que enfocar el campo revela texto que faltaba en la apariencia estática del campo.
Version 3.18.1
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado y carga reconoce ahora también las banderas /Ff de campo de formulario a nivel de bit y el bit AppendOnly de AcroForm /SigFlags: /Ff bit 21 (FileSelect, mask 1048576) -> PDF 1.4 /Ff bit 22 (MultiSelect, mask 2097152) -> PDF 1.4 /Ff bit 23 (DoNotSpellCheck, mask 4194304) -> PDF 1.4 /Ff bit 24 (DoNotScroll, mask 8388608) -> PDF 1.4 /Ff bit 25 (Comb, mask 16777216) -> PDF 1.5 /Ff bit 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff bit 27 (CommitOnSelChange, mask 67108864) -> PDF 1.5 /SigFlags bit 2 (AppendOnly, mask 2) -> PDF 1.5
- No se sigue la herencia /Parent: sólo los diccionarios que llevan explícitamente /Ff o /SigFlags disparan las reglas.
- La tabla PDFFeatureRules tiene ahora 95 reglas (87 + 8 nuevas a nivel de bit).
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 191/191 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.18.0
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado y carga reconoce ahora también nueve funciones adicionales a nivel de subclave y bit: banderas de anotación a nivel de bit (máscara /F): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 subclaves distintivas de catálogo y página: /BoxColorInfo (page) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (page geospatial viewport) -> PDF 1.6 /Collection (catalog portable collection) -> PDF 1.7
- La tabla PDFFeatureRules tiene ahora 87 reglas (78 a nivel de capítulo + 9 a nivel de subclave / bit).
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 189/189 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.17.0
Cambiado
- Ocho puntos de entrada de escritura PDFlib más se enrutan ahora a través de Phase 3 EnsureMinVersion, de modo que la versión del documento se eleva automáticamente al mínimo requerido por la función que se emite: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - JavaScript actions) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - file attachments) SetXFAFromString (PDF 1.5 - XFA forms) AddSWFAnnotationFromFile (PDF 1.7 - RichMedia annotation)
- Combinado con el conjunto de v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout), PDFlib cubre ahora trece puntos de entrada de escritura de versión alta de extremo a extremo.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 187/187 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.16.3
Añadido
- Nueva API PDFlib: LockSaveVersion(Version) ancla el documento en Version y detiene la elevación automática de Phase 3 EnsureMinVersion del lado del escritor por encima de ella. UnlockSaveVersion borra el bloqueo.
Cambiado
- La puerta de tiempo de guardado está sin cambios: las funciones emitidas por el escritor por encima de la versión bloqueada siguen produciendo LastErrorCode 602 al guardar, en lugar de elevar silenciosamente el encabezado.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 184/184 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.16.2
Cambiado
- Los PDFs cargados exponen ahora una vista exclusiva de contribuidores de la detección de funciones en tiempo de carga a través de GetInformation(103) ("ContributorFeatures"). La lista contiene sólo las funciones cuya versión mínima requerida es estrictamente mayor que HeaderVersion (clave 100), de modo que responde directamente a "por qué la versión efectiva es mayor que el encabezado del archivo".
- GetInformation(101) ("DetectedFeatures") está sin cambios y aún lista cada función coincidente independientemente de la contribución.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 181/181 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.16.1
Añadido
- Cobertura ampliada de tests de detección del lado del cargador con seis fixtures sintéticos adicionales: ExtGState de transparencia en página (sin elevación de versión), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + contenido OCG (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), un fixture de combinación multi-función, y una verificación de estabilidad de snapshot.
Cambiado
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 179/179 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.16.0
Añadido
- Nuevas claves GetInformation: 100 devuelve HeaderVersion (literal %PDF-X.Y), 101 devuelve DetectedFeatures (funciones coincidentes en la carga, delimitadas por CRLF), 102 devuelve AutoBumpedFeatures (funciones que dispararon EnsureMinVersion del lado del escritor, delimitadas por CRLF).
Cambiado
- Los documentos PDF cargados pasan ahora por un pase de detección de versión orientado al contenido: cada objeto indirecto se recorre a través de la tabla de función-a-versión mínima usada por la puerta de tiempo de guardado, y FVersion se eleva por encima del valor literal del encabezado %PDF-X.Y cuando el contenido realmente requiere una versión superior. Por ejemplo, una entrada de página /UserUnit eleva la versión efectiva a PDF 1.6 incluso cuando el encabezado del archivo dice PDF 1.4.
- La puerta de tiempo de guardado no se ve afectada: los documentos cuya versión efectiva se elevó al cargar, y luego se rebajaron explícitamente con SetInformation(0, ...), siguen produciendo LastErrorCode 602 al guardar.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 173/173 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.15.0
Cambiado
- Los puntos de entrada de escritura que producen funciones que requieren una versión mínima PDF particular elevan ahora automáticamente la versión PDF del documento. Llamar a SetTransparency en un documento marcado como PDF 1.3 promueve ahora el encabezado a PDF 1.4 en lugar de fallar el guardado con LastErrorCode 602.
- Conectada la misma elevación automática en SetPageUserUnit (>=1.6), Encrypt con Strength 1/2/3/4 (>=1.4/1.6/1.7/1.7 respectivamente), y las dos variantes de página de SetPageLayout (>=1.5).
- Cambio de comportamiento frente a 3.14.x: las aplicaciones que antes dependían de la puerta "save target rejects writer-emitted features" de v3.12.6 tienen ahora éxito en la versión elevada. Los PDFs cargados que ya contienen funciones de versión superior siguen pasando por la puerta de tiempo de guardado existente, de modo que cargar un PDF etiquetado y seleccionar PDF 1.3 sigue fallando con LastErrorCode 602.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 170/170 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.14.3
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado reconoce ahora también los tipos restantes de diccionario 3D PDF 1.6 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) y los subtipos de anotación PDF 1.7 Redact, RichMedia y Projection, más los diccionarios complementarios /Type /Requirement y /ReqHandler.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 168/168 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.14.2
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado reconoce ahora también funciones PDF 1.5: formularios /XFA, /AlternatePresentations, árbol de nombres /Renditions, los diccionarios multimedia /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers, y el subtipo de anotación Screen.
- Guardar como PDF 1.4 rechaza ahora los documentos que llevan estas funciones con LastErrorCode 602.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 166/166 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.14.1
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado reconoce ahora también funciones PDF 1.4: diccionarios /StructTreeRoot /MarkInfo y StructElem de PDF etiquetado, las entradas /Lang del documento y /Tabs de página, los diccionarios /OutputIntents y /OutputIntent, la firma de derechos de uso /UR3, y los subtipos de anotación PDF 1.4 Polygon, PolyLine, Caret, Ink, Popup y Watermark.
- Guardar como PDF 1.3 rechaza ahora los documentos que llevan estas funciones con LastErrorCode 602.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 165/165 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.14.0
Cambiado
- El cumplimiento de versión PDF en tiempo de guardado reconoce ahora también funciones PDF 1.3 como smooth shading, objetos de función, espacios de color ICCBased y DeviceN, entradas de página /TrimBox /BleedBox /ArtBox, CMaps /ToUnicode, anotaciones de archivo adjunto y /Sound y /Movie, diccionarios /Type /Filespec y /Type /EmbeddedFile, las claves /Group /EF /Alternates /Mask, y acciones JavaScript.
- Los llamadores PDF 1.2 guardan ahora bajo el contrato PDF 1.3: se preserva el encabezado literal %PDF-1.2, pero la puerta acepta funciones PDF 1.3. Las funciones PDF 1.4 y posteriores siguen siendo rechazadas con LastErrorCode 602.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 162/162 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.13.0
Cambiado
- Refactorizada la puerta de cumplimiento de versión PDF que rechaza las funciones de versión posterior en tiempo de guardado a un módulo dedicado para que el conjunto de reglas pueda crecer sin agitar el núcleo del documento.
- Sin cambio de comportamiento visible al usuario frente a v3.12.7: las mismas funciones fuera de versión siguen siendo rechazadas con LastErrorCode 602.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 155/155 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.12.7
Añadido
- Cobertura ampliada de tests automatizados para el flujo de renderizado de acceso directo PdfToImage tanto en las suites Delphi DUnitX como C++Builder GoogleTest.
Cambiado
- El runner de tests Delphi VCL GUI registra ahora los fixtures Syntax y XRef, igualando la cobertura del runner de consola.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 147/147 cada una, y la suite GoogleTest C++Builder Win64x pasó 57/57.
Version 3.12.6
Cambiado
- Guardar como PDF 1.3, 1.4, 1.5, 1.6 o 1.7 hace cumplir ahora la versión seleccionada como el contrato completo de salida de guardado.
- Los guardados completos eliminan las sobreescrituras de /Version del catálogo, eliminan las entradas de extensión de catálogo y metadatos no soportadas para objetivos inferiores, y suprimen los flujos de metadatos XMP PDF 1.4 al guardar como PDF 1.3.
- SaveToFile, SaveToString y SaveToStream fallan ahora con LastErrorCode 602 cuando la versión objetivo PDF seleccionada es inferior a las funciones aún presentes en el documento, como transparencia, contenido opcional, JPX, UserUnit, 3D, o funciones de crypt-filter AES.
Version 3.12.5
Añadido
- Añadida cobertura de regresión para escapes literales desconocidos y secuencias de escape octales/no octales mezcladas.
Cambiado
- Mejorado el análisis de cadenas literales PDF 1.7 para que las secuencias de escape desconocidas ignoren la barra invertida como requiere el estándar.
- Los escapes octales de cadenas literales consumen ahora sólo dígitos octales y preservan un siguiente dígito no octal como datos de cadena regulares.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 141/141 cada una.
Version 3.12.4
Añadido
- Añadida cobertura de regresión para delimitadores de nombre de llave derecha y entradas dispersas de flujo xref de objeto comprimido.
Cambiado
- Mejorado el análisis léxico PDF 1.7 para que los objetos de nombre se detengan ahora correctamente en el delimitador de llave derecha.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 139/139 cada una.
Corregido
- Corregida la carga SmartAccess de entradas de objeto comprimido de flujo xref cuyo número de flujo de objeto es mayor que la longitud en bytes del PDF.
Version 3.12.3
Añadido
- Los nuevos PDFs cifrados con AES escriben ahora los valores Length de crypt-filter como longitudes de bits, coincidiendo con el contrato de diccionario crypt filter PDF 1.7.
Cambiado
- Mejorada la compatibilidad PDF 1.7 con documentos cifrados para archivos del manejador de seguridad estándar que usan StrF, StmF, EFF, Identity, None, o crypt filters nombrados estilo StdCF.
- Los flujos de metadatos respetan ahora EncryptMetadata=false durante los flujos de descifrado, cifrado y copia/guardado en lugar de ser procesados como flujos ordinarios.
- Los flujos de archivos incrustados llevan ahora /Type /EmbeddedFile y usan la ruta de decisión de crypt-filter de archivo incrustado cuando se cargan o guardan documentos cifrados.
- Los flujos de archivos incrustados externos promueven ahora FDecodeParms a DecodeParms cuando FFilter se promueve a Filter, preservando los parámetros de decodificación del flujo.
- Los valores Prev/XRefStm de flujo XRef y los grandes desplazamientos numéricos mantienen ahora precisión de 64 bits a través de las rutas del parser y SmartAccess.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 137/137 cada una.
Version 3.12.2
Cambiado
- Mejorada la compatibilidad de decodificación de flujos PDF 1.7. La decodificación genérica de flujos respeta ahora /DP como alias de DecodeParms, resuelve entradas de array de parámetros de decodificación indirectas, y acepta las abreviaturas de filtro estándar /AHx y /LZW.
- La salida PDF de archivo grande escribe ahora los desplazamientos xref, startxref, linearization y ByteRange de firma digital a través de rutas de formateo de 64 bits en lugar de estrechar esos valores a través de helpers de enteros de 32 bits.
- Los documentos cargados tratan ahora una entrada /Version del catálogo como la versión PDF efectiva cuando es más nueva que la versión del encabezado del archivo.
- Validación: las suites DUnitX Delphi Win32 y Win64 pasaron 134/134 cada una.
Corregido
- Los trailers reescritos de flujo xref ya no retienen claves DecodeParms exclusivas de flujo cuando PDFlibPas los guarda como diccionarios trailer clásicos.
Version 3.12.1
Cambiado
- Los PDFs generados se abren ahora con la primera página dimensionada a la altura disponible de la ventana del visor, de modo que toda la primera página es visible de arriba a abajo con el mayor zoom que cabe en la ventana. Configure una OpenAction personalizada (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) en el documento para sobrescribir este predeterminado.
Version 3.12.0
Añadido
- Añadidos stubs CRT malloc/calloc/realloc/free alineados a 32 bytes para las bibliotecas C estáticas y corregido TPDFJPEGImage.Compress para liberar los buffers jpeg_mem_dest a través de la misma ruta C free que los asignó.
- Ampliadas las notas de validación públicas para destacar la cobertura automatizada estricta detrás de esta release: builds de biblioteca, viajes redondos de compresión, salida HelloWorld /FlateDecode, renderizado JPEG, flujos de imágenes, fuentes, formularios, seguridad, firma, impresión, y flujos derivados de demo C++Builder.
Cambiado
- Los backends estáticos de Windows incluyen ahora objetos NASM SIMD de libjpeg-turbo para Win32 y Win64, más objetos de despacho SIMD x86 de zlib-ng para el conjunto zlib-ng Win64x.
- Reelaborados los scripts de reconstrucción de zlib-ng de modo que Win64x bcc64x y las builds MSVC de diagnóstico compilen los archivos fuente genéricos, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ y AVX2 con banderas de función por archivo en lugar de depender de un único interruptor global de compilador.
Version 3.11.0
Añadido
- Añadido un pequeño objeto puente zlib-ng para las builds Win64 de modo que el código Pascal mantiene puntos de entrada zlib-compatible estables mientras Delphi y C++Builder consumen sus propios conjuntos de objetos compatibles con su enlazador.
Cambiado
- Cambiada la compresión y descompresión Flate de Windows a zlib-ng en modo zlib-compatible. Win32, Delphi Win64 y C++Builder Win64x enlazan ahora conjuntos de objetos estáticos zlib-ng con ABI coincidente desde Lib\thirdparty\Win32, Lib\thirdparty\Win64 y Lib\thirdparty\Win64x.
- Actualizados todos los proyectos demo C++Builder para definir PDFLIB_CPPBUILDER, igualando el runner GoogleTest y evitando que las demos Win64x enlacen los objetos zlib-ng Delphi Win64.
Corregido
- La ruta Win64 ya no se enruta a través de la unidad System.ZLib de Delphi, de modo que la compresión/descompresión de flujos PDF puede beneficiarse del backend zlib-ng igual que la build de 32 bits.
Version 3.10.3
Añadido
- Ampliada la suite GoogleTest C++Builder para cubrir todas las demos bajo Demo\C++Builder. El layout de fase 1 de 7 fixtures creció a 15 fixtures / 52 casos GoogleTest, todos pasando en Win64x. Demos nuevamente cubiertas: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (renderer switch), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
Version 3.10.2
Añadido
- Añadido un runner GoogleTest C++Builder bajo Tests\C++Builder que ejercita Lib\PDFlibrary.pas a través de los mismos encabezados HPP emitidos por {$JPHNE} usados por las demos C++Builder. La primera fase refleja siete escenarios núcleo Delphi (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, PdfToImage rendering) como 17 casos GoogleTest, todos pasando en Win64x.
- Ampliada la suite Delphi DUnitX con Tests.Print cubriendo las demos PrintPDF y ShowPrinterBins (enumeración de impresora predeterminada, configuración de impresora personalizada, opciones de impresión, trabajo de impresión redirigido a archivo) y un test de cambio de renderer en Tests.Render ejercitando la selección de motor GDI+ / PDFium / Cairo de la demo MultiFunction sobre el mismo PDF fuente.
Version 3.10.1
Añadido
- Se añadieron 57 tamaños de página con nombre a SetPageSize para que también funcionen aquí los mismos nombres canónicos de tamaño de página: SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
Version 3.10.0
Añadido
- Añadidas versiones C++Builder nativas para cada muestra Delphi bajo Demo. Las demos de creación PDF, manipulación de páginas, fuente, imagen, seguridad, firma, renderizado e impresión pueden ahora construirse y ejecutarse desde C++Builder sin ningún wrapper del lado Delphi.
- Añadido un Readme.txt en inglés breve para cada carpeta de demo Delphi describiendo lo que la demo muestra, la API en la que se centra, y cómo ejecutarla; una vista general HTML en Demo\Delphi\index.html enlaza a todas ellas agrupadas por tema.
Cambiado
- Cada demo nueva vive en Demo\C++Builder\<Name>\ como un proyecto de consola que consume Lib\PDFlibrary.pas directamente y envía los archivos de entrada necesarios para ejecutarse.
- Reflejado el mismo Readme.txt para cada demo C++Builder con una sección Run reescrita para el flujo de consola (argumentos argv en lugar de Open/SaveDialogs); un Demo\C++Builder\index.html correspondiente lista cada demo C++Builder con los mismos grupos de tema.
Corregido
- Corregida una fuga de memoria en la demo ImportEMF (la instancia TPDFlib se creaba pero nunca se liberaba).
Version 3.9.14
Cambiado
- Ordenadas las demos de texto envuelto y paginación HTML para que cada una se centre en su propia API y se ejecute desde un único botón.
- Renombrados dos proyectos demo (EmbeddedFonts y PdfPermission) para que los ejecutables compilados coincidan con los nombres de las carpetas en lugar de nombres de prototipo más antiguos.
Corregido
- Corregida la demo de copia de rango de páginas para que realmente copie páginas en lugar de siempre informar fallo.
Version 3.9.13
Añadido
- Introducida una suite de tests automatizados DUnitX (runners de consola y VCL GUI) cubriendo unidades de utilidad — buffer, AES, ZLib, Unicode, y digest hashing — y flujos a nivel de biblioteca incluyendo creación de documento, guardado a archivo y a flujo, viajes redondos de carga, y cifrado AES-128/AES-256.
Corregido
- Corregido un bug de posición de flujo en el lector de buffer interno: las lecturas de palabra de dos bytes avanzaban el cursor de lectura cuatro bytes en lugar de dos. En buffers de más de dos bytes, las lecturas subsiguientes aterrizaban en el desplazamiento equivocado y devolvían silenciosamente datos incorrectos. El efecto era más visible al analizar estructuras de datos binarias que intercalan lecturas de byte y palabra.
Version 3.9.12
Cambiado
- El renderizado de imágenes GDI+ pasa por defecto ahora a interpolación bicúbica suave y de alta calidad al escalar imágenes raster a resolución de pantalla o exportación. Anteriormente el predeterminado era el vecino más cercano, que producía artefactos visibles de escalera en imágenes pequeñas (logos, miniaturas) ampliadas para vista previa en pantalla o exportación de alta DPI. Los llamadores que prefieran el modo más nítido de vecino más cercano pueden restaurar el comportamiento antiguo vía SetGDIPlusOptions.
Version 3.9.11
Corregido
- Corregido el renderizado Cairo de imágenes PDF que usan transparencia color-key (un array de rango de color /Mask en el diccionario de imagen). Previamente, cuando una página contenía una imagen con esta forma de transparencia, el renderer Cairo omitía la imagen por completo en lugar de componerla contra el fondo de la página. La corrección deriva un canal alfa por píxel de los rangos color-key declarados y renderiza el resultado como una imagen transparente, produciendo una salida visualmente consistente con el renderer GDI+.
Version 3.9.10
Corregido
- Corregida una regresión de renderizado Cairo donde todo el contenido de la página que seguía a una secuencia de imagen recortada se confinaba incorrectamente al rectángulo de recorte de la imagen. Las páginas PDF que guardan el estado de gráficos, aplican una ruta de recorte, pintan una imagen, y luego restauran el estado — una técnica de layout común para imágenes enmarcadas o con borde — renderizaban todo el texto, formas y gráficos subsiguientes sólo dentro de la región recortada. Cairo save y restore mapean ahora correctamente a los operadores q/Q de PDF, de modo que la región de recorte se descarta después de dibujar la imagen.
Version 3.9.9
Añadido
- Añadido un motor de renderizado PDF basado en Cairo como tercera opción de renderizado junto a GDI+ y PDFium. Llame a SelectRenderer(2) antes de renderizar para activarlo; el motor requiere cairo.dll de la carpeta DLL\Cairo incluida. El renderizado Cairo soporta los mismos modos de salida que GDI+: exportación a archivo y flujo de bitmap (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), renderizado a contexto de dispositivo, y salida directa a impresora.
Cambiado
- La demo MultiFunction View/Print expone ahora un selector de renderer de tres vías para que los usuarios puedan comparar las salidas GDI+, PDFium y Cairo lado a lado sobre el mismo documento sin ningún cambio de código.
Version 3.9.8
Corregido
- Suprimidos dos diagnósticos espurios del compilador en el shim del runtime C Win32 que aparecían en RAD Studio 13.1 y posteriores. Se generaba una advertencia de deprecación (W1000) porque una guarda de capacidad por versión del compilador no se propagaba a compiladores más nuevos que Delphi 2009, haciendo que compilaran contra una API de gestor de memoria obsoleta. Se generaba un aviso de variable no usada (H2164) para una variable interna de compatibilidad necesaria sólo para builds de Delphi 7; ahora está alcanzada al bloque condicional de esa versión. Ambos problemas eran sólo de diagnóstico sin impacto en runtime.
Version 3.9.7
Añadido
- Añadido renderizado de página basado en PDFium opcional en Windows, incluyendo renderizado de flujo BMP, renderizado a contexto de dispositivo, renderizado a memoria, y salida a impresora.
Cambiado
- Actualizada la demo Delphi MultiFunction View/Print con un selector de renderer para que los usuarios puedan cambiar entre el renderer GDI+ existente y PDFium.
Version 3.9.6
Añadido
- Añadidos scripts Inno Setup separados para el paquete completo PDFlibPas y el paquete trial, con exclusiones enfocadas en release para metadatos de control de fuente, salidas de build, cachés de IDE, archivos de agente locales, y árboles de fuente de terceros incluidos que no forman parte del paquete enviado.
Cambiado
- El instalador trial construye y empaqueta ahora bibliotecas binarias trial para RAD Studio 11.3, 12.3 y 13.1, más las demos trial Delphi, antes de generar el ejecutable de setup.
Version 3.9.5
Corregido
- Corregidas las builds de biblioteca Win32 bajo RAD Studio 9.0 / Delphi XE2. El script de build pasaba una bandera de directorio de salida DCU que sólo existe desde Delphi 2010 en adelante; el compilador de XE2 interpretaba la bandera de forma diferente, produciendo una ruta de salida ilegible y un error fatal antes de procesar ningún archivo fuente. El script selecciona ahora la bandera apropiada automáticamente según la versión del compilador objetivo.
- Corregida una guarda de versión del compilador relacionada en la fuente de la biblioteca que llamaba a una función de runtime cualificada por nombre introducida en XE4 bajo una condición XE2+. Las builds que apuntan a XE2 y XE3 resuelven ahora correctamente la importación de compatibilidad apropiada.
Version 3.9.4
Corregido
- Corregida la configuración de impresora para impresoras de red y compartidas en servidor aplicando bandeja de papel, medio, dúplex, calidad, y otros ajustes de impresión a través del handle DEVMODE de la impresora en lugar del handle del contexto de dispositivo de la impresora.
Version 3.9.3
Cambiado
- Actualizado el backend AES incluido a las fuentes AES de Brian Gladman de 2018 tanto en Win32 como Win64. Los scripts de build reproducibles permiten ahora reconstruir los objetos AES estáticos desde el código fuente en cualquier momento. Se descubrió y corrigió un defecto ABI en los bindings Pascal en el proceso: a las funciones AES-CBC encrypt y decrypt les faltaba su declaración de convención de llamada C, de modo que las builds Win32 pasaban silenciosamente los argumentos en el orden de registro incorrecto, produciendo potencialmente salida cifrada incorrecta. Las builds Win64 no se venían afectadas porque la plataforma impone una convención de llamada uniforme.
Seguridad
- Endurecidos los scripts de reconstrucción de terceros para que los scripts basados en MSVC para zlib, JPEG y CRT-stub puedan lanzarse tanto desde la raíz del repositorio como desde el directorio thirdparty; antes requerían que el directorio de trabajo estuviera fijado a la carpeta thirdparty.
Version 3.9.2
Corregido
- Actualizado el backend JPEG 2000 desde el OpenJPEG 1.5 heredado a OpenJPEG 2.5.4 tanto en Win32 como Win64. Ambas plataformas usan ahora enlace de objetos estáticos, de modo que la codificación y decodificación JPEG 2000 funcionan sin una DLL de runtime adicional. El códec moderno trae el manejo actual de encabezados JP2/J2K, una API de flujo dirigida por callbacks, y los bug y security fixes acumulados del proyecto upstream. La API pública TJpeg2000Bitmap está sin cambios.
Version 3.9.1
Corregido
- Corregido el renderizado de página JPEG y la exportación de imágenes después de la actualización libjpeg-turbo, restaurando la conversión JPG de PdfToImage y la salida TPDFJPEGImage.SaveToStream en Win32 y Win64.
- Corregidos los bindings ABI Win32 de libjpeg-turbo para que los callbacks, alineación de estructura, campos booleanos y destinos JPEG respaldados por memoria coincidan con libjpeg-turbo 3.1.90.
- Corregida la descompresión de flujo FlateDecode Win32 con el backend zlib 1.3.2 incluido, restaurando la carga de flujos xref PDF para archivos como el documento de muestra PdfToImage.
Version 3.9.0
Cambiado
- Actualizado el backend JPEG 2000 incluido desde el OpenJPEG 1.5 heredado a OpenJPEG 2.5.4. La carga y guardado JPEG 2000 usan ahora el códec moderno, API de flujo dirigida por callbacks, y manejo actual de encabezados JP2/J2K mientras preservan la API pública TJpeg2000Bitmap.
Corregido
- La salida JPEG 2000 selecciona ahora automáticamente un conteo válido de resolución OpenJPEG para imágenes pequeñas, y el backend estático Win32 ya no depende de exportaciones helper MSVCRT ausentes.
Version 3.8.1
Corregido
- Eliminadas las 16 advertencias cosméticas del enlazador W1028 "Bad global symbol definition" en Win32 y Win64. Los renombrados a nivel fuente eliminan los duplicados redundantes del lado Pascal (jpeg_std_error y los stubs del allocator jmemnobs se resuelven ahora únicamente desde la capa obj); a los tres símbolos obj bcc32 / vc64 restantes (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table) que deben permanecer resueltos por el enlazador contra datos del lado Pascal se les quita ahora sus nombres de símbolo COFF vía un pase de post-procesamiento ObjConv durante thirdparty\build-jpeg-vc64.bat. Sin cambio en API pública; salida limpia del enlazador tanto para builds Delphi Win32 como Win64.
Version 3.8.0
Seguridad
- Códec JPEG Win64 actualizado desde libjpeg estilo IJG a libjpeg-turbo 3.1.90, completando la migración JPEG iniciada en v3.7.0 (Win32). Las rutas Win32 y Win64 comparten ahora el mismo códec JPEG moderno, con los mismos bucles internos optimizados por SIMD y 30+ correcciones acumuladas de CVE / fuzz del upstream. API pública PDFlibPas sin cambios.
Version 3.7.0
Seguridad
- Códec JPEG Win32 actualizado desde IJG libjpeg-6b a libjpeg-turbo 3.1.90. Codificación/decodificación JPEG significativamente más rápida a través de bucles internos optimizados por SIMD, más las 30+ correcciones de CVE / fuzz acumuladas en el upstream de libjpeg-turbo. La API pública PDFlibPas (clase TPDFJPEGImage, funciones DumpJPEG) está sin cambios; las rutas de código PDF/JPEG existentes corren más rápido sin cambios de código fuente necesarios.
Version 3.6.0
Cambiado
- La ruta zlib Win64 está sin cambios en esta release - sigue usando la unidad System.ZLib incluida con Delphi.
- Activado el shim CRT en tiempo de enlace Win64 PDFlibCLibs.pas (introducido en v3.5.0) para la ruta zlib Win32, proporcionando símbolos memcpy / memset / malloc / free que los nuevos archivos obj de zlib 1.3.2 referencian.
Seguridad
- zlib Win32 actualizado de 1.2.x a 1.3.2. Incluye las 25+ correcciones estándar de CVE / fuzz acumuladas en el upstream desde 1.2.8, más los nuevos puntos de entrada inflateBack9 / inflateTree9 usados por flujos de ventana de 64 bits. La API pública PDFlibPas (DeflateStr / InflateStr / InflateStrParms) está sin cambios.
Version 3.5.0
Añadido
- Añadida infraestructura de build para OpenJPEG 2.5.4. El árbol de fuente OpenJPEG en sí es obtenido independientemente por el usuario (git clone uclouvain/openjpeg en Lib/thirdparty/OpenJPEG/) para que pueda actualizarse sin tocar la configuración de build de PDFlibPas.
- Se añadió Lib/PDFlibCLibs.pas, un shim CRT de enlace para Win64 usado por el backend Win64. Cubre la separación entre los archivos obj de C compilados con MSVC y los enlazadores Win64 de Delphi (dcc64 / Win64x ld.lld / BCB ilink64), que no incorporan msvcrt.dll automáticamente.
Cambiado
- Vendorizada infraestructura de build fresca para las bibliotecas C de imagen / compresión incluidas: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Los scripts de build tanto para Embarcadero bcc32 (Win32) como para MSVC cl.exe (Win64) viven en Lib/thirdparty/ junto a los árboles de fuente, de modo que cualquiera con RAD Studio + VS2022 puede reconstruir los archivos obj estáticos desde la fuente limpia.
Version 3.4.0
Seguridad
- Endurecida la generación de clave de cifrado, vector de inicialización AES y bloque de permisos Perms contra fuentes de números aleatorios predecibles. Los PDFs cifrados producidos en sistemas iniciados cerca del mismo tiempo wall-clock ya no son trivialmente correlacionables; los documentos AES-256 mantienen ahora su fuerza completa de clave.
- Endurecido el análisis de diccionario de imagen contra PDFs malformados u hostiles que declaran conteos no razonables de Width, Height, BitsPerComponent o componentes DeviceN. Los valores fuera de rango se acotan antes de cualquier aritmética de buffer de píxeles, evitando crash al abrir tales archivos.
- Endurecido el recorrido de referencia cruzada y árbol de páginas contra documentos cuyas cadenas xref /Prev o enlaces de página /Parent forman un ciclo o son excesivamente profundas. El lector rechaza ahora las estructuras malformadas limpiamente en lugar de recurrir hasta agotar la pila.
Version 3.3.1
Añadido
- Añadidos comentarios de justificación en línea alrededor de las correcciones de renderizado de PDFlibRenderer.pas que ya estaban presentes en la línea base inicial de Git. Los comentarios documentan por qué SetPen escala los anchos de trazo por la transformación activa del canvas, y por qué los operadores d0/d1 de CharProc de fuente Type 3 deben consumir sus operandos. Sin cambio en el comportamiento de runtime.
Corregido
- Streamlined los scripts de build de Windows por componente. Las carpetas DLL/, OCX/ y Dylib/ ya no llevan variantes build12-* / build13-* separadas: cada plataforma tiene ahora un único script build-Win32 / build-Win64 que se ancla al último RAD Studio y acepta un argumento opcional "debug".
Version 3.3.0
Corregido
- Corregido el renderizado de trazos transformados en PDFlibRenderer.pas. SetPen aplica ahora la escala de la transformación actual del canvas a los anchos de línea PDF antes de llamar a Picasso, evitando trazos de tamaño excesivo o insuficiente en rutas cuyas coordenadas ya han sido transformadas. Esto corrige los contornos de glifo Type 3 que podían renderizarse como bloques gruesos e irregulares.
- Corregido el manejo d0/d1 de CharProc de fuente Type 3 en el parser de flujo de contenido. d0 consume ahora sus dos operandos de ancho, y d1 consume sus seis operandos de ancho/bounding box antes de que se ejecuten los comandos de dibujo posteriores, evitando que operandos obsoletos corrompan la geometría de glifo o ruta.