如何使用pdfbox在Java中签署pdf文件

14
我正在尝试使用pdfbox库来签署PDF文件。 现在我遇到了问题,真的需要帮助。
这是我的代码:
private static void signPdf(PDDocument document) throws Exception 
{
    PDSignature sig = new PDSignature();
    sig.setFilter(COSName.ADOBE_PPKLITE);
    sig.setSubFilter(COSName.ADBE_PKCS7_DETACHED);
    sig.setByteRange(new int[] {'a','a','a','a'});
    sig.setContents(new byte[]{(byte) 23, (byte) 23, (byte) 23, (byte) 23});

    SignatureOptions options = new SignatureOptions();

    document.addSignature(sig, new SignatureInterface() {
        public byte[] sign(InputStream content)
                throws SignatureException, IOException       {        
             //this should be made MD5 checksum?           
            return new byte[]{(byte) 'a', (byte) 'a', (byte) 'a', (byte) 'a'};
        }
    }, options);
}

然后我保存了我的pdf,但有两个问题: 1)我注意到sign方法从未被调用 2)我该将证书附加在哪里?是在sign方法中吗?

pdf:

/Type /Sig
/Filter /Adobe.PPKLite
/SubFilter /adbe.pkcs7.sha1
/Contents <0000000000. a lot of zeros..000>
/ByteRange [0 1000000000 1000000000 1000000000]

我觉得我可能漏掉了什么,但是文档没有提到如何给文件签名。

提前感谢JC。

@Ed

这是我保存pdf文件的方式:

public static void saveFile(COSDocument doc, String out)
        throws IOException, COSVisitorException {  
    java.io.OutputStream os = null;  
    COSWriter writer = null;  
    try {
        os = new java.io.FileOutputStream(out);
        writer = new COSWriter(os);
        writer.write(doc);
    } finally {
        if (os != null) {
            os.close();
        }
        if (writer != null) {
            writer.close();
        }
    }
}

3
似乎使用PDFBox进行签名是相当低级和缺乏文档说明的。你可能需要阅读这篇白皮书,以了解更多关于PDF中数字签名的信息:http://itextpdf.com/book/digitalsignatures - Bruno Lowagie
你是如何保存文档的?这就是我们需要查看的地方,以找出为什么没有调用sign()函数。 - Ed Staub
@Ed 我已经在上面添加了我的保存功能。 - Jakub C
1个回答

11

18
虽然这个链接可能回答了问题,但最好在此处包括答案的基本部分,并提供链接以便参考。仅有链接的答案如果链接页面发生变化就可能变得无效。 - Ilija Dimov
是的,这样会更好,但是当搜索“pdfbox签名”时,这个问题目前处于热门搜索之列,有很多人喜欢签名。链接指向pdfbox svn主干,因此如果项目不转移到git,则链接将匹配,否则我会更新它。所以真的没有问题。 - ThomasCh
同一个文件,但在语法高亮源代码查看器中: https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateSignature.java?view=markup - Морт

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接