给定一个字节流,如何判断此流是否包含PDF文档?
我使用的是.NET和C#,但没关系。
答案 0 :(得分:15)
这完全取决于您希望检测工作的良好/可靠性。
这里我从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和从文件开头到最后一个交叉引用部分中xref关键字开头的解码流中的字节偏移量。
的
要记住的两件最重要的事情是:
(a)第一个'标题行'
%PDF-1.X
[其中X在0..7中]必须出现在它自己的一行上,后面跟一个换行符。此行必须出现在前4096字节内,而不必出现在第一行。前面的行可能包含非PDF内容,但 printer job languange命令(PJL)或注释。
(b)如果PDF包含二进制数据,则下一行必须是四个二进制字节。
只需解析'%PDF-1'。已经咬了很多人....
答案 1 :(得分:4)
PDF文件以ASCII字符串%PDF-1.3
或类似名称开头,具体取决于实际的PDF版本。