【问题标题】:How to revert incremental update in pdf using PDFBOX?如何使用 PDFBOX 恢复 pdf 中的增量更新?
【发布时间】:2023-03-27 17:50:01
【问题描述】:

我们如何使用 pdfbox 恢复上次在 pdf 中完成的增量更新?

例如 Original document Signed document

当我使用增量保存对原始文档进行数字签名(认证签名)时,我得到了一个签名文档。在检查签名文件的来源后,我可以看到“%%EOF”出现了 2 次。如果我手动删除最后一个“%%EOF”及其内容,我可以看到 PDF 恢复到其初始状态,这与原始文档非常相似。

我怎样才能务实地做到这一点?

我正在使用 PDFBOX v2.0.8

最好的问候, 阿布舍克

【问题讨论】:

  • 有更高级的方法,也有不太高级的方法。最不先进的方法是简单地搜索文件中倒数第二次出现 %%EOF 的偏移量,然后将其切断。您应该使用实际的字节序列搜索,但一些实现者使用完整的单字节编码(如 ISO 8859-1)进行文本搜索。更高级的方法是检查 %%EOF 是否实际上可能是修订的结束。

标签: java pdf digital-signature pdfbox


【解决方案1】:

有更高级的方法,也有不太高级的方法。

这是最简单的一个:它搜索%%EOF 标记,然后立即切断。这可能与原来的先前版本不同,因为该标记后面可能跟着一个可选的行尾标记。但是,除非先前的版本被签名或线性化,否则带有行尾标记的变体和没有行尾标记的变体与 PDF 文件等效。

为了搜索%%EOF 标记,我们使用来自twitter/elephant-bird 项目的StreamSearcher 类,参见。 this earlier stack overflow answer:

public List<Long> simpleApproach(InputStream pdf) throws IOException {
    StreamSearcher streamSearcher = new StreamSearcher("%%EOF".getBytes());
    List<Long> results = new ArrayList<>();
    long revisionSize = 0;
    long diff;
    while ((diff = streamSearcher.search(pdf)) > -1) {
        revisionSize += diff;
        results.add(revisionSize);
    }
    return results;
}

为了只复制所需的字节数,我们使用 Guava ByteStreams 类。 (有很多替代品,例如 Apache Commons IO,但 Guava 恰好已经在我的测试项目依赖项中。)

List<Long> simpleSizes = null;
try (   InputStream resource = GET_DOCUMENT_INPUTSTREAM) {
    simpleSizes = simpleApproach(resource);
}

if (1 < simpleSizes.size()) {
    try (   InputStream resource = GET_DOCUMENT_INPUTSTREAM;
            OutputStream file = new FileOutputStream("previousRevision.pdf")) {
        InputStream revision = ByteStreams.limit(resource, simpleSizes.get(simpleSizes.size() - 2));
        ByteStreams.copy(revision, file);
    }
}

GET_DOCUMENT_INPUTSTREAM 可能是 new FileInputStream(PDF_PATH)new ByteArrayInputStream(PDF_BYTES) 或者您必须重复检索 PDF 的 InputStream 的任何方式。对于这些示例(FileInputStreamByteArrayInputStream),您甚至可以使用 reset() 重复使用相同的流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多