TLDR;IText 解决方案存在以下问题,并且没有找到“更好”的选项。
Project 目前正在寻找以编程方式从数据库中填写表单的最佳方法。经过大量研究后,我发现了一些基于以下标准的解决方案,并创建了一个(有点工作的)解决方案:
- 我们目前正在使用 Access,但在未来几个月内将转向 SQL。
- 填写由国家机构根据用户输入创建的多个独特表格。(所以我们不能只创建自己的表单。)
- 各机构会定期更新表格,但所需数据保持不变,并将存储在数据库中。
为了解决这个问题,我研究了IText之类的东西,它有大量的 PDF 操作工具,其中一小部分是它可以使用 AcroField 技术填写表格。
我还在这里阅读了许多资源,包括:
- 这个关于使用 AcroFields 和 IText 填写表格的描述
- 这个使用 Docotic 的旧解决方案
-
在许多其他资源中。我发现 IText 似乎是最好的支持一些示例和 API 帮助我创建以下内容:
//创建表单 公共虚拟 void ManipulatePdf(字符串 src,字符串 dst,DataGridViewRow 数据行) { //初始化PDF文档 PdfDocument pdf = new PdfDocument(new PdfReader(src), new PdfWriter(dst)); PdfAcroForm 表格 = PdfAcroForm.GetAcroForm(pdf, true); //form.RemoveXfaForm(); //form.SetNeedAppearances(true); IDictionary fields = form.GetFormFields(); PdfFormField toSet; //访问每个字段,根据dgv列是否存在填充 foreach(fields.Keys 中的字符串字段) { 开关(dataGridView1.Columns.Contains(字段)) { 案例错误: 开关(场) { 案例“日期”: fields.TryGetValue(field, out toSet); toSet.SetValue(dateTime.ToString("MM/dd/yy")); 休息; 案例“Period_YY”: fields.TryGetValue(field, out toSet); toSet.SetValue(dateTime.ToString("yy")); 休息; 案例“Period_YY2”: fields.TryGetValue(field, out toSet); toSet.SetValue(dateTime.ToString("yy")); 休息; 案例“Period_Month_Start”: fields.TryGetValue(field, out toSet); toSet.SetValue(dateTime.AddMonths(-1).ToString("MMMM")); 休息; 案例“Client_Name2”: fields.TryGetValue(field, out toSet); toSet.SetValue(dataRow.Cells["Client_Name"].Value.ToString()); 休息; 默认: fields.TryGetValue(field, out toSet); toSet.SetValue("0"); //此设置不提交,混合 XFA/AcroForm 问题 //.SetBackgroundColor(ColorConstants.YELLOW); 休息; } 休息;
case true: if (dataRow.Cells[field].Value != null && !DBNull.Value.Equals(dataRow.Cells[field].Value)) { string value = dataRow.Cells[field].Value.ToString(); fields.TryGetValue(field, out toSet); //this value is sometimes not visable on finished form toSet.SetValue(value); } break; default: break; } } //form.RemoveXfaForm(); //pdf.GetCatalog().Remove(PdfName.Perms); //form.FlattenFields(); pdf.Close(); }
该解决方案确实填写了表格,但是我无法解决一些非常大的问题:
- 更改并不总是提交到表单(例如 .backgroundcolor)/将显示为空,直到用户单击表单框。
- 值将打印,但表单框更改(例如 .backgroundcolor)也会打印。
- 这些表单有多余的字段,AcroForm 似乎有来自 Adobe 的父/子字段名称的问题。(例如,它将重命名任何类似的字段)
- Itext7 没有用于 C# 的 API,我一直无法解决这些问题。
任何帮助、文章或见解都将不胜感激,我知道“开放式”问题在这里没有得到太多帮助,但不得不尝试。谢谢你。