0

TLDR;IText 解决方案存在以下问题,并且没有找到“更好”的选项。

Project 目前正在寻找以编程方式从数据库中填写表单的最佳方法。经过大量研究后,我发现了一些基于以下标准的解决方案,并创建了一个(有点工作的)解决方案:

  • 我们目前正在使用 Access,但在未来几个月内将转向 SQL。
  • 填写由国家机构根据用户输入创建的多个独特表格。(所以我们不能只创建自己的表单。)
  • 各机构会定期更新表格,但所需数据保持不变,并将存储在数据库中。

为了解决这个问题,我研究了IText之类的东西,它有大量的 PDF 操作工具,其中一小部分是它可以使用 AcroField 技术填写表格。

我还在这里阅读了许多资源,包括:

  • 这个关于使用 AcroFields 和 IText 填写表格的描述
  • 这个使用 Docotic 的旧解决方案
  • 这个更旧的 Java 解决方案

    在许多其他资源中。我发现 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(); }

该解决方案确实填写了表格,但是我无法解决一些非常大的问题:

  1. 更改并不总是提交到表单(例如 .backgroundcolor)/将显示为空,直到用户单击表单框。
  2. 值将打印,但表单框更改(例如 .backgroundcolor)也会打印。
  3. 这些表单有多余的字段,AcroForm 似乎有来自 Adob​​e 的父/子字段名称的问题。(例如,它将重命名任何类似的字段)
  4. Itext7 没有用于 C# 的 API,我一直无法解决这些问题。

任何帮助、文章或见解都将不胜感激,我知道“开放式”问题在这里没有得到太多帮助,但不得不尝试。谢谢你。

4

0 回答 0