Artigo técnico

HotPDF: XFA, AcroForm, and flattening decisions in Delphi

Esta versão localizada trata de XFA to AcroForm Flattening in Delphi Using HotPDF usando o artigo em inglês atualizado como referência técnica para equipes Delphi, PDF e software documental

A página transforma a base atualizada em pontos de controle práticos para projeto, implementação e validação

Conteúdo sincronizado a partir da base em inglês

O artigo base foi ampliado com contexto prático, decisões técnicas e exemplos concretos, então esta página deve ser lida como guia de trabalho, não como resumo curto

Pontos importantes da versão atualizada:

  • Use primeiro arquivos de entrada pequenos e reproduzíveis
  • Mantenha intactos nomes de produto, API, arquivos e valores literais
  • Salve a saída do validador e as versões junto com o arquivo de teste gerado

Decisões práticas de implementação

Comece pelo tipo de arquivo, pelo resultado esperado e pelo estado de erro que o usuário precisa ver. Depois conecte cada chamada API a um resultado verificável para que validação, logs e suporte possam reproduzir o caso do cliente

  • Use primeiro arquivos de entrada pequenos e reproduzíveis
  • Mantenha intactos nomes de produto, API, arquivos e valores literais
  • Salve a saída do validador e as versões junto com o arquivo de teste gerado

Código e pontos API

Os exemplos de código são preservados sem alteração para comparação direta com projetos Delphi, C++Builder e Lazarus/FPC

var
  Pdf: THotPDF;
  MappedCount, I: Integer;
  Warnings: TStrings;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.LoadFromFile('dynamic_xfa.pdf');
    MappedCount := Pdf.FlattenLoadedXFA(True);   // True = fields stay editable
    Warnings := Pdf.XFAFlattenWarnings;
    for I := 0 to Warnings.Count - 1 do
      Log('XFA flatten warning: ' + Warnings[I]); // unmapped elements
    Pdf.SaveLoadedDocument('native_acroform.pdf');
    Log(Format('Mapped %d fields', [MappedCount]));
  finally
    Pdf.Free;
  end;
end;
XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
// Lock the value at field creation: read-only text field
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
  Rect(50, 700, 220, 720), 0, [ffReadOnly]);

// Belt and suspenders: restrict form filling document-wide
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// fill permission withheld: prFillAnnotations is absent from the set

Verificação antes da publicação

Revise o arquivo de saída com as mesmas ferramentas que o cliente ou o arquivo documental usará. Registre versão do componente, dados de teste, versão do validador e resultado observado