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

使用iTextSharp(C#)从PDF中提取嵌入式XML,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我需要用C#提取嵌入到中的XML数据。在PDF阅读器中,该文件看起来像一份典型的法庭文件。在记事本中,XML隐藏在文本中。我尝试过使用SimpleTextractionStrategy提取文本。第一个结果是PDF中没有可识别文本的文件,第二个输出符号。我还尝试将其作为AcroField和Xfaform访问。它似乎不是基于手表窗口的 在VisualStudio中单步遍历代码,XML将显示在监视窗口中的PDFReader>>目录>>键>>原始>>非公共成员>>字典下。不过我不知道怎么去。由于它与Wa

我需要用C#提取嵌入到中的XML数据。在PDF阅读器中,该文件看起来像一份典型的法庭文件。在记事本中,XML隐藏在文本中。我尝试过使用SimpleTextractionStrategy提取文本。第一个结果是PDF中没有可识别文本的文件,第二个输出符号。我还尝试将其作为AcroField和Xfaform访问。它似乎不是基于手表窗口的


在VisualStudio中单步遍历代码,XML将显示在监视窗口中的PDFReader>>目录>>键>>原始>>非公共成员>>字典下。不过我不知道怎么去。由于它与Watch中的其他PDFName一起列出,我想我可以通过PDFReader.Catalog.GetAsDict访问它,但它不显示为PDFName。这些文件的提供者有一个java应用程序,似乎只是读取文本。不确定是否需要使用不同的提取策略,或者直接访问包含XML的目录项。我从未以编程方式处理过PDF文件或iTextSharp,所以我很挣扎。有代码建议吗

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

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

如果您不能共享该文件,您将不得不自己动手。您可以通过下载来实现这一点。这是一个免费的工具,看看里面的PDF

浏览树结构并查找
元数据
,查找
嵌入文件
,查找
注释
。如果您不告诉我们XML是如何嵌入的,没有人能够帮助您

有关示例,请参见我对以下问题的回答: (看看我如何使用RUP查看目录>名称>嵌入文件)

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

更新:

既然您已经共享了一个文件,我就使用RUPS来查找XML文件。请查看以下屏幕截图:

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

也就是说,这就是如何提取XML:

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

这是从内存中写入的。如果需要进行小的更正,请更新我的答案。

似乎没有附加文件的方法。法庭页面上有一个链接-。很抱歉有人说XML存储在PDF中的方式很奇怪,但我对PDF非常感兴趣,有时我会神魂颠倒。面对这样的PDF文件给您带来的不便,您应该得到一张赞成票。没问题。只要我不是问题中的开发者……)这是美国法院系统,所以你必须调整你的期望。我整个上午都在诅咒这些文件。那个代码运行得很好。非常感谢你!我只是没有掌握如何访问PdfNameYes,如果不查看PDF文件,没有人会猜到。美国法院刚刚发明了一个自定义名称…嗨@BrunoLowagie,它非常有价值。但我正在尝试使用Jquery/javascript/angular/android/或任何混合移动应用程序技术提取xml文件。有没有办法呢。请帮忙。pdf由itext生成