2013-03-28 175 views
0

我已經使用iReport生成了一個包含3個頁面的報告。現在簽名只出現在一個頁面中。但我需要使用iText爲每個頁面簽名。使用iText在每個頁面中進行數字簽名

PdfReader reader = new PdfReader(fullFilePath); 

String outputPath = reportPath + randomUUID + fileExtension; 
FileOutputStream fout = new FileOutputStream(outputPath); 
stp = PdfStamper.createSignature(reader, fout, '\0', null, true); 
PdfSignatureAppearance sap = stp.getSignatureAppearance(); 
sap.setCrypto(key, chain, null,PdfSignatureAppearance.SELF_SIGNED); 
sap.setReason("test"); 
sap.setLocation("test"); 

String imagePath = servletContextPath + "/resources/img/signature.png"; 
File file = new File(imagePath); 
byte[] imageByte = new byte[(int) file.length()]; 

try (FileInputStream fileInputStream = new FileInputStream(file)) { 
    fileInputStream.read(imageByte); 
    Image image = Image.getInstance(imageByte); 
    sap.setImage(image); 
} 

// comment next line to have an invisible signature 
for (int page = 1; page <= reader.getNumberOfPages(); page++){ 
    sap.setVisibleSignature(signatureRectangle, page, null); 
} 
+1

你想每個頁面有一個簽名還是一個全局簽名? – mkl 2013-03-28 07:35:41

+0

每個頁面上帶有可視化的一個全局簽名。 – ziha 2013-03-28 07:46:15

+0

參考我的回答是,iText是不可能的(雖然可以適當擴展iText)。此外,具有多種可視化形式的此類簽名的法律價值也是有問題的,因此,PDF閱讀器可能會在將來開始拒絕此類簽名。 – mkl 2013-03-28 08:17:48

回答

1
sap.setVisibleSignature(signatureRectangle, page, null); 

的可視化表示,它不會增加另一個一個。因此,在你的循環中你所有的這種方法的調用,但最後一個是徒勞的。

IText簽名創建代碼原樣只能爲每個簽名創建單個視覺表示,並且儘管根據該規範可以使得例如多個小部件可視化相同的簽名,PDF查看器可能拒絕它,因爲具有多個可視化的簽名的合法價值是有問題的。

編輯:

Adob​​e公司,例如,在他們的Digital Signature Appearances V9白紙寫:

文檔內的簽名的位置可以在其法律意義的軸承。出於這個原因,簽名字段永遠不會引用多個註釋。如果多個位置與簽名相關聯,則含義可能變得模糊不清。

因此,他們在將來可能會停止接受帶有多個註釋(即可視化)的簽名。

+0

你的意思是不可能在多個頁面中使用相同的簽名? – ziha 2013-03-28 08:32:09

+1

不,我說了一些不同的東西:iText不支持易於創建此類簽名,並且PDF查看器可能會在未來決定由於法律問題而拒絕此類簽名。它*不是*不可能的。 – mkl 2013-03-28 09:47:22

+0

感謝您的解釋.. – ziha 2013-03-29 01:37:15

0

除了法律問題,如果你仍然想用Itext api(版本5.5。*)簽署所有頁面,他們應該在preClose(HashMap<PdfName, Integer> exclusionSizes)方法PdfSignatureAppearance類中做一點小事,其中籤名外觀包含在頁面。

搜索裏面PdfSignatureAppearancewriter.addAnnotation(sigField, pagen);線,並與

for (int p = 1; p <= writer.reader.getNumberOfPages(); p++) { 
    writer.addAnnotation(sigField, p); 
} 

更換

它簽名的引用添加到所有頁面。

相關問題