【问题标题】:Extracting different revisions of PDF提取不同版本的 PDF
【发布时间】:2014-12-03 09:28:09
【问题描述】:

背景

根据pdf standard,一个更新的文件可以包含不同的版本。如果你看一下 7.5.6 中的图 3,你会看到有一个原始正文 + 元数据(预告片,交叉引用部分)和多个更新。

问题

是否有任何库可以提取这些修订? poppler 有可能吗(我在大部分工作中都使用 poppler)?

提供修订数量并允许提取它们的 Api 会很好。 如果我正确理解标准,这只是剪切更新部分并在文件末尾添加更新的startxref 的问题。

注意

虽然这似乎很容易让我自己实现,但我更愿意在自己编写之前重用现有的东西。

@CloseVotes:虽然我可以将这个问题表述为How to extract PDF revisions with Poppler,但我想保持它的广泛性,因为我更喜欢使用额外的库而不是破解我自己的库。

【问题讨论】:

  • A 修订之间的转换并不总是像人们希望的那样清晰,参见。 this answerSome backgrounds first部分,特别是关于“中间形式”和“一些不精确”的评论。 B 正如该答案中所解释的,可以准确识别已签名的修订。要提取它们,您只需要检查带符号的字节范围条目并相应地剪切原始文件
  • @mkl 那篇文章很有帮助,因为我从那里收集到下面的答案,最好使用我自己的工具进行提取。
  • 推出我自己的工具 - 这样做时,请注意存在一些陷阱,其中一些在上面引用的答案中指出,但有些也与线性化和混合 PDF。
  • @mkl 你介意让我了解混合 pdf 吗?我还看了附录 F 中的线性化,感觉它对我来说是无趣的。如果我理解正确,线性化文档没有增量更新,因此我可以返回它。如果我有一个具有线性化“原始”正文和更新的文档,我可以逐个版本修剪,直到我(poppler)检测到它看到的是线性化文档。这种对线性化的理解足够/正确吗?
  • 如果我理解正确,线性化文档没有增量更新,因此我可以返回它 - 它没有,但它的构造类似于具有一次增量更新的文档。如果你一看到正确的线性化 PDF 就停下来,应该没问题。

标签: c++ c pdf


【解决方案1】:

您所说的 PDF 功能的技术术语是'增量更新'。现在你能发现,如果一个 PDF 文档是增量更新的,因此包含不同的文档版本吗?

使用命令行工具,pdfresurrect

有一个命令行工具,pdfresurrect,可以做你想做的事。 首先,它可以列出PDF文档中包含的不同版本的数量。示例:

kp@mbp:> pdfresurrect -q incrupd.pdf
 incrupd.pdf: 2

其次,它可以揭示更多关于版本之间变化的细节:

kp@mbp:> pdfresurrect incrupd.pdf incrupd.pdf: --A-- Version 1 -- Object 0 (Stream) incrupd.pdf: --A-- Version 1 -- Object 1 (Catalog) incrupd.pdf: --A-- Version 1 -- Object 2 (Unknown) incrupd.pdf: --A-- Version 1 -- Object 3 (Pages) incrupd.pdf: --A-- Version 1 -- Object 4 (Page) incrupd.pdf: --A-- Version 1 -- Object 5 (Stream) incrupd.pdf: --A-- Version 1 -- Object 6 (ExtGState) incrupd.pdf: --A-- Version 1 -- Object 7 (Font) incrupd.pdf: --A-- Version 1 -- Object 8 (Unknown) incrupd.pdf: --A-- Version 1 -- Object 9 (Unknown) incrupd.pdf: --D-- Version 2 -- Object 0 (Stream) incrupd.pdf: --M-- Version 2 -- Object 5 (Stream) ---------- incrupd.pdf ---------- Versions: 2 Version 1 -- 10 objects Version 2 -- 2 objects

第三,它可以将所有版本写入磁盘(在当前创建一个子目录),因此您可以逐个检查它们:

kp@mbp:> pdfresurrect -w incrupd.pdf

kp@mbp:> ls -ltr incrupd-versions/ total 24 -rw-r--r-- 1 kurtpfeifle staff 695 Dec 3 10:44 incrupd-versions.summary -rw-r--r-- 1 kurtpfeifle staff 3713 Dec 3 10:44 incrupd-version-2.pdf -rw-r--r-- 1 kurtpfeifle staff 3857 Dec 3 10:44 incrupd-version-1.pdf

第四,它可以从PDF文档中清除以前的版本,只保留最新的:

kp@mbp:> pdfresurrect -s incrupd.pdf

kp@mbp:> ls -l incrupd*.pdf
 -rw-r--r--@ 1 kurtpfeifle  staff  3491 Dec  3 10:43 incrupd.pdf
 -rw-r--r--  1 kurtpfeifle  staff  3201 Dec  3 10:49 incrupd-scrubbed.pdf

使用文本编辑器

如果您知道如何处理(部分)二进制文件的文本编辑器,您也可以这样操作:

  1. 备份您的 PDF。
  2. 在编辑器中打开备份的 PDF。
  3. 转到文件末尾。
  4. 搜索最后一次出现的%%EOF。 (在表现良好的 PDF 中,这应该在最后,后面没有任何垃圾。)
  5. 搜索最后一次出现的%%EOF
    • 删除最后一个 %%EOF 之后直到文件末尾的所有内容。
    • 以新名称保存文件(最好包含-version2.pdf)。

恭喜 - 您刚刚恢复了 PDF 文档的先前版本。 :-)

继续上述过程以恢复更旧的版本...

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多