正在尝试使用java对pdf文档进行签名。为什么PDF文件中的签名无效?

正在尝试使用java对pdf文档进行签名。为什么PDF文件中的签名无效?,java,pdf,document,pdfbox,Java,Pdf,Document,Pdfbox,我目前正在一个Java应用程序上使用PDF,该应用程序对PDF文档进行了一些修改 目前,这些PDF的签名工作正常,因为我正在使用诸如FileInputStream和FileOutputStream之类的类。基本上,我从一个源文件夹复制原始文档,然后将它们放入一个输出文件夹中。我将PDDocument类与pdfbox 1.8.9一起使用 但是,我想使用相同的文件,这意味着我不再假装复制PDF了。我想抓取文档,签名,然后覆盖原始文档 因为我知道让FileInputStream和FileOutputS

我目前正在一个Java应用程序上使用PDF,该应用程序对PDF文档进行了一些修改

目前,这些PDF的签名工作正常,因为我正在使用诸如FileInputStream和FileOutputStream之类的类。基本上,我从一个源文件夹复制原始文档,然后将它们放入一个输出文件夹中。我将PDDocument类与pdfbox 1.8.9一起使用

但是,我想使用相同的文件,这意味着我不再假装复制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.16之前,1.8.*
saveIncremental(filename)
一直存在缺陷。这在中进行了描述,但令人困惑,因为用户删除了自己的大部分邮件,并且存在多个其他问题。如果坚持使用过时的版本(存在安全问题),请尝试使用此代码,而不是调用
saveIncremental(filename)

不,我不认为你提出的问题与你的问题有关

我不认为重写原始文件是个好主意。如果出现错误或断电,您将面临文件丢失的风险


<> P>参见MKL:<代码> SETFILTER()>代码>通常被称为参数<代码> PD签字。FieldAdBupp.PopkLITE < /C> >

“我不认为重写原始文件是一个好主意”-+ 10!我的想法完全正确,但我的客户要求这样做,因为要生成10万个文档,实际上我们要生成5万个文档,因为每次我们向文档中添加一些内容,比如背景图像、签名、副本,我们都会复制它们。我仍在探索覆盖同一文件的可能性和影响,但他们希望这样做。如果您无法使其正常工作,请共享原始文件和已签名的文件。作为旁白:
signature.setFilter(PDSignature.SUBFILTER\u ADBE\u PKCS7\u DETACHED)
-将筛选器设置为子筛选器名称没有意义。现在,过滤器名称已经不再重要了,所以这可能不会导致失败,但是设置它是毫无意义的。我没有开发代码。这段代码是很久以前写的,但谢谢你启发了我!:)
//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);