【问题标题】:Determine whether file is a PDF in perl?在perl中确定文件是否为PDF?
【发布时间】:2016-04-01 03:47:41
【问题描述】:

使用perl,确定文件是否为PDF 的最佳方法是什么?

显然,并非所有PDFs 都以%PDF 开头。请参阅此答案的 cmets:https://stackoverflow.com/a/941962/327528

【问题讨论】:

  • 检测需要多好?您是否只需要检测常见的 PDF 文件以将它们列入白名单,还是应该检测所有可能以 PDF 格式打开的文件以将它们列入黑名单?后者要困难得多,因为合法的 PDF 文件实际上可以在魔术 %PDF 字符串之前包含数据,从而欺骗您认为这是图像等而不是 PDF。
  • 显然,并非所有 PDF 都以 %PDF 开头 - 所有 有效 pdf(根据规范)都以“%PDF-1”开头.不过,一些 pdf 查看器也接受无效的 pdf,因此会留下不同的印象。

标签: perl pdf


【解决方案1】:

检测 PDF 并不难,但需要注意一些极端情况。

  1. 所有符合标准的 PDF 都包含一个单行标题,用于标识文件符合的 PDF 规范。通常是 %PDF-1.N,其中 N 是 0 到 7 之间的数字。
    • PDF 参考的第三版有一个实现说明,Acrobat 查看器只要求标题出现在文件的前 1024 个字节内。 (我见过一些将作业控制前缀添加到 PDF 文件开头的情况,因此 '%PDF-1.' 不是文件的前七个字节)
    • 第三版 (PDF 1.4) 的后续实施说明指出:Acrobat 查看器还将接受以下形式的标题:%!PS-Adobe-N.n PDF-M.m 但请注意,这不是 ISO32000 的一部分: 2008 (PDF 1.7) 规范。
    • 如果文件不是立即以 %PDF-1.N 开头,请小心,因为我见过一个案例,其中包含 PDF 的 zip 文件被错误地识别为 PDF,因为嵌入文件的那部分不是t 压缩。所以检查 PDF 文件预告片是个好主意。
  2. PDF 的结尾将包含带有“%%EOF”的行,
    • 第三版 PDF 参考有一个实现说明,即 Acrobat 查看器只要求 %%EOF 标记出现在文件的最后 1024 个字节内。
    • %%EOF 上方的两行应该是“startxref”标记,中间的行应该是一个数字,表示从文件开头到最后一个交叉引用表的字节偏移量。

总而言之,将文件的第一个和最后一个 1kb 读入字节缓冲区,检查相关的识别字节字符串标记是否大致在它们应该在的位置,如果它们在,那么你有一个合理的期望,你有一个 PDF 文件在你的手上。

【讨论】:

    【解决方案2】:

    模块PDF::Parse有一个名为IsaPDF的方法

    如果文件可以被解析并且是 PDF 文件,则返回 true。

    【讨论】:

    • PDF::Parse::IsaPDF 仅检查文件是否以“%PDF”开头。
    猜你喜欢
    • 2010-10-30
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多