我想检查pdf文档是否包含web应用程序c#中的交叉引用流或表.如何检查



我有一个c#web应用程序,我想检查pdf文档是否包含交叉引用流。如果它包含交叉引用流,则将其转换为引用表。

检测相当容易。从文件末尾搜索"%%EOF";正确的PDF文件实际上以"%%EOF"行结束,而不正确的文件可能会在该标记后面有一些垃圾字节。该标记线之前的线包含最后一次交叉引用的位置(参见ISO-32000-1:2008第7.5.5节的Adobe副本)。转到此处注明的位置。

如果在该位置找到了xref关键字,则PDF具有一个交叉引用表。如果您找到了PDF流对象(ibidem第7.5.8节),则PDF具有交叉引用流。如果你发现两者都不存在,那么这个文件就有些可疑之处。

然而,转换是困难的,尤其是如果PDF还使用只能与交叉引用流一起使用的对象流。您可能想使用iText(Sharp)这样的库来读取PDF,并在启用较少压缩的情况下再次导出。

此外,如果PDF是签名的,那么在不破坏签名的情况下转换是不可能的。

从交叉引用流转换为可以解析的内容时需要注意的一件事是,交叉引用流允许新类型的引用条目。除了"未压缩">《free》,您现在有了的"压缩"作为新的引用类型。

此条目不能直接1:1转换为正常的对照表。交叉引用流内部的"压缩">引用条目指向所谓的"对象流"。后者包含多个索引对象。外部参照流中的"压缩"条目然后命名对象流和索引。然后,对象流中的第一行用于将索引解析为对象流内的字节偏移量。

如果您仍然对该主题感兴趣,我建议您查看章节"3.4.7交叉引用流">。特别是"与不支持PDF 1.5的应用程序的兼容性">这一段会有所帮助。它处理一个所谓的"混合引用">,它以某种方式满足您的需求。

现在,我们或多或少地知道了如何将外部参照流转换为外部参照表,让我们继续检测外部参照流。

  • 您可以使用/Type/XRef(两个关键字之间有可变空格)搜索流
  • 此外,如果有/Type/OjStm的任何流,则可以推断出一定有外部参照流,因为只有外部参照流才能指向对象流;)(有关说明,请参见上文)
  • 最后但并非最不重要的是,如果您分析的文档的PDF版本小于1.5,您可以在一定程度上确定不包含外部参照流。这在很大程度上取决于创建文档的PDF创作工具。有些人坚持引用,有些人则不然

我希望这能有所帮助。

这是一种破解,但您可以使用以下代码来检测PDF是否包含交叉引用流。

代码使用Docotic。Pdf库。

public static bool ContainsCrossReferenceStreams(string fileName)
{
using (PdfDocument document = new PdfDocument(fileName))
{
return document.SaveOptions.UseObjectStreams;
}
}

当库打开PDF时,如果源文档使用交叉引用流,它会将SaveOptions.UseObjectStreams设置为true。否则,属性将返回false

免责声明:我为图书馆的供应商工作。

最新更新