我需要使用C#提取Bankruptcy court files中嵌入的XML数据。在PDF阅读器中,该文件看起来像一个典型的法庭文档。在记事本中,XML隐藏在文本中。我尝试使用SimpleTextExtractionStrategy使用this和another code snippet提取文本。第一个结果是文件中没有来自PDF和第二个输出符号的可识别文本。我也试过将它作为AcroField和Xfaform访问。它似乎不是基于Watch窗口的那些。
单步执行Visual Studio中的代码,XML显示在PDFReader>>下目录>>键>>原始>>非公开会员>> Watch窗口中的字典。我不知道怎么做到这一点。由于它与Watch中的其他PDFNames列出,我认为我可以通过PDFReader.Catalog.GetAsDict访问它,但它不会显示为PDFName。这些文件的提供者有一个似乎只读取文本的Java应用程序。不确定我是否需要使用不同的提取策略,或者直接访问包含XML的目录项。我从来没有以编程方式使用PDF文件或iTextSharp,所以我很挣扎。任何代码建议?
答案 0 :(得分:3)
如果您可以与嵌入式XML共享PDF,这将有所帮助。当我第一次阅读您的问题时,我认为XML将被添加为文档级附件(存储在EmbeddedFiles中)或作为附件注释(存储在Annot中添加到页面词典中)。
阅读uscourts.gov上的内容,看起来XML实际上是一个XMP流。这意味着您可以在目录的元数据条目中找到它(或者可能在页面字典中)。
如果您无法共享该文件,则必须自助。您可以通过下载iText RUPS来执行此操作。这是一个免费的工具,可以在里面找到。
浏览树状结构并查找Metadata
,查找EmbeddedFiles
,查找Annots
。如果您没有告诉我们XML是如何嵌入的,那么没有人能够帮助您。
有关示例,请参阅我对以下问题的回答:How to delete attachment of PDF using itext (看看我如何使用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();
这是从记忆中写的。如果您需要应用小修正,请更新我的答案。