我正在尝试获取XFA表单中所有字段的简单列表。我正在使用此代码:
private void ListFieldNames()
{
string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf";
MemoryStream m = new MemoryStream();
// title the form
this.Text += " - " + pdfTemplate;
// create a new PDF reader based on the PDF template document
PdfReader pdfReader = new PdfReader(pdfTemplate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, m);
AcroFields formFields = pdfStamper.AcroFields;
AcroFields form = pdfReader.AcroFields;
XfaForm xfa = form.Xfa;
StringBuilder sb = new StringBuilder();
sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm");
sb.Append(Environment.NewLine);
foreach (string key in form.Fields.Keys)
{
sb.Append(key);
sb.Append(Environment.NewLine);
txtFields.Text = sb.ToString();
}
txtFields.Text = sb.ToString();
}
但是我得到的只是XFA表单,而不是任何字段。知道我在做什么错吗?
提前致谢
最佳答案
您已经从我的书“iText in Action”的第8章中获取了一个代码示例。该代码示例的结果与我在第273页上写的内容一致:
如果您的问题是“我在做什么错了吗?”那么答案很简单:您停止阅读第270页,或者使用代码示例而不阅读随附的文档。如何解决这个问题?阅读文档!
如果您的问题是“为什么我没有有关该字段的任何信息? (这不是您的问题,但让我们假设是),答案是:您正在使用代码来检索AcroForm字段,但是您的表单不包含任何此类字段。您的表单是纯XFA表单,这意味着所有字段信息都仅存储为XML和XML!
假设您现在想知道:如何提取XML?那么您应该去找到复制/粘贴示例的地方。
可能在这里:
http://itextpdf.com/examples/iia.php?id=164
也许在这里:http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs
甚至在这里:http://kuujinbo.info/iTextInAction2Ed/index.aspx?ch=Chapter08&ex=XfaMovie
此代码段将返回完整的XFA流:
public string ReadXfa(PdfReader reader) {
XfaForm xfa = new XfaForm(reader);
XmlDocument doc = xfa.DomDocument;
reader.Close();
if (!string.IsNullOrEmpty(doc.DocumentElement.NamespaceURI)) {
doc.DocumentElement.SetAttribute("xmlns", "");
XmlDocument new_doc = new XmlDocument();
new_doc.LoadXml(doc.OuterXml);
doc = new_doc;
}
var sb = new StringBuilder(4000);
var Xsettings = new XmlWriterSettings() {Indent = true};
using (var writer = XmlWriter.Create(sb, Xsettings)) {
doc.WriteTo(writer);
}
return sb.ToString();
}
现在寻找
<xfa:datasets>
标记;它会有一个子标签<xfa:data>
(如果表单为空,则可能为空)和一个子标签<dd:dataDescription>
。在dataDescription
标记内,您会发现类似于XSD的内容。那就是您需要知道表单中的字段有关的内容。我可以继续猜测一些问题,例如:如何填写这样的表格?通过使用
fillXfaForm()
方法;如何展平这样的表格?通过使用XFA Worker(这是在iTextSharp之上编写的一个封闭的源代码库),但让我们将这些问题留给另一个线程;-)