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

Extract Embedded XML from PDF with iTextSharp (C#)

我需要使用 SimpleTextExtractionStrategy 提取嵌入在 Bankruptcy court files with C#. In PDF Reader the file looks like a typical court doc. In Notepad the XML is buried in the text. I've tried extracting the text with this and another code snippet 中的 XML 数据。第一个结果生成的文件没有来自 PDF 的可识别文本,第二个结果输出符号。我还尝试将其作为 AcroField 和 Xfaform 进行访问。它似乎不是基于 Watch window 的任何一个。

单步执行 Visual Studio 中的代码,XML 显示在 PDFReader >> 目录 >> 键 >> 原始 >> 非 Public 成员 >> 字典下观看 window。我不知道如何去做。由于它在 Watch 中与其他 PDFName 一起列出,我认为我可以通过 PDFReader.Catalog.GetAsDict 访问它,但它不会显示为 PDFName。这些文件的提供者有一个 java 应用程序,似乎只是读取文本。不确定我是否需要使用不同的提取策略,或者直接访问包含 XML 的目录项。我从来没有以编程方式处理 PDF 文件或 iTextSharp,所以我很挣扎。任何代码建议?

如果您可以共享带有嵌入式 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怎么看Catalog > Names > EmbeddedFiles)

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

更新:

现在您已经共享了一个文件,我已经使用 RUPS 找到了 XML 文件。看看下面的屏幕截图:

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

话虽如此,这就是您提取 XML:

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

这是凭记忆写的。如果您需要进行小的更正,请更新我的答案。