C# 如何识别PDF格式?

C# 如何识别PDF格式?,c#,.net,pdf,C#,.net,Pdf,给定一个字节流,如何判断该流是否包含PDF文档或其他内容 我使用的是.NET和C#,但这并不重要。PDF文件以ASCII字符串开始,具体取决于它的实际PDF版本。这取决于您希望检测工作的良好/可靠程度 下面是我从756页长的官方定义中挑选的最重要的片段,直接从马口中摘取(): 基本一致性PDF文件应由以下四个要素构成(见图2): 一行标题,标识文件符合的PDF规范版本 包含组成文件中所含文档的对象的主体 包含文件中间接对象信息的交叉引用表 提供交叉参考表和文件正文中某些特殊对象位置的预告片 [

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


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

PDF文件以ASCII字符串开始,具体取决于它的实际PDF版本。

这取决于您希望检测工作的良好/可靠程度

下面是我从756页长的官方定义中挑选的最重要的片段,直接从马口中摘取():

基本一致性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
[其中,0..7中的X]必须出现在其自身的一行上,后跟换行符。这一行必须出现在前4096字节内,不一定出现在第一行。前几行可能包含非PDF内容,但包含打印机作业语言命令(PJL)或注释

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


仅仅解析“%PDF-1.”就已经让很多人感到痛苦了……

请记住,如果文件以
%PDF-1.3
开头,这很好地表明它是PDF文件,但不能保证。唯一能确定的方法就是解析整个文件。哦,天哪。这是一种模糊标准的方法。。。此外,akonsu所说的不是一个文件,而是一个字节流。(我想知道为什么如此草率的回答会在30分钟内得到5张选票…@pipitas,既然OP接受了它,我想它符合他的标准。你的答案显然更全面,所以希望他也会回来阅读。那么,他的标准太宽松了。希望他不会因为依赖它们而被咬。