提取嵌入的PDF文件而不进行完全解析

提取嵌入的PDF文件而不进行完全解析,pdf,Pdf,我想构建一个实用程序,从PDF中提取嵌入文件(请参阅的第7.11.4节)。但是,我希望该实用程序是“小”的,并且不依赖于完整的PDF解析框架。我想知道文件格式是否是这样的,一个简单的工具可以在文档中扫描一些标记或序列,并从中知道从哪里开始提取嵌入的文件 潜在的困难包括您扫描的令牌或序列可能有效地存在于文档的其他位置,从而导致虚假或损坏的文档提取 我不太熟悉PDF规范,所以我正在寻找 确认这是可能的 有效的一般方法 至少有两种情况会让你的生活变得困难:加密文件和对象流(压缩对象,其中包含一组对象

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

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

我不太熟悉PDF规范,所以我正在寻找

  • 确认这是可能的
  • 有效的一般方法

至少有两种情况会让你的生活变得困难:加密文件和对象流(压缩对象,其中包含一组对象)

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

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

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

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

另一种方法是在文件结构中导航,在PDF规范指定的位置查找嵌入文件。您至少可以在以下元素中找到嵌入文件(此列表来自我的头顶,可能还有更多元素):
-名称词典
-文档大纲

-页面注释至少有两种情况会让您的生活变得困难:加密文件和对象流(压缩对象,其中包含一组对象)

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

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

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

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

另一种方法是在文件结构中导航,在PDF规范指定的位置查找嵌入文件。您至少可以在以下元素中找到嵌入文件(此列表来自我的头顶,可能还有更多元素):
-名称词典
-文档大纲

-页面注释

至少有两种情况会让您的生活变得困难:加密文件和对象流(压缩对象,其中包含一组对象)。我对PDF规范不太熟悉-在这种情况下,在尝试类似操作之前先熟悉它。@yms:我同意不处理加密文件(我想你是说带有密码的PDF?),但你能说更多关于对象流的内容吗?至少有两种情况会让你的生活变得困难:加密文件,和对象流(内部包含一组对象的压缩对象)。我对PDF规范不太熟悉-在这种情况下,在尝试类似操作之前先熟悉它。@yms:我可以不处理加密文件(我想你是指带有密码的PDF),但你能说更多关于对象流的信息吗?+1;另一个困难可能是添加和删除文件附件的多版本文件;另一个困难可能是添加和删除文件附件的多版本文档。