我正在尝试使用 C++ 在磁盘上进行一些文件雕刻。我在网上找不到任何与 pdf 文件的磁盘结构相关的资源。问题是我可以在集群的开头找到 %PDF-1.x 标记,但我无法在任何地方找到 PDF 文件的大小。
假设这个特定文档的文件系统条目丢失了。我找到文档的开头并继续阅读,直到遇到“startxref number %%EOF”。问题是我不知道什么时候停止,因为文档内容中有多个“%%EOF”标记。
我试过在读完之后停下来,比方说 10 个簇,但在任何地方都找不到任何特定于 pdf 的关键字,如“obj”、“stream”、“trailer”、“xref”。但它是非常随意的,并且不是确定文档结尾的确定性方法,所以我可以确定它的大小。
我还在一些“obj”的开头看到了一些“长度数字”标记,但大多数时候数字并不真正适合。
关于我接下来可以尝试什么有什么想法吗?有没有办法确定整个文档的确切大小?我对以编程方式恢复文档很感兴趣。
最佳答案
由于 PDF 是“自由格式”(与文本文件非常相似,但在“阅读”内容方面对人类来说不太明显),如果它们不按顺序排列,可能很难将它们拼凑在一起。
stream
确实有一个长度,它是 endstream
去向的关键。 (流本身前后的空行)。流用于将位图和类似的东西[字体、压缩形式的艺术线条数据等]引入文档)。但是,如果您有几个 4KB 的段可以作为流中间的同一个 block 进入,那么除了将它们粘贴在一起并查看哪些看起来正常而哪些不正常之外,没有办法判断它们的去向。类似地,如果流和对象有多个段,您就无法真正分辨哪个到哪里。
当然,这适用于几乎所有类型的具有“可变内容”的文件 - 您可以找到 JPG 的前几千字节,但知道其余部分是什么并不容易 - 只能通过视觉检查内容你能确定哪些字节 block 属于哪里 - 如果你弄错了,你可能只会得到一些随机垃圾。
关于c++ - 解析已删除的 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16915915/