我想检查pdf文档是否包含Web应用程序c#中的交叉引用流或表。怎么检查?

时间:2012-10-16 08:57:37

标签: pdf cross-reference

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

3 个答案:

答案 0 :(得分:1)

检测相当容易。从文件末尾搜索“%% EOF”;正确的PDF文件实际上以'%% EOF'行结束,不那么正确的PDF文件可能在该标记之后有一些垃圾字节。该标记行之前的行包含最后一个交叉引用的位置(参见Adobe copy of ISO-32000-1:2008第7.5.5节)。转到此处提到的位置。

如果在该位置找到xref关键字,则PDF具有交叉引用表。如果您找到PDF流对象(ibidem第7.5.8节),则PDF具有交叉引用流。如果你在那里找不到,那么关于这个文件的东西是可疑的。

转换很困难,特别是如果PDF也使用只能与交叉引用流一起使用的对象流。您可能希望使用像iText(Sharp)这样的库来读取PDF并在启用较少压缩的情况下再次导出它。

此外,如果PDF已签名,则无法在不破坏签名的情况下进行转换。

答案 1 :(得分:0)

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

代码使用Docotic.Pdf library

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

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

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

答案 2 :(得分:0)

从交叉引用流转换为可解析的内容时,需要注意的一点是交叉引用流允许新类型的引用条目。沿“未压缩”“免费”,您现在有“压缩”作为新的参考类型。

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

如果您仍然对该主题感兴趣,我建议您查看“3.4.7交叉引用流”一章。特别是段落“与不支持PDF 1.5的应用程序的兼容性”可以提供帮助。它涉及一个所谓的“混合参考”,可以以某种方式做你想做的事。

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

  • 您可以搜索 / Type / XRef 的流(两个关键字之间有可变空格)。
  • 此外,如果您有 / Type / ObjStm 的任何流,您可以推断出必须有外部参照流,因为只有外部参照流可以指向对象流;)(参见上面的解释)。
  • 最后但并非最不重要的是,如果您解析的文档的 PDF版本 小于1.5 ,您可以确定不包含任何外部参照流。这在很大程度上取决于创建文档的PDF创作工具。有些人不赞成参考。

我希望这会有所帮助。