是否有任何方法将PDF字节数组的一部分转换为单独的PDF文件

本文关键字:PDF 转换 一部分 文件 单独 数组 字节数 任何 方法 字节 是否 | 更新日期: 2023-09-27 17:49:37

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

是否有任何方法将PDF字节数组的一部分转换为单独的PDF文件

简短的回答是不,这将是不可能的,除非您有完整的(未损坏的)10MB文件,在这种情况下,您将能够按页而不是按mb分割

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

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

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

PDF Forencisc
让我添加一些额外的想法,这可能有点极端(但这完全取决于你多么迫切地想从这样的PDF文件中恢复内容)。

我已经说过,PDF文件基本上是对象的集合。这些对象中的每一个都被正确地描述(如果实现了正确的PDF解析器,则可以识别开始和结束)。

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

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

然而…


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

    页对象不需要有标识其页码的索引。通常,您将搜索"Pages"对象,然后根据"Page"对象在页面树中的位置确定其页面索引。如果你只看"Page"对象,你可能很难确定什么是第一页,什么是第二页等等。您可能不得不假设第一页是文件中的第一个"page"对象;但这只是一个(有根据的)猜测。
  • 如果没有文件的结尾,就没有办法判断PDF文件是否在某些时候被编辑和增量保存。以增量方式保存PDF文件时,不会从文档中删除修改过的对象,只会将新对象添加到文件的末尾。如果发生这种情况,你从PDF文件中抢救出来的对象可能不是最新的真相。