2014-10-29 80 views
4

代碼:如何使用iText填充XFA表單?

using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open)) 
using (FileStream xml = new FileStream("C:/test.xml", FileMode.Open)) 
using (FileStream filledPdf = new FileStream("C:/test_f.pdf", FileMode.Create)) 
{ 
    PdfReader.unethicalreading = true; 
    PdfReader pdfReader = new PdfReader(pdf); 
    PdfStamper stamper = new PdfStamper(pdfReader, filledPdf); 

    stamper.AcroFields.Xfa.FillXfaForm(xml); 
    stamper.Close(); 
    pdfReader.Close(); 
} 

此代碼拋出也不例外,一切似乎是確定的,但如果我打開PDF格式填寫,ADOBE READER說這樣的事情:

該文件啓用擴展功能。此文檔自創建以來已更改,並且無法再使用擴展功能。

某些字段是正確填寫,但我不能編輯它。有些字段是空的。 如果我通過單擊Adobe Reader中的「導入數據」手動選擇xml,表單會被正確填充,所以我猜XML中沒有錯誤。

回答

5

你是不是正確創建PdfStamper對象。使用:

PdfStamper stamper = new PdfStamper(pdfReader, filledPdf, '\0', true) 

在您的代碼中,您沒有在追加模式下使用PdfStamper。這意味着iText將重新組織PDF中的不同對象。通常這不是問題。

然而:您的PDF閱讀器的,這意味着你的PDF使用Adobe公司擁有的私有密鑰數字簽名。通過重新組織PDF中的對象,該簽名被破壞。這已通過您提到的消息明確說明:

本文檔啓用了擴展功能。這份文件被更改 ,因爲它是創建和使用擴展功能是不可能的 了。

您在不允許的方式(見我的book題爲「保留的閱讀器的形式使用權」部分8.7)改變了文檔。

爲了避免破壞簽名,則需要在附加模式使用PdfStamper。 iText不再重新組織原始內容,而是將原始文件保持原樣並在原始文件結束後添加新內容。

+0

它完美。感謝您的好解釋。 – paldir 2014-10-29 11:58:53