Tres bibliotecas. Tres trabajos distintos. Elegir la equivocada cuesta semanas de parches, y elegir las tres cuando solo se necesita una cuesta sobrecarga de mantenimiento que no se había presupuestado. Aquí se ofrece una descripción directa de lo que hace realmente cada biblioteca PDF de losLab, dónde encaja y dónde cede el paso a sus compañeras.
HotPDF: escribir PDF desde cero en Delphi
HotPDF es un componente VCL nativo para generar documentos PDF. Su modelo es imperativo y centrado en la página: se construye una instancia de THotPDF, se establecen las propiedades del documento, se llama a BeginDoc, se dibuja en CurrentPage, se añaden páginas según sea necesario y se cierra con EndDoc. El orden importa porque BeginDoc confirma el diccionario de cifrado y los ajustes de compresión en el momento en que se ejecuta; cualquier cosa asignada después de ese punto se ignora silenciosamente en lugar de aplicarse retroactivamente.
La superficie de dibujo cubre el conjunto completo de operadores PDF a nivel Delphi: TextOut para texto Unicode posicionado, SetFont con incrustación TrueType, primitivas vectoriales (líneas, curvas de Bézier, elipses, rectángulos), colocación de imágenes desde fichero o memoria, y generación de códigos de barras. Las coordenadas están en puntos desde la esquina inferior izquierda con Y creciendo hacia arriba, lo que sorprende a todo el mundo al menos una vez. El estado de la fuente no sobrevive a AddPage, por lo que se requiere una llamada a SetFont después de cada salto de página.
Los campos AcroForm son ciudadanos de primera clase. Se pueden añadir campos de texto, casillas de verificación, botones de opción, cuadros combinados, cuadros de lista y botones de comando directamente a un objeto de página con una sola llamada cada uno. HotPDF también puede cargar un PDF existente mediante LoadFromFile y rellenar o leer valores de campo, lo que lo hace útil en dos flujos de trabajo separados: construir formularios y automatizar su relleno.
El cifrado también se gestiona a nivel de documento. CryptKeyLength selecciona el esquema (desde RC4 de 40 bits hasta AES-256), ActivateProtection lo activa y ProtectOptions establece los indicadores de permisos ISO. Los dos modos de revisión AES-256 (R5 y R6, controlados por UseAES256R6) existen porque la revisión 6 corrige una debilidad conocida de la revisión 5, pero requiere un visor con capacidad PDF 2.0; elegir entre ellos es una decisión de compatibilidad, no de conveniencia.
El soporte de firma digital en HotPDF cubre los perfiles de línea base PAdES, por lo que es adecuado para flujos de trabajo donde la firma debe cumplir los requisitos de ETSI EN 319 142. Si la necesidad es únicamente generar salida, HotPDF es la biblioteca a la que recurrir primero.
PDFium VCL: renderizar, visualizar y leer PDFs existentes
PDFium VCL envuelve el motor PDFium de Google como componente VCL, lo que le otorga un papel fundamentalmente distinto del de HotPDF. Donde HotPDF escribe, PDFium VCL lee y renderiza. El objeto central es TPdf, un gestor de documentos que abre un fichero estableciendo FileName y luego Active := True. Los fallos de carga no se generan como excepciones; Active simplemente permanece en False, por lo que comprobarlo después de la asignación no es opcional.
El renderizado transcurre a través de TPdfView, un componente visual que se coloca en un formulario y se vincula a una instancia de TPdf mediante PdfView.Pdf := Pdf. El zoom y el modo de ajuste residen en la vista, no en el documento. Una sutileza que confunde a mucha gente: Pdf.PageNumber y PdfView.PageNumber son propiedades independientes. Establecer una no actualiza la otra, y las API de extracción basadas en la vista (cuadros de palabras, unidades de lectura) usan la página actual de la vista, no la del documento.
La extracción de texto es donde PDFium VCL no tiene competidor directo en la gama de losLab. ReadablePageContent devuelve texto estructurado con conciencia del orden de lectura, PageWordBoxes proporciona rectángulos delimitadores a nivel de palabra, y DocumentReadingUnits recorre el documento completo. Para el trabajo de accesibilidad, IsTagged indica si hay un árbol de estructura y ValidatePdfUa ejecuta una comprobación de conformidad UA. Estas API hacen de PDFium VCL la opción natural para cualquier flujo de trabajo que necesite comprender qué contiene un PDF existente en lugar de producir uno nuevo.
El relleno de formularios también funciona en el lado de PDFium, a través de la misma capa AcroForm que expone el motor subyacente. Es adecuado cuando el documento fuente ya existe y se está automatizando su cumplimentación en lugar de construir los campos del formulario uno mismo.
PDFlibPas: manipulación, firma de conformidad y acceso directo a ficheros
PDFlibPas (versión 3.73.0) se sitúa en el otro extremo del espectro de complejidad. Expone tres capas API sobre el mismo modelo de documento: una fachada plana basada en manejadores (TPDFlib) compatible con la convención de llamada Quick-PDF, una capa completa de árbol de objetos (TPDFDocument), y un analizador en streaming (TSmartPDFReader / TSmartPDFWriter) que opera directamente sobre los bytes del fichero sin cargar el grafo de objetos completo.
La capa de streaming es lo que hace de PDFlibPas la opción correcta para documentos grandes. TSmartPDFWriter puede anexar una actualización incremental a un fichero en disco sin reconstruir toda la tabla de referencias cruzadas, que es el mecanismo subyacente tanto del guardado eficiente como de los sellos de validación a largo plazo de PAdES. Para flujos de trabajo de firma de calidad de conformidad donde el hash firmado debe cubrir un rango de bytes específico y la firma se aplica sin reescribir el documento, esta capa es el único camino viable.
La manipulación de documentos a nivel de TPDFDocument incluye la fusión con Merge, la copia selectiva de páginas mediante CopyPagesFromDoc con una cadena de rango, y la gobernanza de versiones a través de SetMinimumVersion y LockSaveVersion. El bloqueo de versión genera el error 602 si se intenta guardar una característica que elevaría la salida por encima de la versión bloqueada, lo que resulta útil cuando se necesita garantizar que la salida permanezca dentro de una revisión PDF específica para la conformidad archivística.
El soporte PDF/A (ISO 19005) se encuentra en el banco de trabajo de conformidad de PDFlibPas. Hay que tener en cuenta que el cifrado y PDF/A son mutuamente excluyentes por especificación: no se puede tener ambos en un mismo fichero. Los flujos de trabajo que necesitan una copia de distribución cifrada y una copia de archivo PDF/A deben producir dos artefactos separados.
Cómo elegir entre ellas
El árbol de decisión habitual es corto. Si se está generando un nuevo documento a partir de datos, hay que usar HotPDF. Si se está renderizando o extrayendo texto de un documento existente en una aplicación Delphi VCL, hay que usar PDFium VCL. Si se están manipulando, fusionando o firmando con conformidad PDFs existentes a escala o con semántica de guardado incremental, hay que usar PDFlibPas. Muchos sistemas en producción usan dos de las tres: HotPDF para generar salida y PDFlibPas para aplicarle un sello de validación a largo plazo antes del archivo, por ejemplo, o PDFium VCL para previsualizar lo que HotPDF produjo antes de enviarlo aguas abajo.
Las tres se distribuyen como código fuente Pascal nativo para Delphi y C++Builder, sin dependencias en tiempo de ejecución más allá de la VCL. PDFium VCL incluye adicionalmente la DLL de PDFium, que cubre el trabajo de renderizado y análisis del motor. La página de producto de cada biblioteca lleva su referencia de API completa y el historial de versiones actual.
Detalles sobre las bibliotecas individuales: HotPDF Component, PDFium VCL Component y PDFlibPas.