【问题标题】:Extract embedded PDF file without a full parse无需完整解析即可提取嵌入的 PDF 文件
【发布时间】:2013-12-11 15:41:12
【问题描述】:

我想构建一个实用程序来从 PDF 中提取嵌入文件(请参阅the spec 的第 7.11.4 节)。但是,我希望该实用程序“小”,而不是依赖于完整的 PDF 解析框架。我想知道文件格式是否可以让一个简单的工具扫描文档以查找某些标记或序列,并从中知道从哪里开始提取嵌入的文件。

潜在的困难包括您扫描的令牌或序列可能有效地存在于文档的其他地方,从而导致虚假或损坏的文档提取。

我对 PDF 规范不是很熟悉,所以我正在寻找

  • 确认这是可能的
  • 一种可行的通用方法

【问题讨论】:

  • 至少有两种情况会让你的生活变得困难:加密文件和对象流(一个包含对象集合的压缩对象)。
  • 我对 PDF 规范不太熟悉 - 在这种情况下,请先熟悉,然后再尝试类似的操作。
  • @yms:我可以不处理加密文件(我假设您的意思是带密码的 PDF 文件?),但您能多谈谈对象流吗?

标签: pdf


【解决方案1】:

至少有两种情况会让您的生活变得困难:加密文件和对象流(一个包含对象集合的压缩对象)。

关于第二项(对象流),一些 PDF 生成工具会将 PDF 文件中的大部分对象(字典)放入单个对象中,然后压缩该单个对象(通常使用 deflate 压缩)。这意味着您不能只浏览 PDF 文件以查找某些特定标记,以便提取您需要的某些信息而忽略其余部分。您将需要至少部分解释 PDF 文件的结构。

请注意,即使不使用对象流,您要提取的嵌入文件也很可能会被压缩。

您的程序至少需要能够执行以下操作:
- 处理外部参照表
- 处理对象流
- 将解码/解压缩过滤器应用于数据流。

一旦您能够从文件中获取所有对象,理论上您可以遍历所有对象以查找 EmbeddedFile 类型的字典。这种方法的缺点是您可能会从文档中的任何位置提取未引用的文件(例如,因为用户在文件历史的某个点删除了它)

另一种方法是实际浏览文件结构,在 PDF 规范指定的位置查找嵌入文件。您至少可以在以下元素中找到嵌入文件(此列表来自我的脑海,可能还有更多):
- 名称字典
- 文件大纲
- 页面注释

【讨论】:

  • +1;另一个困难可能是包含文件附件的添加和删除的多修订文档。
猜你喜欢
  • 2019-06-21
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2011-07-18
相关资源
最近更新 更多