- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
早上好。我希望有人可以帮助我解决这个问题。去年,我使用 iTextSharp
设置了一个 VB.NET 程序,用户可以在其中输入信息以填写 I9,该信息将填写 PDF 并打印。对于新的 I9,我遇到了未知的困难。
首先,代码不会出错。我只是得到了一个糟糕的结果,因为我得到的不是填写的表格,而是一个 PDF,上面写着“您要加载的文档需要 Adobe Reader 8 或更高版本。您可能没有安装 Adobe Reader ...”等等。所以,我确保我拥有最新的 Reader 版本,再次尝试并得到相同的结果。
考虑到字段名称结构可能发生了变化,我尝试像第一次那样读取格式/字段。 (下面的代码)。但是,现在它告诉我没有要读取的字段 (AcroFields.Fields.Count = 0
)。
Private Sub ListFieldNames(pdfTemplate As String)
Dim pdfTemplate As String = "c:\Temp\PDF\fw4.pdf"
Dim pdfReader As PdfReader = New PdfReader(pdfTemplate)
Dim de As KeyValuePair(Of String, iTextSharp.text.pdf.AcroFields.Item)
For Each de In pdfReader.AcroFields.Fields
Console.WriteLine(de.Key.ToString())
Next
End Sub
因此,我开始进行一些搜索,并找到了他们可以切换到的另一种 PDF 结构的引用; XFA。老实说,我还没有找到任何令人满意的文档/样本,但我确实找到了一些代码,看起来应该可以读取 XFA PDF 的结构。 (下面的代码)。我在这里尝试了两种不同的方法。第一个本质上表明 xfaFields 中没有 xmlNode。第二个确实找到了一个名为“数据”的节点(这是它找到的唯一一个)但没有找到任何子节点。
Private Sub ReadXfa(pdfTemplate As String)
pdfReader.unethicalreading = True
Dim readerPDF As New PdfReader(pdfTemplate)
Dim xfaFields = readerPDF.AcroFields.Xfa.DatasetsSom.Name2Node
For Each xmlNode In xfaFields
Console.WriteLine(xmlNode.Value.Name + ":" + xmlNode.Value.InnerText)
Next
'Example of how to get a field value
' Dim lastName = xfaFields.First(Function(a) a.Value.Name = "textFieldLastNameGlobal").Value.InnerText
Dim reader As New PdfReader(pdfTemplate)
Dim xfa As New XfaForm(reader)
Dim node As XmlNode = xfa.DatasetsNode()
Dim list As XmlNodeList = node.ChildNodes()
For i As Integer = 0 To list.Count - 1
Console.WriteLine(list.Item(i).LocalName())
If "data".Equals(list.Item(i).LocalName()) Then
node = list.Item(i)
Exit For
End If
Next
list = node.ChildNodes()
For i As Integer = 0 To list.Count - 1
Console.WriteLine(list.Item(i).LocalName())
Next
reader.Close()
End Sub
https://www.uscis.gov/system/files_force/files/form/i-9.pdf?download=1
上面的链接转到政府提供的 i9 PDF。
所以...我想我有多个问题。最简单的是是否有人完成了这个过程/他们是否可以帮助我。除此之外,如果有人能为我指出正确的方向,说明如何从这个新的 PDF 文件中读取/写入,那将是惊人的。坦率地说,我什至不确定如何确定他们使用的是什么“类型”的表单 - AcroField
、XFA
还是其他?
非常感谢您的时间/帮助!
最佳答案
首先,抱歉我不再做vb.net了,但是你应该可以转换后面的代码。
您自己已经发现新表单是 XFA。有一种简单的非编程方式可以查看表单字段和数据。您注意到您升级了 Adobe Reader 的版本,所以我猜您正在使用 Reader DC。从菜单选项:
Edit => Form Options => Export Data...
将表单导出到您可以检查的 XML
文件。 XML 文件提示您需要相应的 XML 文档来填写表单,这与使用 AcroForm 完成的方式完全不同。
这里有一些简单的代码可以帮助您入门。首先是读取空白 XML 文档并更新它的方法:
public string FillXml(Dictionary<string, string> fields)
{
// XML_INFILE => physical path to XML file exported from I-9
XDocument xDoc = XDocument.Load(XML_INFILE);
foreach (var kvp in fields)
{
// handle multiple elements in I-9 form
var elements = xDoc.XPathSelectElements(
string.Format("//{0}", kvp.Key)
);
if (elements.Count() > 0)
{
foreach (var e in elements) { e.Value = kvp.Value; }
}
}
return xDoc.ToString();
}
现在我们有了创建有效 XML 的方法,用一些示例数据填充表单字段:
var fields = new Dictionary<string, string>()
{
{ "textFieldLastNameGlobal", "Doe" },
{ "textFieldFirstNameGlobal", "Jane" }
};
var filledXml = FillXml(fields);
using (var ms = new MemoryStream())
{
// PDF_READER => I-9 PdfReader instance
using (PDF_READER)
{
// I-9 has password security
PdfReader.unethicalreading = true;
// maintain usage rights on output file
using (var stamper = new PdfStamper(PDF_READER, ms, '\0', true))
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(filledXml);
stamper.AcroFields.Xfa.FillXfaForm(doc.DocumentElement);
}
}
File.WriteAllBytes(OUTFILE, ms.ToArray());
}
要回答您的最后一个问题,即如何确定表单“类型”,请像这样使用 PdfReader
实例:
PDF_READER.AcroFields.Xfa.XfaPresent
true
表示 XFA,false
表示 AcroForm。
关于xml - 自动填写 I-9 PDF XFA 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510154/
这是当前的问题:我有一个由第三方创建的 XFA 表单,我想按原样使用它。我能够通过以下方式生成带有填充字段的 PDF: a) Extracting the XML via Acrobat Pro b)
我在 iText/iTextSharp(iTextSharp 5.3.3 通过 NuGet)中遇到了一个非常奇怪的 XFA 表单问题。我正在尝试填写静态 XFA 样式的表单,但我的更改没有生效。 我有
从 PDF 表单中删除 XFA 格式是否会出现任何问题?我正在使用 PDFTK 填写表单,发现如果表单是 XFA,那么除非我先执行 drop_xfa 命令来创建新的模板表单,否则 PDFTK 不起作用
我想创建一个包含 XFA 数据的 PDF,但我不希望在查看 PDF 时看到 XFA 数据,但是,我希望可以通过以下代码访问它: ByteArrayOutputStream baos = new Byt
我正在尝试获取 XFA 表单中所有字段的简单列表。我正在使用这段代码: private void ListFieldNames() { string pdfTemplate = @"C:\Pr
我需要将预填充的 PDF/XFA 表单设置为只读(因为没有任何输入,例如文本、复选框、单选按钮等可以更改它们的值)。 对于常规的 AcroForms PDF 和静态 XFA 表单,我可以通过调用 se
工作流程是这样的: 我们下载模板表单,预填充静态值,导出 XML 模板 使用 .NET 表单应用解析 XML,添加动态值 需要将生成的 XML 导入回 PDF 模板 在 iTextSharp 上使用
我有一个不包含 XFA 数据的 PDF。我想做的是,创建一个 XFA 表单模板 以编程方式 (不是使用 Adobe LiveCycle 或类似程序),然后将其嵌入到 PDF 中,然后填写 XFA
我有一个 XFA 表单(在 Adobe Designer ES4 中编写),其中在字段上定义了更改事件处理程序。当表单呈现为 PDF 并在 Reader 中打开时,更改事件处理程序工作正常。 但是
我正在寻找一种将 PDF XFA 文件转换为普通 PDF 文件的方法,该文件可以通过 Imagemagick 或 Ghostscript 等进行处理和/或压缩。我发现的所有选项只是删除 XFA 标签,
我想在 LiveCycle Designer ES -2 中开发一个交互式 XFA 表单,它将支持 Windows 和 iPad。但问题是当我打开 XFA 表单时它不显示表单而是显示无法显示表单(如果
我有一个基于 XFA 的 pdf 表单,我们需要使用 java 来填充它。你能建议最好的方法吗?我能够使用 iText 为 pdf 生成 xfa xml。 public void readXfa(St
我在 LiveCycle ES2 中创建了一个动态表单,它试图从 Access 数据库中提取数据。连接已在“数据 View ”选项卡中以“SpecsIn”名称正确设置。我通过 Adobe 网站和其
我正在编写一个需要读取 XFA 和 AcroField 模板的 C# 应用程序。由于公司的规模和可能与应用程序相关的现有 PDF 文档的数量,选择一个并使用它是不可能的。 我目前正在使用 iTextS
我想用 PDFBox java 库填写 PDF 表单。PDF 表单是使用 Adobe Live Designer 创建的,因此它使用 XFA 格式。 我试图找到有关使用 PDFBox 填写 XFA
早上好。我希望有人可以帮助我解决这个问题。去年,我使用 iTextSharp 设置了一个 VB.NET 程序,用户可以在其中输入信息以填写 I9,该信息将填写 PDF 并打印。对于新的 I9,我遇到了
代码: using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open)) using (FileStream xml = ne
我假设我需要展平 XFA 表单以便在使用 Nuance 的 CSDK 的应用程序的 UI 上正确显示。当我现在处理它时,我收到一条通用消息“请稍候......如果这条消息最终没有被替换......”。
我想自动填写 AcroForm/XFA 双 PDF 表单。我包含了一个 XFA 数据集包,所有值都显示在 Adobe Reader 中。我将 AcroForms 条目中的 V= 键设置为新值,所有
我使用 Adobe LiveCycle Designer 创建了一个 PDF 表单。我现在正努力在填写完 PDF 后以编程方式从 PDF 中提取数据。 我尝试使用 poppler (qt4 绑定(
我是一名优秀的程序员,十分优秀!