2017-08-10 126 views
1

我創建了一個pdf文檔並指定了幾個acro字段。這些用於 的acro字段由java itext庫填充。在添加所有必需的acro字段後,本文檔進行數字簽名。填寫pdf表格後數字簽名無效

我們已經在數字簽名中設置了填表屬性,但是無論何時我們試圖用itext庫填充此文檔,此文檔的數字簽名都將失效。

這裏是我用來填寫此文檔的代碼 -

String FILE = "/Users/mahensha/Desktop/NOC/test1.pdf"; 
     PdfReader reader = new PdfReader("/Users/mahensha/Desktop/NOC/test.pdf"); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE)); 
     AcroFields form = stamper.getAcroFields(); 
     System.out.println("form: " + form); 
     form.setField("SellerName", "Mr.Mahendra Kumar Sharma"); 
     form.setField("AddressLine1", "My address"); 
     stamper.setFormFlattening(true); 
     stamper.close(); 
     reader.close(); 

我正在使用lowagie itext庫來填充pdf表單。

有什麼方法可以解決這個問題。 謝謝。

+0

使用帶有4個參數的'PdfStamper'構造函數並在最後一箇中使用'true'。選擇不破壞現有簽名所需的附加模式。 – mkl

回答

2

您創建PdfStamper這樣的:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE)); 

此要求的iText採取原始的PDF,扔掉不需要的部分,安排剩餘部分,因爲它認爲合適的應用所需的增補,並保存所有這一切。

這樣的過程顯然會破壞任何現有的簽名。

您可以指示iText將更改應用爲增量更新,即複製現有的pdf並在新版本中追加更改。生成的文件通常比上面創建的文件大,但預先存在的簽名不會在數學上打破。

您可以使用PdfStamper的4參數構造函數來請求此附加模式,例如,像這樣:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE), '\0', true); 

此外,您請求的形式變平:

stamper.setFormFlattening(true); 

這將自動失效預先存在的簽名。因此,不要這樣做。

+0

謝謝!它的工作! – user3212707