C# 如何识别PDF格式?
给定一个字节流,如何判断该流是否包含PDF文档或其他内容C# 如何识别PDF格式?,c#,.net,pdf,C#,.net,Pdf,给定一个字节流,如何判断该流是否包含PDF文档或其他内容 我使用的是.NET和C#,但这并不重要。PDF文件以ASCII字符串开始,具体取决于它的实际PDF版本。这取决于您希望检测工作的良好/可靠程度 下面是我从756页长的官方定义中挑选的最重要的片段,直接从马口中摘取(): 基本一致性PDF文件应由以下四个要素构成(见图2): 一行标题,标识文件符合的PDF规范版本 包含组成文件中所含文档的对象的主体 包含文件中间接对象信息的交叉引用表 提供交叉参考表和文件正文中某些特殊对象位置的预告片 [
我使用的是.NET和C#,但这并不重要。PDF文件以ASCII字符串开始,具体取决于它的实际PDF版本。这取决于您希望检测工作的良好/可靠程度 下面是我从756页长的官方定义中挑选的最重要的片段,直接从马口中摘取(): 基本一致性PDF文件应由以下四个要素构成(见图2):
- 一行标题,标识文件符合的PDF规范版本
- 包含组成文件中所含文档的对象的主体
- 包含文件中间接对象信息的交叉引用表
- 提供交叉参考表和文件正文中某些特殊对象位置的预告片
[……]
%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接受了它,我想它符合他的标准。你的答案显然更全面,所以希望他也会回来阅读。那么,他的标准太宽松了。希望他不会因为依赖它们而被咬。