首页 > 解决方案 > 由于混合 AcroForm-XFA 问题,在 C# 中使用 itext7 进行的 AcroField 更改未提交/不可见

问题描述

项目是从数据库/datagridview 以编程方式填充现有表单,并允许用户在之后编辑表单,因为数据库不包含所需的所有值。

我能够获取这些值,并将它们放入表单中:

  1. 查看表单时,使用 AcroForms 设置的值不会显示/打印。
  2. 查看表单时不显示背景颜色更改。

单击该字段时会出现这两个更改。

我知道这是由混合 XFA 和 AcroForms 问题引起的,并且 pdfXFA 是 itext 库的付费扩展。pdfXFA 仅用于展平 XFA,我不需要这样做,因为我需要这些字段继续可编辑。我已经尝试过以下提出的解决方案:

  1. 为什么不使用 itext-7-form-field-values-print
  2. 这篇关于 XFA 值的精彩文章
  3. 本教程包括 .RemoveXfaForm()

其他解决方案都引用了 .RemoveXfaForm() ,它应该删除所有 XFA 格式,但似乎没有按预期工作。使用 GetXFA 发现即使在调用 .RemoveXfaForm() 后它仍然存在。

我尝试将 form.SetNeedAppearances(true) 和 form.RemoveXfaForm() 移动到设置值之前,以及在 pdf.close() 事件之前设置值之后。我觉得我只是在这里遗漏了一些非常简单的东西,可以使用一些帮助:

public virtual void ManipulatePdf(string src, string dst, DataGridViewRow dataRow)
    {
        //Initialize PDF document
        PdfDocument pdf = new PdfDocument(new PdfReader(src), new PdfWriter(dst));
        PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);
        //form.RemoveXfaForm();
        //form.SetNeedAppearances(true);
        IDictionary<String, PdfFormField> fields = form.GetFormFields();
        PdfFormField toSet;

        //visits each field, fills dependant on whether dgv column exists
        foreach (string field in fields.Keys){
            switch (dataGridView1.Columns.Contains(field))
            {
                case false:
                    if (field == "Date")
                    {
                        fields.TryGetValue(field, out toSet);
                        //this value is visible
                        toSet.SetValue(dateTime.ToString("D"));
                    }
                    else
                    {
                        fields.TryGetValue(field, out toSet);
                        //this setting does not commit, issue with hybrid XFA/AcroForm
                        toSet.SetValue("0").SetBackgroundColor(ColorConstants.YELLOW);
                    }
                    break;

                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 visable on finished form
                        toSet.SetValue(value);
                    }
                    break;

                default:
                    break;
            }
        }
        //form.RemoveXfaForm();
        pdf.Close();
    }

我已经在多种组合中尝试了注释掉的建议,此时真的只需要找出我是否可以让它工作或开始寻找另一个解决方案,(我已经通过电子邮件发送了 itext,没有回复)所以谢谢你的任何见解!

标签: c#adobeitext7xfaacrofields

解决方案


推荐阅读