由于混合AcroForm-XFA问题,在C#中使用itext7进行的AcroField更改无法提交/不可见

时间:2019-03-15 20:41:35

标签: c# adobe itext7 xfa acrofields

项目将以编程方式从数据库/ datagridview填充现有表单,并允许用户随后编辑表单,因为数据库未保存所有需要的值。

我能够获取值,并将其放入表格中

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

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

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

  1. why-dont-the-itext-7-form-field-values-print
  2. this awesome write up on XFA values
  3. This tutorial including .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,没有回复),所以谢谢您的任何见解!

0 个答案:

没有答案