PDFSharp заполнение полей формы

Я хотел бы заполнить поля формы в допечатном PDF-документе, но при запуске я получаю ошибку Null Refrence с AcroForm.

 string fileN4 = TextBox1.Text + " LOG.pdf";

  File.Copy(Path.Combine(textBox4.Text + "\\", fileN4),
               Path.Combine(Directory.GetCurrentDirectory(), fileN4), true);

  // Open the file
  PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);

  PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]);
  //const 
        string caseName = TextBox1.Text;
  PdfString caseNamePdfStr = new PdfString(caseName);

  //set the value of this field
  currentField.Value = caseNamePdfStr;


  // Save the document...
  document.Save(fileN4);

Итак, PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]); - это ошибка. Это швы, что AcroForm даже не распознает поля.

Другим вариантом будет поиск и замена текста в PDF (без использования itextsharp, поскольку он не может использоваться из-за лицензирования).

Любая помощь будет потрясающей!

Ответы

Ответ 1

Вам также понадобится это, если вы пытаетесь заполнить поля формы PDF, вам также необходимо установить для элемента NeedsAppearances значение true. В противном случае PDF "скроет" значения в форме. Вот код VB.

If objPdfSharpDocument.AcroForm.Elements.ContainsKey("/NeedAppearances") = False Then
    objPdfSharpDocument.AcroForm.Elements.Add("/NeedAppearances", New PdfSharp.Pdf.PdfBoolean(True))
Else
    objPdfSharpDocument.AcroForm.Elements("/NeedAppearances") = New PdfSharp.Pdf.PdfBoolean(True)
End If

Ответ 2

Я только что испытал нечто подобное этому. Первый файл PDF, который я открыл, не содержал данных acroform и привел к нулевому исключению, как описано выше. Проблема заключается не в открытии pdf, а в ссылке на переменную-член Acroform, имеющую значение null. Вы можете протестировать свой pdf файл, используя следующий пример кода:

    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        PdfDocument _document = null;
        try
        {
            _document = PdfReader.Open(ofd.FileName, PdfDocumentOpenMode.Modify);
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message,"FATAL");
            //do any cleanup and return
            return;
        }

        if (_document != null)
        {
            if (_document.AcroForm != null)
            {
                MessageBox.Show("Acroform is object","SUCCEEDED");
                //pass acroform to some function for processing
                _document.Save(@"C:\temp\newcopy.pdf");
            }
            else
            {
                MessageBox.Show("Acroform is null","FAILED");
            }
        }
        else
        {
            MessageBox.Show("Uknown error opening document","FAILED");
        }
    }

ADENDUM

Я также заметил, что ключ в этой строке кода не должен иметь угловых скобок

document.AcroForm.Fields["<CASENUM>"]

Измените его на

document.AcroForm.Fields["CASENUM"]

Ответ 3

Я работаю над этим сегодня, и мне удалось создать рабочее решение. Я наклеил свой рабочий код ниже. Единственные реальные различия, которые я вижу между моим кодом и OP, следующие:

  • Я включил код Marc Ferree, чтобы установить NeedAppearances (+1 и много спасибо!!)
  • Я установил свойство Text этого поля, используя переменную String, а не свойство Value, используя PdfString.

Надеюсь, это будет полезно для тех, кто пытается сделать то же самое.

string templateDocPath = Server.MapPath("~/Documents/MyTemplate.pdf");
PdfDocument myTemplate = PdfReader.Open(templateDocPath, PdfDocumentOpenMode.Modify);
PdfAcroForm form = myTemplate.AcroForm;

if (form.Elements.ContainsKey("/NeedAppearances"))
{
    form.Elements["/NeedAppearances"] = new PdfSharp.Pdf.PdfBoolean(true);
}
else
{
    form.Elements.Add("/NeedAppearances", new PdfSharp.Pdf.PdfBoolean(true));
}

PdfTextField testField = (PdfTextField)(form.Fields["TestField"]);
testField.Text = "012345";

myTemplate.Save(Server.MapPath("~/Documents/Amended.pdf"));  // Save to new file.

Ответ 4

Решение для преодоления NullReferenceException состоит в том, чтобы открыть готовый PDF с Adobe Acrobat и присвойте полям формы значение по умолчанию, изменив свой тип свойства на то, чтобы быть чем-то иным, чем null.

Ответ 5

Вы пытались помещать текущий каталог при попытке его открыть?

Изменить

PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);

к

PdfDocument document = PdfReader.Open(Path.Combine(Directory.GetCurrentDirectory(), fileN4), PdfDocumentOpenMode.Modify);

Я уверен, что для PdfReader потребуется полный путь к файлу, хотя я использую ASPOSE для создания PDF.

Ответ 6

Я застрял с этой же проблемой ранее сегодня. Тем не менее, я думаю, что исходный код обновился, поэтому, если вы попробуете описанный выше метод, вы получите NullExceptionError. Вместо этого для TextField вам нужно сгенерировать PdfString и использовать testfield.Value вместо .text. Вот пример.

      static PdfAccess()
        {
            Pdf.PdfDocument doc = Pdf.IO.PdfReader.Open(@"C:\...\ Contract.pdf", Pdf.IO.PdfDocumentOpenMode.Modify);
            Pdf.AcroForms.PdfAcroForm form = doc.AcroForm;

            if (form.Elements.ContainsKey("/NeedAppearances"))
            {
                form.Elements["/NeedAppearances"] = new PdfSharp.Pdf.PdfBoolean(true);
            }
            else
            {
                form.Elements.Add("/NeedAppearances", new PdfSharp.Pdf.PdfBoolean(true));
            }

           var name = (Pdf.AcroForms.PdfTextField)(form.Fields["Email"]);
           name.Value = new Pdf.PdfString("ramiboy");


            doc.Save(@"C:\...\ Contract.pdf");
            doc.Close();