如何识别PDF格式?

ako*_*nsu 8 .net c# pdf

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

我使用的是.NET和C#,但这并不重要.

Kur*_*fle 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
Run Code Online (Sandbox Code Playgroud)

[其中X在0..7中]必须出现在它自己的一行上,后面跟一个换行符.此行必须出现在前4096字节内,而不必出现在第一行.前面的行可能包含非PDF内容,但可能包含打印机作业语言命令(PJL)或注释.

(b)如果PDF包含二进制数据,则下一行必须是四个二进制字节.

只需解析'%PDF-1'.已经咬了很多人......