2009-06-25 10 views
14

Ich muss XFA-Formularfelder in einer PDF-Datei (erstellt mit Adobe LiveCycle Designer) ausfüllen. Wir versuchen, iText (eigentlich iTextSharp mit C#) zu verwenden, um das PDF zu analysieren, die XFA-Felder aufzufüllen und das modifizierte PDF dann wieder zu speichern.Verwenden von iText (iTextSharp) zum Ausfüllen von XFA-Formularfeldern in PDF?

Alle Beispiele, die ich mit iText finden kann (sehr wenige iTextSharp-Beispiele) sprechen über die Modifizierung von AcroForm-Feldern. Dieses PDF enthält keine AcroForm-Felder und verwendet nur XFA.

Zeiger auf alle nicht-standard-Ressourcen wäre hilfreich (Ich habe bereits das erforderliche Googeln zum Thema und habe nichts nützliches gefunden).

Code Beispiele hier wäre toll von jedem, der tatsächlich getan hat, was ich versuche zu tun.

+1

Ich habe es gerade in dem Buch "iText in Aktion" nachgeschlagen und es heißt "Formen wie diese werden in diesem Buch nicht besprochen" also kaufe dieses Buch nicht in der Hoffnung auf eine Antwort. –

Antwort

5

Wenn Sie ein Datenpaket in das PDF importieren können, füllt die XFA-Laufzeit in Acrobat diese Felder mit den Daten im Datenpaket.

Wenn Sie sehen möchten, wie einer davon aussieht, erstellen Sie ein Formular in LiveCycle Designer (im Lieferumfang von Acrobat Pro enthalten), fügen Sie einige Felder hinzu und speichern Sie es als dynamische PDF. Öffnen Sie das Formular in Acrobat und geben Sie einige Werte in die Felder ein und speichern Sie sie.

Öffnen Sie das PDF mit einem Tool, mit dem Sie die PDF-Daten betrachten können. Sie finden dann/Catalog/AcroForm/XFA einen Stream mit einem < xfa: datasets > Paket mit den von Ihnen eingegebenen Werten. Das müssen Sie selbst erstellen und in das PDF einfügen.

Die XDP-Spezifikation enthält eine Beschreibung des Datenpakets und des Merge-Algorithmus. Sie können es hier finden:

http://partners.adobe.com/public/developer/xml/index_arch.html

Alternativ kaufen Sie den Livecycle-Server von Adobe, die Sie dies programmatisch auch durch Anrufe Web-Service in einer Reihe von Möglichkeiten, um alle tun können.

+0

Dies ist eine nützliche Information @stevex. Sehr geschätzt. Ich habe den xfa: Dataset-Datenblock gesehen (oder was ich dachte, dass er dem entspricht), wenn ich die Objekte in iTextSharp betrachte. –

0

Es sagt, dass in dem Buch, weil ITEXT dies nicht tut. Können Sie Ihre PDF konvertieren?

+0

Nein. Es ist ein von gov generiertes Formular, das ich modifizieren muss und dann müssen die Leute erneut an gov senden. –

+1

Buch ist veraltet - seit 2006 gibt es einige XFA-Unterstützung. Beispiele finden Sie unter http://1t3xt.info/examples/browse/?page=example&id=433 und http://1t3xt.info/examples/browse /? page = Beispiel & id = 441 – JasonPlutext

+0

Diese Links sind tot, bitte updaten –

3
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(); 
} 
+0

Das ist toller Code, danke! Könnten Sie uns bitte ein Beispiel für das XML-Format geben, das Sie in FillXfaForm eingeben müssen? Vielen Dank! –

1

Ich habe das gleiche Problem, und ich denke, dass ich die Lösung gefunden. Ich verwende Powershell, um das PDF-Objekt zu untersuchen.

Laden Sie die iTextSharp-DLL.

Add-Type -Path "C:\Users\micah\Desktop\itextsharp.dll" 

Legen Sie das PDF in eine Variable:

$PDF = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList "C:\Users\micah\Desktop\test.pdf" 

dieses Objekt inspizieren:

$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Get-Member 

Was Sie sehen sollten, ist, dass alle Felder auf dem PDF in diesem Objekt sind als Ein Besitz. Sie können einen schnellen Überblick über alle Felder wie diese:

$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Select-Object -Property "*" 

, dass die Magie Ticket sein sollte.Dieser Speicherort sind beide Felder aus dem ursprünglichen Formular und dem XFA-Teil des Formulars.

Verwandte Themen