尝试使用Java签署pdf文档。为什么签名在PDF文件中无效?

时间:2018-10-29 13:39:03

标签: java pdf document pdfbox

我目前正在使用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

感谢您的帮助!

1 个答案:

答案 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来调用。