【问题标题】:Difference between the ID of a pdf read from iTextSharp and pdf.js从 iTextSharp 和 pdf.js 读取的 pdf 的 ID 之间的区别
【发布时间】:2015-10-24 22:35:01
【问题描述】:

我正在尝试使用this answer 中提到的 iTextSharp 解析特定 pdf (this) 的 ID。但是我得到了 ID 的空数组,而我可以看到另一个 pdfReader (pdf.js) 可以将 ID 读取为77a2a5c4fc17dc3a91a072c46fe69ec0。为什么这种行为不同?我是否应该从预告片以外的其他地方读取 ID 字段?

【问题讨论】:

    标签: pdf itextsharp pdf.js


    【解决方案1】:

    在文本编辑器中打开带有 ID 的常规 PDF,如下所示:

    就在startxref 之前,您会看到一本字典(它以<< 开头)。这就是 PDF 的预告片字典。其中一个(可选)条目是 /ID,它是一个包含两个 PDF 字符串的数组。

    如果您的 PDF 中有这样的条目,那么问题 Extract ID of a PDF document using iTextSharp 的答案将不会返回 null

    现在在文本编辑器中打开您的 PDF:

    您再次看到startxref 之前的字典(预告片字典)。但是,在这种情况下,字典只有三个条目:/Size(交叉引用表中的对象数)、/Info(对包含元数据的字典的引用)和/Root(对目录字典)。

    没有/ID 条目,因此iText(和iTextSharp)应该返回null(并且您确认它们确实如此)。

    现在在您在文本编辑器中打开的 PDF 中搜索值 77a2a5c4fc17dc3a91a072c46fe69ec0。您在任何地方都找不到那个价值因为它根本不存在!

    总结:您的问题我是否应该从预告片以外的其他地方读取 ID 字段?是错误的。你在问如何阅读不存在的东西。您的问题应该是:为什么 pdf.js 会为没有 ID 的 PDF 创建 ID,以及如何检索它?第一部分的答案是合理的:即使 iText 也尝试创建/ID 当您操作 PDF 时,因为 PDF 具有 ID 是一种很好的做法。第二部分的答案是:看预告片(但你已经知道了)。

    结论:根据 cmets 中的反馈,原来 OP 正在使用 pdf.js 中的fingerprint() 方法。如果 ID 存在,则此方法返回 ID 的第一个元素。如果没有找到 ID,则返回 MD5 哈希。参见pdf.js中fingerprint()方法的source code

    【讨论】:

    • 就在 startxref 之前,您会看到一本字典(它以 << 开头)。那是目录根字典PDF - ehem,不。它是 trailer 字典Catalog/root 字典是它的 Root 条目引用的字典。
    • 呃... 在硅谷忙碌了一天之后,现在是清晨。感谢您纠正我,mkl 和 @rhens。
    • 所以您是在暗示 ID 只是不存在于文档中,而 pdf.js 要么给出一些随机值,要么使用一些逻辑生成它?
    • 如果您不想相信我,您不必相信我,但请自行检查:在纯文本编辑器中打开 PDF 并查找该 ID。如果你找不到它,你会知道我没有建议任何事情;-)
    • 即使我尝试搜索 ID,但我找不到它。但我认为它可能是我不理解的某种编码形式:P。无论如何,我会尝试找出我是否能找到一个了解 pdf.js 如何提取 ID 的方法。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多