【问题标题】:How to recognize PDF format?如何识别PDF格式?
【发布时间】:2011-04-13 07:36:31
【问题描述】:

给定一个字节流,我如何判断这个流是否包含 PDF 文档或其他内容?

我正在使用 .NET 和 C#,但这没关系。

【问题讨论】:

    标签: c# .net pdf


    【解决方案1】:

    这完全取决于您希望检测工作的效果/可靠性。

    这是我从长达 756 页的官方定义中挑选的最重要的片段,直接来自马的嘴 (PDF 32000:1-2008):

    一个基本的符合标准的 PDF 文件应由以下四个元素构成(见图 2):

    • 单行标题,用于标识文件符合的 PDF 规范版本
    • 包含构成文件中包含的文档的对象的主体
    • 包含文件中间接对象信息的交叉引用表
    • 提供交叉引用表和文件正文中某些特殊对象位置的预告片
      [....]

    PDF 文件的第一行应为由 5 个字符 %PDF– 后跟 1.N 形式的版本号组成的标题,其中 N 是 0 到 7 之间的数字。 符合标准的阅读器应接受具有以下任何标头的文件:
    %PDF–1.0
    %PDF–1.1
    %PDF–1.2
    %PDF–1.3
    %PDF–1.4
    %PDF–1.5
    %PDF–1.6
    %PDF–1.7
    [...]

    如果 PDF 文件包含二进制数据,大多数情况下(参见 7.2,“词汇约定”),标题行后面应紧跟包含至少四个二进制字符的注释行,即代码为 128 的字符或更大。这确保了文件传输应用程序的正确行为,这些应用程序检查文件开头附近的数据以确定是将文件内容视为文本还是二进制文件。

    预告片
    [....] 文件的最后一行应仅包含文件结束标记 %%EOF。前两行应依次包含关键字 startxref 和解码流中从文件开头到最后一个交叉引用部分中外部参照关键字开头的字节偏移量。

    总结

    要记住的最重要的两件事:

    (a) 第一个“标题行”

       %PDF-1.X
    

    [where X in 0..7] 必须单独出现在一行,后跟换行符。此行必须出现在前 4096 字节内,不一定在第一行。前面几行可能包含非 PDF 内容,但打印机作业语言命令 (PJL) 或 cmets。

    (b) 如果 PDF 包含二进制数据,则下一行必须是四个二进制字节。

    仅解析“%PDF-1”。已经咬了很多人了……

    【讨论】:

      【解决方案2】:

      PDF 文件以 ASCII 字符串 %PDF-1.3 或类似字符串开头,具体取决于它实际的 PDF 版本。

      【讨论】:

      • 请记住,如果文件以%PDF-1.3 开头,则很好地表明它是 PDF 文件,但不能保证。唯一确定的方法是解析整个文件。
      • 哦,亲爱的。这是一种模糊标准的方法……而且,akonsu 不是在谈论 文件,而是在谈论 字节流。 (我想知道为什么这么草率的答案会在 30 分钟内获得 5 次投票……)
      • @pipitas,既然 OP 接受了它,我认为它满足他的标准。你的回答显然更彻底,所以希望他也会回来阅读它。
      • 好吧,那他的标准太宽松了。希望他不会因为依赖他们而被咬。
      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2020-01-06
      相关资源
      最近更新 更多