【发布时间】:2011-04-13 07:36:31
【问题描述】:
给定一个字节流,我如何判断这个流是否包含 PDF 文档或其他内容?
我正在使用 .NET 和 C#,但这没关系。
【问题讨论】:
给定一个字节流,我如何判断这个流是否包含 PDF 文档或其他内容?
我正在使用 .NET 和 C#,但这没关系。
【问题讨论】:
这完全取决于您希望检测工作的效果/可靠性。
这是我从长达 756 页的官方定义中挑选的最重要的片段,直接来自马的嘴 (PDF 32000:1-2008):
一个基本的符合标准的 PDF 文件应由以下四个元素构成(见图 2):
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”。已经咬了很多人了……
【讨论】:
PDF 文件以 ASCII 字符串 %PDF-1.3 或类似字符串开头,具体取决于它实际的 PDF 版本。
【讨论】:
%PDF-1.3 开头,则很好地表明它是 PDF 文件,但不能保证。唯一确定的方法是解析整个文件。