THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

Contêiner de formulários XFA THotPDF (v2.119.51)

 

RegisterAcroFormFont  AcroForm Support

Registra um pacote XFA (XML Forms Architecture) nomeado para emissão dentro da entrada AcroForm /XFA do documento. O PDF 1.7 §12.7.6 + §12.7.8 permite que um AcroForm carregue um array /XFA ao lado (ou em vez de) o array estático /Fields, habilitando fluxos híbridos AcroForm + XFA ou formulários XFA puramente dinâmicos.

 

Sintaxe Delphi:

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

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

Descrição

Cada chamada a AddXFAPacket registra um pacote nomeado. Nomes típicos (conforme a especificação XFA 3.3 e o PDF 1.7 §12.7.8 Table 234):

 

template - layout do formulário + scripts (o maior pacote na maioria dos documentos XFA).

datasets - data binding (o payload XML contra o qual o template renderiza).

config - configuração do viewer.

connectionSet - conexões de dados externas.

localeSet - regras de formatação específicas por locale.

stylesheet - estilização XSLT ou CSS.

xfdf - sobreposição de dados de formulário XFDF.

xmpmeta - metadados XMP.

signature - dados XFA relacionados a assinaturas.

sourceSet - definições de dados no lado da origem.

 

Em EndDoc cada pacote registrado vira um objeto de stream indireto comprimido com FlateDecode, e o array /XFA do AcroForm alterna strings PDF de nomes de pacotes com referências de stream na ordem de registro, de modo que o layout é byte-determinístico. ClearXFAPackets remove todos os pacotes registrados (útil para reutilizar uma instância de THotPDF entre múltiplos documentos). XFAPacketCount retorna a contagem atual.

 

Suporte apenas no nível de contêiner

O HotPDF not faz o parse do XML XFA, not implementa a engine de layout dinâmico XFA, not executa FormCalc ou JavaScript dentro do template XFA e not valida a estrutura do template. O chamador escreve o XML XFA por conta própria (tipicamente via Adobe LiveCycle Designer ou na mão contra a especificação XFA 3.3) e o HotPDF emite os bytes verbatim.

 

Leitores consumidores com engine XFA (Acrobat / Reader mais antigos, FormsCentral, alguns produtos de kiosk) renderizam o formulário; leitores sem engine XFA (Adobe Reader DC de 2017 em diante, a maioria dos leitores de código aberto) exibem os campos AcroForm de fallback se o documento for um fluxo híbrido AcroForm + XFA.

 

Gates de conformidade PDF/A e PDF/X

A ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 todas proíbem explicitamente formulários XFA (a engine de layout dinâmico não é arquivável de forma determinística). Os fluxos de prepress da ISO 15930 rejeitam formulários interativos por completo. AddXFAPacket dispara imediatamente sob qualquer PDFACompliance ou PDFXCompliance não vazio, com a referência de spec relevante. Nomes de pacotes duplicados disparam exceção. PacketName vazio ou XMLBytes vazio disparam exceção. RequirePDFVersion(pdf15) promove automaticamente a versão do documento.

 

Emissão do dicionário AcroForm

O dict AcroForm é emitido quando either /Fields tem ao menos uma entrada or ao menos um pacote XFA foi registrado. Chamadores anteriores à v2.119.51 que não registram pacotes mantêm saída /AcroForm byte-idêntica.

 

Fluxo de trabalho típico (formulário dinâmico XFA puro)

 

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;

 

Wrapper XDP, stream único, XFA dinâmico e assinado

A forma de array /XFA deve abrir e fechar com os pacotes wrapper xdp:xdp, como o exemplo agora mostra (ISO 32000-1 §12.7.8). APIs XFA relacionadas: SetXFADocument grava o documento XFA/XDP inteiro como um único stream /XFA, mutuamente exclusivo com AddXFAPacket; XFANeedsRendering define a flag /NeedsRendering do Catalog (ISO 32000-1 §7.7.2) para que um viewer regenere um formulário XFA dinâmico na primeira abertura; AddXFASignaturePacket embute uma assinatura XAdES / XML-DSig gerada pelo chamador como o pacote signature. O HotPDF nunca gera nem parseia a assinatura — o chamador a produz com uma biblioteca criptográfica XML sobre os datasets XFA.

 

Achatamento de XFA para AcroForm

ApplyXFAAsAcroForm mapeia bytes XDP/XFA fornecidos pelo chamador na página atual como widgets AcroForm nativos e gráficos simples de página. FlattenLoadedXFA executa a mesma conversão para um PDF carregado que já carrega um pacote /XFA embutido. Passe Editable=False para tornar os widgets gerados somente leitura e inspecione XFAFlattenWarnings para elementos que não puderam ser mapeados.

 

See also: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField