我想构建一个实用程序来从PDF中提取嵌入文件(参见the spec的第7.11.4节)。但是我希望实用程序“小”而不依赖于完整的PDF解析框架。我想知道文件格式是否是这样一个简单的工具可以扫描文档中的某些标记或序列,并从中知道从何处开始提取嵌入文件。
潜在的困难包括您扫描的令牌或序列可能有效地存在于文档的其他位置,从而导致虚假或损坏的文档提取。
我不熟悉PDF规范,所以我正在寻找
答案 0 :(得分:1)
至少有两种情况会让你的生活变得困难:加密文件和对象流(包含内部对象集合的压缩对象)。
关于第二项(对象流),一些PDF生成工具将把大多数对象(字典)放在PDF文件中,将它们放在一个对象中,并压缩这个单个对象(通常使用deflate压缩)。这意味着您不能只浏览PDF文件以查找某些特定令牌,以便在忽略其余信息的同时提取您需要的一些信息。您至少需要部分地解释PDF文件的结构。
请注意,即使未使用对象流,也很可能会压缩要提取的嵌入文件。
您的程序至少需要执行以下操作:
- 处理外部参照表
- 处理对象流
- 将解码/解压缩过滤器应用于数据流。
一旦你能够从文件中获取所有对象,理论上你可以通过它们查找所有类型的EmbeddedFile字典。这种方法的缺点是你可能会从文档中的任何地方提取未被引用的文件(例如,因为用户在文件的某个时刻删除了它的文件)
另一种方法可能是实际浏览文件结构,在PDF规范指定的位置查找嵌入文件。您可以在至少以下元素中找到嵌入的文件(此列表来自我的头顶,可能还有更多这些):
- 姓名字典
- 文件大纲
- 页面注释