如何使用Java(IText API)合并PDF而不丢失数字签名

问题描述 投票:0回答:4

是否可以使用 Java iText API 将数字签名的 PDF 文档附加到另一个普通 PDF?我尝试合并 PDF,但生成的输出 PDF 不保留数字签名。我想知道是否确实可以在最终的 PDF 文件中保留数字签名。

java pdf itext digital-signature
4个回答
3
投票

正如其他人已经说过的,签名背后的想法(至少是想法的主要部分)是确保文档没有改变。另一方面,合并确实会更改文档。因此,合并会破坏签名。

但是,另一种方法是将另一个“普通”PDF 制作为可移植集合(一种带有附件的特殊 PDF),并将签名的 PDF 附加到该集合。

打开集合中的签名 PDF 时,签名将与原始签名 PDF 一样完好无损。

创建便携式集合的示例代码

您可以在 iText 网站上找到便携式集合创建的示例:

public static final String DEST = "results/collections/portable_collection.pdf";
public static final String DATA = "resources/data/united_states.csv";
public static final String HELLO = "resources/pdfs/hello.pdf";
public static final String IMG = "resources/images/berlin2013.jpg";

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    document.add(new Paragraph("Portable collection"));
    PdfCollection collection = new PdfCollection(PdfCollection.TILE);
    writer.setCollection(collection);
    PdfFileSpecification fileSpec = PdfFileSpecification.fileEmbedded(
            writer, DATA, "united_states.csv", null);
    writer.addFileAttachment("united_states.csv", fileSpec);
    fileSpec = PdfFileSpecification.fileEmbedded(
            writer, HELLO, "hello.pdf", null);
    writer.addFileAttachment("hello.pdf", fileSpec);
    fileSpec = PdfFileSpecification.fileEmbedded(
            writer, IMG, "berlin2013.jpg", null);
    writer.addFileAttachment("berlin2013.jpg", fileSpec);
    document.close();
}

这里在网站上,这里在他们的github上)

该示例的运行结果是here

(由于您使用的是 itext 标签而不是 itext7 标签,我假设您使用的是 iText 版本 5.5.x。)


3
投票
  1. 在 Adobe 中打开已签名的 pdf。

  2. 打开打印对话框(Ctrl+P

  3. 将打印机更改为“Microsoft Print to PDF”然后打印。

  4. 新创建的 PDF 将具有签名,并且将像普通 pdf 一样进行组合/合并活动。

注意:此方法将签名文档转换为标准 pdf。结果显示签名信息,但底层数字签名丢失。就我而言,原始签名者理解其中的区别。

创建摘要文件是我的目标。我将各种经过数字签名的文档以及其他相关文档合并到一个 PDF 摘要中。原始的数字签名文档将被存储以供将来参考。我越来越相信,在保留底层数字签名的同时,不可能将数字签名的文档合并到单个摘要 pdf 中。

需要摘要数据包的用户将受益于我建议的方法。请记住,只要原始数字签名文档可按需提供,我的方法仍然“合法有效”。


2
投票

这是不可能的,这个数字签名是专门为了保护原始文档不被以任何方式修改而设计的。

要合并和签名这两个文档,您需要知道用于签名的密钥并为新的合并文档再次生成签名。


0
投票

我有一个 PDF 组合,其中包含许多经过数字签名的页面。当我将投资组合项目导出为单独的文件时,它们将打开并显示与其签名正确一致。当我尝试合并所有签名时,签名就会被剥离,蓝色签名框会重新出现。最终的工作是将所有文件更改为右键单击窗口上下文菜单中的只读。底部的“属性>只读”。选择所有 PDF 文件,选择只读以使它们全部只读,然后下次单击“在 adobe 中合并所有文件”时,它会保留签名并起作用!

© www.soinside.com 2019 - 2024. All rights reserved.