THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF XFA forms container (v2.119.51)

 

RegisterAcroFormFont  Soporte AcroForm

Registra un paquete XFA (XML Forms Architecture) con nombre para emitirlo dentro de la entrada /XFA del AcroForm del documento. PDF 1.7 §12.7.6 + §12.7.8 permite que un AcroForm lleve una matriz /XFA junto con la matriz estática /Fields o en su lugar, lo que habilita flujos de trabajo híbridos AcroForm + XFA o formularios XFA dinámicos puros

 

Sintaxis Delphi:

procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

Descripción

Cada llamada a AddXFAPacket registra un paquete con nombre. Nombres típicos (según la especificación XFA 3.3 y la tabla 234 de PDF 1.7 §12.7.8):

 

template - diseño del formulario + scripts (el paquete más grande en la mayoría de los documentos XFA)

datasets - vinculación de datos (la carga XML contra la que se renderiza la plantilla)

config - configuración del visor

connectionSet - conexiones de datos externas

localeSet - reglas de formato específicas de la localidad

stylesheet - estilo XSLT o CSS

xfdf - superposición de datos de formulario XFDF

xmpmeta - metadatos XMP

signature - datos XFA relacionados con la firma

sourceSet - definiciones de datos del lado de origen

 

En EndDoc cada paquete registrado se convierte en un objeto de flujo indirecto comprimido con FlateDecode, y la matriz /XFA del AcroForm alterna cadenas PDF con el nombre del paquete y referencias al flujo en el orden de registro, de modo que la disposición es determinista a nivel de bytes. ClearXFAPackets elimina todos los paquetes registrados (útil para reutilizar una instancia de THotPDF en varios documentos). XFAPacketCount devuelve el recuento actual

 

Solo compatibilidad a nivel de contenedor

HotPDF no analiza el XML XFA, no implementa el motor de diseño dinámico XFA, no ejecuta FormCalc ni JavaScript dentro de la plantilla XFA, y no valida la estructura de la plantilla. Quien llama redacta el XML XFA por su cuenta (normalmente con Adobe LiveCycle Designer o construyéndolo manualmente contra la especificación XFA 3.3) y HotPDF emite los bytes tal cual

 

Los lectores consumidores con un motor XFA (Acrobat / Reader antiguos, FormsCentral, algunos productos de kiosco) renderizan el formulario; los lectores sin motor XFA (Adobe Reader DC desde 2017 en adelante, la mayoría de los lectores de código abierto) muestran los campos AcroForm de respaldo si el documento sigue un flujo híbrido AcroForm + XFA

 

Controles de compatibilidad PDF/A y PDF/X

ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 prohíben explícitamente los formularios XFA (el motor de diseño dinámico no es archivabile de forma determinista). Los flujos de preimpresión ISO 15930 rechazan por completo los formularios interactivos. AddXFAPacket lanza una excepción de inmediato ante cualquier PDFACompliance o PDFXCompliance no vacío con la referencia de especificación correspondiente. Los nombres de paquete duplicados generan error. PacketName vacío o XMLBytes vacío generan error. RequirePDFVersion(pdf15) eleva automáticamente la versión del documento

 

Emisión del diccionario AcroForm

El diccionario AcroForm se emite cuando ya sea /Fields tiene al menos una entrada o se ha registrado al menos un paquete XFA. Quien llama en versiones anteriores a v2.119.51 y no registra paquetes mantiene una salida /AcroForm idéntica a nivel de bytes

 

Flujo de trabajo típico (pure XFA dynamic form)

 

PDF.BeginDoc;

TemplateBytes := TFile.ReadAllBytes('form-template.xml');

DataBytes     := TFile.ReadAllBytes('form-data.xml');

PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">'));

PDF.AddXFAPacket('template', TemplateBytes);

PDF.AddXFAPacket('datasets', DataBytes);

PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES }

PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>'));

PDF.EndDoc;

 

XDP wrapper, single-stream, dynamic, and signed XFA

La forma de arreglo de /XFA debe abrir y cerrar con paquetes de envoltura xdp:xdp, como ahora muestra el ejemplo (ISO 32000-1 §12.7.8). API de XFA relacionadas: SetXFADocument escribe todo el documento XFA/XDP como un único flujo /XFA, excluyente con AddXFAPacket; XFANeedsRendering establece el indicador /NeedsRendering del Catalog (ISO 32000-1 §7.7.2) para que un visor regenere un formulario XFA dinámico al abrirlo por primera vez; AddXFASignaturePacket incrusta una firma XAdES / XML-DSig generada por el llamador como el paquete signature. HotPDF nunca genera ni analiza la firma - el llamador la produce con una biblioteca criptográfica XML sobre los datasets de XFA.

 

Aplanamiento de XFA a AcroForm

ApplyXFAAsAcroForm asigna los bytes XDP/XFA proporcionados por quien llama a la página actual como widgets AcroForm nativos y gráficos sencillos. FlattenLoadedXFA hace la misma conversión para un PDF cargado que ya contiene un paquete /XFA incrustado. Pasen Editable=False para marcar los widgets generados como de solo lectura y revisen XFAFlattenWarnings para los elementos no asignados.

 

Ver también: Soporte AcroForm, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField