使用iTextSharp(C#)从PDF中提取嵌入式XML

我需要使用C#提取嵌入在Bankruptcy court files中的XML数据 . 在PDF阅读器中,该文件看起来像一个典型的法庭文档 . 在记事本中,XML隐藏在文本中 . 我尝试使用SimpleTextExtractionStrategy使用thisanother code snippet提取文本 . 第一个结果是文件中没有来自PDF和第二个输出符号的可识别文本 . 我也试过将它作为AcroField和Xfaform访问 . 它似乎不是基于Watch窗口的那些 .

通过Visual Studio中的代码,XML显示在Watch窗口中的PDFReader >> Catalog >> Keys >> Raw >> Non-Public Members >>字典下 . 我不知道怎么做到这一点 . 由于它与Watch中的其他PDFNames列出,我认为我可以通过PDFReader.Catalog.GetAsDict访问它,但它不会显示为PDFName . 这些文件的提供者有一个似乎只读取文本的Java应用程序 . 不确定是否需要使用不同的提取策略,或者直接访问包含XML的目录项 . 我从来没有以编程方式使用PDF文件或iTextSharp,所以我很挣扎 . 任何代码建议?

回答(1)

2 years ago

如果您可以与嵌入式XML共享PDF,将会有所帮助 . 当我第一次阅读您的问题时,我认为XML将被添加为文档级附件(存储在EmbeddedFiles中)或作为附件注释(存储在Annot中添加到页面字典中) .

读取uscourts.gov上的内容,看起来XML实际上是一个XMP流 . 这意味着您可以在目录的元数据条目中找到它(或者可以在页面字典中) .

如果您无法共享该文件,则必须自己帮助 . 您可以通过下载iText RUPS来完成此操作 . 它是一个查看PDF内部的免费工具 .

浏览树结构并查找 Metadata ,查找 EmbeddedFiles ,查找 Annots . 如果您没有告诉我们XML是如何嵌入的,那么没有人能够帮助您 .

有关示例,请参阅我对以下问题的回答:How to delete attachment of PDF using itext(查看我如何使用RUPS查看目录>名称> EmbeddedFiles) .

到目前为止,您尝试过的代码是关于从页面中提取文本, NOT 关于提取嵌入在PDF中的XML文件 .

Update:

现在你已经共享了一个文件,我使用RUPS来查找XML文件 . 看看下面的截图:

Screen shot

你看到这里发生了什么吗?有人将名为 /USCTbankruptcynotice 的自定义条目添加为 String 作为值直接到目录 . 这是错误的:将文件存储在字符串中是一个坏主意 . 为什么开发人员不将该文件存储为流?雇用这样的开发人员的人我感到非常难过 .

话虽这么说,这就是你如何提取XML:

PdfDictionary catalog = reader.Catalog;
PdfName name = new PdfName("USCTbankruptcynotice");
PdfString USCTbankruptcynotice = catalog.GetAsString(key);
string xml = USCTbankruptcynotice.ToString();

这是从内存中写的 . 如果您需要应用小的更正,请更新我的答案 .