Изменения AcroField, сделанные с помощью itext7 в C #, не фиксируются / не отображаются из-за проблем с AcroForm-XFA - PullRequest
1 голос
/ 15 марта 2019

Проект состоит в том, чтобы заполнить существующие формы программным способом из базы данных / таблицы данных и позволить пользователю впоследствии редактировать формы, поскольку база данных не содержит все необходимые значения.

Я могу получить значения и поместить их в форму, однако:

  1. Значения, установленные с помощью AcroForms, не отображаются / печатаются при просмотре формы.
  2. Изменение цвета фона не отображается при просмотре формы.

Оба изменения появляются при нажатии на поле.

Я понимаю, что это вызвано гибридными проблемами XFA и AcroForms, и что pdfXFA является платным расширением для библиотеки itext.PdfXFA работает только для выравнивания XFA, и мне не нужно этого делать, поскольку мне нужно, чтобы поля оставались редактируемыми.Я уже пробовал решения, предложенные следующим образом:

  1. Why-Dont-the-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();
    }

Я попробовал закомментированные рекомендации в нескольких комбинациях, и на данный момент действительно просто нужно выяснить, могу ли я получитьэто сработает или начните искать другое решение (я уже отправил письмо по электронной почте, ответа нет), так что спасибо за любые идеи!

...