2013-05-11 34 views
2

我在iText/iTextSharp(iTextSharp 5.3.3通過NuGet)中遇到了一個非常奇怪的問題。我正在嘗試填寫一個靜態的XFA樣式表單,但是我的更改沒有完成。如何在iTextSharp的靜態XFA表單中設置XFA數據並保存?

我有兩個版本的iText in Action,並且一直在參考本書的第二版以及iTextSharp代碼示例轉換。

背景:我有一個XFA表格,可以在我的電腦上用Adobe Acrobat手動填寫。使用iTextSharp我可以讀取Xfa XML數據,並查看數據的結構。我基本上試圖用iText來模仿。

的數據是什麼樣子時,我添加數據和保存在Acrobat(注意:這僅僅是數據集的特定部分)

enter image description here

這裏是我試圖讀取XML文件替換現有的數據(注:這是該文件的整個上下文):

enter image description here

然而,當我經過的路徑,在更換XML文件,並嘗試設置數據,創建新文件(替換數據的原始副本),不會引發任何錯誤,但數據不會更新。我可以看到新文件已創建,我可以打開它,但文件中沒有數據。

這裏是被利用來替換數據或填充在第一時間,這是任何幫助將是非常讚賞的http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

public void Generate(string sourceFilePath, string destinationtFilePath, string replacementXmlFilePath) 
    { 
     PdfReader pdfReader = new PdfReader(sourceFilePath); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (PdfStamper stamper = new PdfStamper(pdfReader, ms)) 
      { 
       XfaForm xfaForm = new XfaForm(pdfReader); 
       XmlDocument doc = new XmlDocument(); 
       doc.Load(replacementXmlFilePath); 
       xfaForm.DomDocument = doc; 
       xfaForm.Changed = true; 
       XfaForm.SetXfa(xfaForm, stamper.Reader, stamper.Writer); 
      } 

      var bytes = ms.ToArray(); 
      File.WriteAllBytes(destinationtFilePath, bytes); 
     } 
    } 

的變化的代碼。

+0

您是否嘗試過在線演示?請參閱http://demo.itextsupport.com/xfademo如果該演示正常運行,則代碼有問題;如果沒有,iText有問題。在後一種情況下,請在運行演示後填寫反饋表。 – 2013-05-12 09:39:14

+0

感謝布魯諾。我沒有嘗試過這個演示,但現在我已經有了。當我嘗試在線演示並且不要將XFA文件弄平時(需要什麼),這些字段會在演示中更新。 – jon333 2013-05-12 13:39:56

回答

1

我發現了這個問題。替代DomDocument需要是新文檔的整個合併XML,而不僅僅是數據或數據集部分。

+0

希望這有助於其他人在遇到同樣問題的情況下。 – jon333 2013-05-12 14:35:14

2

我提高了你的答案,因爲它不是不正確的(我很高興我的參考演示讓你再次看看你的代碼),但現在我再看看你的原代碼,我認爲它是最好使用book example

public byte[] ManipulatePdf(String src, String xml) { 
    PdfReader reader = new PdfReader(src); 
    using (MemoryStream ms = new MemoryStream()) { 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) { 
     AcroFields form = stamper.AcroFields; 
     XfaForm xfa = form.Xfa; 
     xfa.FillXfaForm(XmlReader.Create(new StringReader(xml))); 
    } 
    return ms.ToArray(); 
    } 
} 

正如你所看到的,這是沒有必要更換整個XFA XML。如果使用FillXfaForm方法,則數據就足夠了。

注意:對於C#版本的示例,請參閱http://tinyurl.com/iiacsCH08(將08更改爲01至16中的其他章節的示例)。