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

我需要使用C#提取嵌入在破产法庭文件中的 XML数据。 在PDF Reader中,该文件看起来像一个典型的法庭文档。 在记事本中,XML隐藏在文本中。 我尝试使用SimpleTextExtractionStrategy使用此文本和另一个代码片段提取文本。 第一个结果是文件中没有来自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,所以我很挣扎。 任何代码建议?

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

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

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

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

有关示例,请参阅我对以下问题的回答: 如何使用itext删除PDF的附件 (查看我如何使用RUPS查看目录>名称> EmbeddedFiles)。

额外说明:到目前为止,您尝试过的代码是从页面中提取文本,而不是提取嵌入PDF中的XML文件。

更新:

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

屏幕截图

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

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

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

这是从记忆中写的。 如果您需要应用小修正,请更新我的答案。