Vous utilisez iText (iTextSharp) pour renseigner des champs de formulaire XFA au format PDF?
Question
Je dois renseigner les champs de formulaire XFA dans un fichier PDF (créé avec Adobe LiveCycle Designer). Nous essayons d'utiliser iText (en fait, iTextSharp avec C #) pour analyser le fichier PDF, renseigner les champs XFA, puis enregistrer le fichier PDF modifié.
Tous les exemples que je peux trouver avec iText (très peu d’exemples iTextSharp) parlent de la modification des champs AcroForm. Ce fichier PDF ne contient pas de champs AcroForm et utilise uniquement XFA.
Des pointeurs sur des ressources non standard seraient utiles (j'ai déjà effectué la recherche sur Google requise sur le sujet et je n'ai rien trouvé d'utile).
Les exemples de code présentés ici seraient géniaux pour quiconque a réellement fait ce que j'essaie de faire.
La solution
Si vous pouvez obtenir un paquet de données dans le fichier PDF, le moteur d'exécution XFA dans Acrobat renseignera ces champs avec les données du paquet de données.
Si vous souhaitez savoir à quoi ressemble l'un de ces éléments, créez un formulaire dans LiveCycle Designer (fourni avec Acrobat Pro), ajoutez-y des champs et enregistrez-le au format PDF dynamique. Ouvrez le formulaire dans Acrobat, tapez des valeurs dans les champs et enregistrez-le.
Ouvrez le fichier PDF avec un outil qui vous permet d’analyser les données PDF et vous trouverez / Catalog / AcroForm / XFA un flux comportant un < xfa: datasets > paquet avec les valeurs que vous avez tapé. C'est ce dont vous aurez besoin pour créer vous-même et insérer dans le PDF.
La spécification XDP comprend une description du paquet de données et l'algorithme de fusion. Vous pouvez le trouver ici:
http://partners.adobe.com/public/developer/xml/ index_arch.html
Vous pouvez également acheter le serveur LiveCycle auprès d'Adobe, ce qui vous permet d'effectuer tout cela par programme de plusieurs manières, notamment par le biais d'appels de service Web.
Autres conseils
iTextSharp peut fonctionner avec XFA. Pour éliminer tous les doutes, consultez un exemple sur le site Web 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();
}
J'ai le même problème et je pense avoir trouvé la solution. J'utilise Powershell pour inspecter l'objet pdf.
Chargez la DLL iTextSharp.
Add-Type -Path "C:\Users\micah\Desktop\itextsharp.dll"
Chargez le PDF dans une variable:
$PDF = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList "C:\Users\micah\Desktop\test.pdf"
Inspectez cet objet:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Get-Member
Ce que vous devriez voir, c’est que tous vos champs de votre PDF sont dans cet objet en tant que propriété. Vous pouvez obtenir une vue rapide de tous vos champs comme ceci:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Select-Object -Property "*"
Cela devrait être le ticket magique. Cet emplacement correspond aux deux champs du formulaire d'origine ET de la partie XFA du formulaire.
Cela est dit dans le livre car itext ne fait pas cela. Pouvez-vous convertir votre PDF?