我目前正在使用Java应用程序上的PDF,该应用程序对PDF文档进行了一些修改。
当前,这些PDF的签名正在起作用,因为我正在使用FileInputStream和FileOutputStream之类的类。基本上,我从源文件夹复制原始文档,然后将它们放在输出文件夹中。我正在将pdfbox 1.8.9与PDDocument类一起使用
但是,我想使用相同的文件,这意味着我不再假装复制PDF。我想抓取文档,签名,然后覆盖原始文档。
由于我知道让FileInputStream和FileOutputStream指向同一个文件不是一个好主意,所以我只是尝试使用File类。
我尝试了以下操作:
File file = new File(locOriginal);
PDDocument doc = PDDocument.load(file);
PDSignature signature = new PDSignature();
Overlay overlay = new Overlay();
//The signature itself. It has not been modified
signature.setFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED); // default filter
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
if (msg.getAreaNegocio().startsWith("A")) {
signature.setName(this.campoCertificadoAcquiring);
signature.setLocation(this.localCertificadoAcquiring);
signature.setReason(this.razaoCertificadoAcquiring);
}else {
signature.setName(this.campoCertificadoIssuing);
signature.setLocation(this.localCertificadoIssuing);
signature.setReason(this.razaoCertificadoIssuing);
}
// register signature dictionary and sign interface
doc.addSignature(signature,this);
doc.saveIncremental(file.getAbsolutePath());
doc.close();
我的PDF文件确实被按预期覆盖,但是,当我打开文件时,签名不再有效。我阅读了这些问题...与这些问题有关吗?我该怎么解决?
PDFBox 1.8.10: Fill and Sign PDF produces invalid signatures
PDFBox - opening and saving a signed pdf invalidates my signature
感谢您的帮助!
答案 0 :(得分:1)
1.8。* saveIncremental(filename)
一直存在错误,直到PDFBox 1.8.16。 PDFBOX-4312中对此进行了描述,但由于用户删除了自己的大部分消息并遇到了其他多个问题,因此造成了混乱。如果您坚持使用过时的版本(存在安全问题),请尝试以下代码,而不要调用saveIncremental(filename)
:
//BEWARE: do not "optimize" this method by using buffered streams,
// because COSStandardOutputStream only allows seeking
// if a FileOutputStream is passed, see PDFBOX-4312.
FileInputStream fis = new FileInputStream(fileName);
byte[] ba = IOUtils.toByteArray(fis);
fis.close();
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(ba);
fis = new FileInputStream(fileName);
saveIncremental(fis, fos);
不,我认为您链接到的问题与您的问题无关。
顺便说一句,我不认为覆盖原始文件是一个好主意。如果出现错误或断电,您将有丢失文件的风险。
另请参见mkl的注释:setFilter()
通常用参数PDSignature.FILTER_ADOBE_PPKLITE
来调用。