【问题标题】:Determine if a byte[] is a pdf file判断一个 byte[] 是否为 pdf 文件
【发布时间】:2011-09-05 10:20:06
【问题描述】:

有什么方法可以检查 byte[] 是否是不打开的 pdf?

我有一些代码可以将 byte[] 列表显示为 pdf 缩略图。我以前知道所有的 byte[] 都是 pdf,因为我们过滤了 servlet 只返回这些。现在要求已经改变,我需要恢复所有文件类型。有什么方法可以检查 byte[] 是什么,或者更具体地说,确定它是否不是 pdf?

【问题讨论】:

  • 也许这可以提供一些帮助:stackoverflow.com/questions/2731917/…
  • -1:打开十六进制编辑器并查看 PDF 的标题。不难。答:%PDF 是第一个 4 个字节。
  • @leppie:某些格式没有这样的规范(例如 csv)。所以,在你找到“官方”规范之前——仅仅“打开一个十六进制编辑器”是非常糟糕的。比如JPEG格式就不是那么容易了:)
  • @chopikadze:除了你,还有谁在谈论其他文件格式?是的,JPEG 很简单,FF D8 DD E0
  • @leppie:JPEG 是 FF D8 FF,有时(来自相机)你可以获得 E1 而不是 E0。一般来说,我的意思是有时格式并不像乍一看那么容易。仅此而已。

标签: c# .net file pdf bytearray


【解决方案1】:

检查数组的前 4 个字节。

如果是0x25 0x50 0x44 0x46,那么它很可能是一个 PDF 文件。

【讨论】:

  • 我使用这个答案已经有好几年了,现在我正盯着一个以 0xEF 0XBB 0XBF 开头的PDF。有什么想法吗?
  • 看来这些字节被附加到 UTF-8 格式的 PDF 中。这意味着你不能盲目地检查 0x25 0x50 ...
  • 较旧的 PDF 文件可能在前 1,024 个字节的任何位置都有 %PDF 魔法,因此这种技术并不总是适用于所有 PDF 文件。
  • @MichaelD。那是 UTF-8 BOM (Byte Order Mark)。它可以出现在几乎任何 UTF-8 Unicode 文本格式的文件的开头,无论规范是否这样说。真的有点烦。
  • “旧的 PDF 文件可能在前 1,024 个字节的任何地方都有 %PDF 魔法” - 再次是的,就像“在野外有类似的文件旧的”,但尽管如此,那些 pdf 从来都不是“有效”的 pdf,只是处理器松懈到足以忽略该错误。
【解决方案2】:

据我所知,所有 PDF 文件都以 %PDF 开头,因此您可以对照此字符串检查第一个字节。

【讨论】:

    【解决方案3】:

    前四个字节应为:0x25 0x50 0x44 0x46(十六进制格式,ASCII 格式为%PDF)。您可以找到其他格式的“幻数”here

    【讨论】:

      【解决方案4】:

      虽然标记的答案和其他答案都是正确的,但它们不会 100% 成功。问题是 PDF 规范说 %PDF-1.x 只需要在前 1024 个字节中而不是前 4 个字节中。有些程序会在 %PDF 之前添加信息并且仍然有效。

      我建议查看以下 Stack Overflow 问题的答案:How to detect if a file is PDF or TIFF?

      【讨论】:

      • 问题是 PDF 规范说 %PDF-1.x 只需要在前 1024 个字节中而不是前 4 个字节中 - 这是错误的,规范(ISO 32000-1) 明确规定“PDF 文件的第一行应是由 5 个字符 %PDF- 后跟 1.N 形式的版本号组成的标题,其中 N 是 0 之间的数字和 7"。甚至 Adob​​e PDF 参考文献也类似地表示“PDF 文件的第一行是一个标头,用于标识文件符合的 PDF 规范的版本”,并提供与规范相同的变体。只是……
      • ... 只是 Adob​​e PDF 参考的 实施说明 说“Acrobat 查看器只要求标题出现在文件的前 1024 个字节。”因此,“某些程序会在 %PDF 之前添加信息,并且仍然有效。”是错误的,创建的 PDF 无效,它们只是被一些查看者接受和显示,尽管它们被破坏了;它们也被许多其他 PDF 处理器拒绝。
      • %PDF-1.x 的值可能比前几个字符出现得更远并且仍然有效,这与您提到的相反。我有几个有效的 Pdf 文件,其中 %PDF-1.x 出现在前 8 个字符之外。因此,我正在寻找一个好的答案来解决这个问题。不幸的是,除了 1 篇文章外,所有文章都说使用前几个字符并匹配 %P​​DF-1.x。拥有一些有效的文件并且未能通过这种方法使我指出,仅检查前几个字符的方法并不总是有效的,正如我在帖子中所说并推荐了另一种方法。
      • 您认为它们有效的标准是什么?它们显然违反了规范(这是 ISO 规范,而不是一些 Adob​​e 参考)。 Adobe acrobat 和 reader 等精选产品可能会接受这些文件,但这并不能使它们有效。
      • 不,旧的 pdf 参考资料还需要一个以 %PDF 开头的 pdf 文件。仅在实施说明中,它声明Acrobat 查看器 只要求它出现在文件的前1024 个字节中。因此,读者比规范更宽松。
      【解决方案5】:

      我一直有这个问题。我们使用了一些来自 GitHub 的 Magic 库,可以很好地将内容确定为 PDF。但是,我们收到的一些文件

      1. 在 PDF 阅读器中打开
      2. %PDF- 之前确实有不同的起始字节 (5)
      3. 以这 8 个字节结束 0A 0D 0A 30 0D 0A 0D 0A

      所以,当 PDF 扩展名的文件不匹配时,我添加了逻辑来检查这些起始字节 5-9 和最后的 8 个字节。

      【讨论】:

      • 在当前软件中,在 %PDF 之前或 %%EOF 之后放置任何内容都可能被视为错误(除非 pdf 不用于分发,而仅用于某些特殊的打印机队列)。
      • 你的意思是“pdf软件”吗?我不知道客户从哪里得到这些文件。但他们确实如此。有没有关于这个的官方阅读?因为如果我能证明拥有这些字节是非法的,我们可能会将其推回给客户
      • PDF 规范明确要求在 PDF 的第一行使用 %PDF,在最后一行使用 %%EOF。参见 ISO 32000 第 1 和 2 部分
      • @mkl 谢谢。但是公平地说,在PDF阅读器可以打开一个文件的情况下,我的程序可以确定这个文件实际上有%PDF接近开始和%%EOF接近结束,这是一个PDF?跨度>
      • 其实 PDF 查看器非常松懈。他们在不告诉用户的情况下忽略/修复许多错误。但它们通常只显示概念上是 pdf 的文件(不像文字处理器,除了实际的文字处理器格式之外,它通常还接受纯文本或 HTML)。
      【解决方案6】:

      您可以检查文件的前 4 或 5 个字节。 参考以下头字节:

      https://en.wikipedia.org/wiki/List_of_file_signatures

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多