有没有办法将部分PDF字节数组转换为单独的PDF文件?

时间:2015-05-17 13:25:36

标签: c# pdf bytearray

如果我有PDF文件的字节数组的一部分(例如:所有文件字节数组大小为10 MB而我只有前5 MB),有没有办法将该部分字节数组保存为单独的PDF文件? 最好使用C#,但任何其他编程语言都可以

2 个答案:

答案 0 :(得分:2)

简短回答是否定,除非您拥有完整(未损坏)的10MB文件,否则这是不可能的,在这种情况下,您将能够按页面拆分不是以MB为单位

答案 1 :(得分:2)

PDF文件是由对象构建的,因此它们是模块化和随机访问。可以说整个PDF文件中最重要的部分出现在文件的末尾:它是XREF表,它为所有这些对象提供字节偏移。

没有文件的最后一部分意味着XREF表不存在,这至少是不幸的。您可能能够重建XREF表的一部分(某些PDF查看器能够执行此操作),但如果您丢失了一半文件,那么这种可能性很小甚至不存在。

唯一可能的是PDF保存为“linearised”。这样的PDF文件实际上在文件的最开头具有第一页的所有对象,而较小的XREF表仅索引在文件的开头也相对地显示第一页所需的那些对象。这样做是为了使PDF文件在从网站下载时更快地显示,但在您的情况下 - 如果PDF是以这种方式创建的 - 它可能会给您一个角度来重建至少第一页。

PDF Forencisc
让我加上这些额外的想法,这些想法可能有点极端(但这完全取决于你想要从这些PDF文件中恢复内容的绝对程度)。

正如我所说,PDF文件基本上是一组对象。正确描绘了这些对象中的每一个(如果您实现了正确的PDF解析器,则可以识别开头和结尾)。

这意味着您可以开始阅读PDF文件的开头并构建一个对象表。每个对象都以其ID开头,因此您可以为找到的每个对象存储ID和相应的文件偏移量。您可以继续,直到用完文件。这意味着当你只下载了一半的文件时,你的文件中大约有一半的对象。

下一个技巧是扫描所有对象并尝试查找“页面”对象。这些是可识别的,因为它们必须是字典,并且它们必须包含一个名为“Type”的键,其中“Page”作为其值。对于每个这样的页面对象,您可以继续尝试确保该特定页面的所有对象已经存在,如果是,则将其保存到新的PDF文档。

<强>然而...

有龙......记住这些微妙之处(我可能忘了一堆):

  • 页面对象不需要具有标识其页码的索引。通常,您将搜索“Pages”对象,然后页面树中“Page”对象的位置将确定其页面索引。如果你只看“页面”对象,你可能很难识别出第一页,第二页等等......你可能不得不假设第一页是文件中的第一个“页面”对象;但那只是一种(受过教育的)猜测。
  • 如果没有文件的结尾,则无法判断PDF文件是否在某些时候被编辑并逐步保存。以增量方式保存PDF文件时,不会从文档中删除修改后的对象,只是将新对象添加到文件末尾。如果发生这种情况,您从PDF文件中抢救的对象可能不是最新版本的事实。
相关问题