如何识别PDF格式?

时间:2010-09-16 16:17:22

标签: c# .net pdf

给定一个字节流,如何判断此流是否包含PDF文档?

我使用的是.NET和C#,但没关系。

2 个答案:

答案 0 :(得分:15)

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

这里我从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和从文件开头到最后一个交叉引用部分中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版本。