我有一个c#web应用程序,我想检查pdf文档是否包含交叉引用流。如果它包含交叉引用流,则将其转换为引用表。
答案 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的应用程序的兼容性”可以提供帮助。它涉及一个所谓的“混合参考”,可以以某种方式做你想做的事。
现在,我们或多或少知道如何将外部参照流转换为外部参照表,让我们继续检测外部参照流。
我希望这会有所帮助。