O PDFium Component para Delphi e Lazarus permite o intercâmbio de dados de formulários e anotações através de XFDF, o formato XML padronizado pela norma ISO 19444-1. O método TPdf.ExportXFDF serializa os valores dos campos de formulários e as anotações suportadas do documento ativo para um ficheiro XFDF ou TStream, enquanto TPdf.ImportXFDF lê o documento XFDF, recriando as anotações nas páginas correspondentes e aplicando os respetivos valores. Este ciclo de conversão simplifica processos cruciais: a consolidação de comentários criados em ferramentas externas (como o Acrobat) e a exportação de dados para ficheiros XML auditáveis e independentes (evitando embutir os dados diretamente no PDF)
O PDFium suporta importação e exportação de XFDF?
A biblioteca nativa do PDFium não disponibiliza estas funções. A API C nativa carece de rotinas para XFDF ou FDF nos seus cabeçalhos públicos, pelo que nenhum mapeamento simples resolveria o problema. Assim, o PDFium Component implementa o motor XFDF completo em Pascal numa unidade dedicada, lendo e gerando o XML com base no modelo de dados de anotações e campos de TPdf. O gerador e o analisador (parser) foram escritos manualmente sem dependências externas das unidades XMLDoc do Delphi ou DOM do FPC, assegurando um comportamento idêntico em Delphi e Lazarus
Esta decisão estrutural é relevante ao comparar alternativas. Quem utilize chamadas diretas a funções FPDF_* em Pascal deparar-se-á com a impossibilidade técnica na DLL nativa. O componente contorna esta limitação tratando o XFDF como um problema de serialização: mapeia os valores de campos e os registos de anotações suportados, exportando-os em XML padrão e processando o inverso na importação
O que contém um ficheiro XFDF?
A norma ISO 19444-1 define o XFDF como a representação XML de ficheiros FDF, dividindo o conteúdo em duas secções primárias. O elemento <fields> contém a estrutura de campos de formulários e valores (dados inseridos pelo utilizador no AcroForm). O elemento <annots> guarda as anotações: a rotina TPdf.ExportXFDF suporta 18 subtipos (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link e redact). Anotações do tipo Widget não constam em <annots> por serem mapeadas sob <fields>, e objetos internos como Popup não integram o vocabulário XFDF
Para manter a integridade dos dados, o registo TPdfAnnotation foi expandido com os metadados requeridos pelo XFDF: Name (ID exclusivo NM), Subject, ModificationDate, CreationDate, Icon, Opacity, extremidades de linhas, vértices de polígonos/polilinhas e caminhos de escrita (ink). Cada propriedade associa-se a um indicador booleano Has* para assegurar retrocompatibilidade e evitar a escrita de campos não inicializados. Assim, o mesmo registo utilizado para anotações de marcação de texto (quad points) suporta as definições necessárias ao XFDF
Como exportar dados de formulários e anotações para XFDF?
Uma única instrução processa o documento. Ao carregar o ficheiro PDF com o suporte a formulários ativo e invocar ExportXFDF, o componente analisa as páginas, reúne os dados e gera o XML. O método retorna a dimensão em bytes UTF-8 gerada, facilitando a validação nos registos do sistema:
var
Pdf: TPdf;
Bytes: Integer;
begin
Pdf := TPdf.Create(Self);
Pdf.FormFill := True; // necessário para que os valores dos campos estejam disponíveis
Pdf.FileName := 'expense-report.pdf';
Pdf.Active := True;
Bytes := Pdf.ExportXFDF('expense-report.xfdf');
ShowMessage(Format('%d bytes of XFDF written', [Bytes]));
end;
As operações suportam sobrecargas com TStream, eliminando a necessidade de ficheiros temporários em disco. A exportação para um TMemoryStream é indicada para cenários que envolvam respostas HTTP, campos binários em bases de dados ou arquivos comprimidos
var
Buffer: TMemoryStream;
begin
Buffer := TMemoryStream.Create;
try
Pdf.ExportXFDF(Buffer); // o mesmo XML, sem recurso a ficheiro em disco
Buffer.Position := 0;
// encaminhar o stream para uma resposta HTTP, coluna blob ou ficheiro zip
finally
Buffer.Free;
end;
end;
Como o ImportXFDF integra os comentários no documento?
A importação encerra o fluxo de revisão. Em vez de partilhar cópias pesadas de ficheiros PDF, as anotações podem ser enviadas em formato XML XFDF com apenas alguns kilobytes. O método TPdf.ImportXFDF processa a estrutura XML, desenha as respetivas anotações nas páginas correspondentes (definidas pelo atributo page) e atualiza os campos de formulários. O método retorna o número de elementos processados, permitindo validar as alterações:
var
Applied: Integer;
begin
Applied := Pdf.ImportXFDF('review-comments.xfdf');
StatusBar.SimpleText :=
Format('%d fields and annotations merged', [Applied]);
end;
O analisador de etiquetas (tag scanner) foi desenhado com tolerância a falhas: elementos desconhecidos são ignorados, bem como declarações DOCTYPE, comentários ou diretivas de processamento. A leitura descodifica referências de caracteres numéricos e entidades XML (incluindo pares UTF-16). Ficheiros XFDF gerados no Acrobat, leitores web ou ferramentas terceiras são processados uniformemente. Após a consolidação, pode prosseguir o ciclo de análise através do fluxo de revisão de anotações no PDFium Component e validar a navegação abordada no artigo sobre navegação de campos de formulários
Por que razão os separadores decimais são importantes no XFDF?
No XFDF, a posição das anotações é definida por strings de coordenadas (como rect="70.5,540,200,560"), exigindo a norma ISO 19444-1 a utilização de pontos como separadores decimais. As formatações padrão do Delphi dependem do idioma (locale) do sistema operativo, pelo que em ambientes europeus a função FloatToStr converteria 70.5 para 70,5. Esta vírgula corromperia as listas de coordenadas separadas por vírgulas, inviabilizando a leitura noutros visualizadores. O PDFium Component normaliza a escrita de valores numéricos: converte o separador decimal do sistema para ponto e remove zeros redundantes, garantindo que o ficheiro gerado é idêntico em qualquer ambiente regional
Quais as limitações do ciclo de conversão?
Limitações conhecidas: primeiro, o XFDF transporta metadados de anotações e não aspetos visuais renderizados (appearance streams não integram o formato), pelo que o visualizador de destino reconstrói o aspeto a partir das propriedades. Destacados ou formas geométricas serão visualizados corretamente, ao passo que carimbos (stamps) com desenhos personalizados adotarão o desenho padrão do leitor de destino. Segundo, a API PDFium subjacente suporta a alteração de strings mas não disponibiliza rotinas para geometria de caminhos ou valores numéricos, pelo que propriedades como Opacity, vértices de polígonos, caminhos de escrita (ink) e limites de linhas são apenas exportadas. Contudo, valores de campos, cores, caixas (rects), quad points, datas e dados de identidade são processados em ambos os sentidos
As rotinas de gestão de dados e pacotes XFA integram a PDFium Component