Usando o iText (iTextSharp) para preencher campos de formulário XFA em PDF?
Pergunta
Eu preciso preencher campos de formulário XFA em PDF (criado com o Adobe LiveCycle Designer). Nós estamos tentando usar o iText (na verdade iTextSharp com C #) para analisar o PDF, preencher os campos XFA e salve o PDF de volta modificado fora.
Todos os exemplos que eu posso encontrar com o iText (muito poucos exemplos iTextSharp) falar sobre como modificar campos AcroForm. Este PDF não têm campos AcroForm e usa XFA somente.
Ponteiros para quaisquer recursos não-padrão seria útil (Eu já fiz o Googling requisito sobre o tema e não encontrei nada útil).
Exemplos de código aqui seria fantástico de qualquer um que tenha realmente feito o que eu estou tentando fazer.
Solução
Se você pode obter um pacote de dados para o PDF, o runtime XFA no Acrobat iria preencher esses campos com os dados no pacote de dados.
Se você quiser ver o que um desses parece, criar um formulário no LiveCycle Designer (vem com o Acrobat Pro), adicionar alguns campos a ele, e guardá-lo como uma dinâmica PDF. Abra o formulário no Acrobat e digite alguns valores nos campos e salvá-lo.
Abra o PDF com uma ferramenta que permite espiar os dados PDF e você encontrará / Catálogo / AcroForm / XFA um fluxo que tem um
A especificação XDP inclui uma descrição do pacote de dados eo algoritmo de merge. Você pode encontrá-lo aqui:
http://partners.adobe.com/public/developer/xml/ index_arch.html
Como alternativa, você compra o servidor LiveCycle da Adobe, que permite que você faça tudo isso por meio de programação em um número de maneiras, incluindo através de chamadas de serviço da Web.
Outras dicas
iTextSharp pode trabalhar com XFA. Para remover todas as dúvidas, por favor dê uma olhada no site da amostra iText:
using (FileStream existingPdf = new FileStream("existing.pdf", FileMode.Open))
using (FileStream sourceXml = new FileStream("source.xml", FileMode.Open))
using (FileStream newPdf = new FileStream("new.pdf", FileMode.Create))
{
// Open existing PDF
PdfReader pdfReader = new PdfReader(existingPdf);
// PdfStamper, which will create
PdfStamper stamper = new PdfStamper(pdfReader, newPdf);
stamper.AcroFields.Xfa.FillXfaForm(sourceXml);
stamper.Close();
pdfReader.Close();
}
Eu tenho o mesmo problema e eu acho que encontrei a solução. Eu estou usando o PowerShell para inspecionar o objeto pdf.
Coloque o iTextSharp DLL.
Add-Type -Path "C:\Users\micah\Desktop\itextsharp.dll"
Coloque o PDF em uma variável:
$PDF = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList "C:\Users\micah\Desktop\test.pdf"
Verifique este objeto:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Get-Member
O que você deve ver, é que todos os seus campos no PDF são neste objeto como uma propriedade. Você pode obter uma visualização rápida de todos os seus campos como este:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Select-Object -Property "*"
Isso deve ser o bilhete mágico. Esta localização é ambos os campos do formulário original e a parte XFA do formulário.
Ele diz que no livro porque itext não faz isso. você pode converter seu PDF?