无法遍历 iTextSharp 中的字段

Posted

技术标签:

【中文标题】无法遍历 iTextSharp 中的字段【英文标题】:Cannot iterate through fields in iTextSharp 【发布时间】:2017-05-22 18:56:55 【问题描述】:

我有一个带有表单的 PDF,其值可使用 iTextSharp 5.5.11 的 PDFReader.AcroFields.GetField() 方法访问。但我不知道如何遍历字段并打印键和值。我已经尝试过这个问题中提到的方法: How do I enumerate all the fields in a PDF file in ITextSharp

...但没有骰子。我也尝试过使用枚举器:

using System; using System.IO; using System.Collections; using System.Collections.Generic; using iTextSharp.text; using iTextSharp.text.pdf; class DoStuff static void Main(string[] args) string fileName = args[0]; PdfReader reader = new PdfReader(fileName); AcroFields pdfFormFields = reader.AcroFields; var enumerator = pdfFormFields.Fields.GetEnumerator(); Console.WriteLine(pdfFormFields.Fields.GetType()); // So it's a 'LinkedDictionary', how do I iterate through that and get keys and values? while (enumerator.MoveNext()) // Evidently not like this... Console.WriteLine("There are fields in the document, but this never prints");

...但这似乎也不起作用。目前的方法是什么?

【问题讨论】:

看起来在this 线程中你有你需要的答案。 【参考方案1】:

你需要这样的东西:

foreach (string key in pdfFormFields.Fields.Keys)

    // key is the name of the field

如果这没有显示任何字段,那么您不是在查看使用 AcroForm 技术的表单,您有一个 XFA 表单,而这样的表单是完全不同的。见How to get a list of the fields in an XFA form?

更新:如果您怀疑表单是纯 XFA 表单,请尝试以下代码:

XfaForm xfa = pdfFormFields.Xfa;

并检查xfa.XfaPresent 的值。如果是true,你有一个 XFA 表格;如果它是错误的,您可能会遇到损坏的表格。我已经看到在页面字典中有对小部件注释的引用的表单,但在字段数组中没有对这些小部件注释的引用。曾经有一个工具可以创建像这样的破碎表格(我忘记了哪个工具)。在任何情况下:对于人类用户来说,PDF 中似乎存在交互字段,但对于机器来说,这些不是真正的字段。见ItextSharp - Acrofields are empty

【讨论】:

好吧,foreach 循环什么也没显示,所以我猜它是 XFA。感谢您的信息。 我记得还有另一种可能。我已经更新了我的答案,提供了一个与您有同样问题的人提出的问题的链接。 谢谢。 XfaPresent 是真的,这样就解开了谜团。我查看了您发送的第一个链接,看来我必须深入研究 Xml...

以上是关于无法遍历 iTextSharp 中的字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 iTextSharp 添加水印文本时,PAC 工具中出现 iText 7 警告

使用iText 7(C#)创建删除线字体

iTextsharp) 边距宽度

iTextSharp操作PDF

从MikTex(通过Pandoc)写出表格字段,iTextSharp可以解析

iTextSharp 创建页脚页 # of #