27

我想在预制的 PDF 文档中填写表单域,但在运行 AcroForm 时收到 Null Refrence 错误。

 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,因为由于许可而无法使用)。

任何帮助都是极好的!

4

6 回答 6

30

如果您尝试填充 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
于 2012-08-28T11:47:41.050 回答
7

我今天一直在研究这个问题,并设法创建了一个可行的解决方案。我在下面粘贴了我的工作代码。我可以看到我的代码和 OP 之间的唯一真正区别如下:

  • 我包含了 Marc Ferree 的代码来设置NeedAppearances(+1 非常感谢!!)
  • 我使用String变量设置字段的Text属性,而不是使用PdfString设置Value属性。

希望这对尝试做同样事情的人有用。

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.
于 2013-02-26T18:34:33.360 回答
6

我刚刚经历过类似的事情。我打开的第一个 pdf 文件不包含 acroform 数据并导致如上所述的空异常。问题不在于打开 pdf,而是对值为 null 的 Acroform 成员变量的引用。您可以使用以下代码示例测试您的 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");
        }
    }

附录

我还注意到这行代码中的键不应该有尖括号

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

将其更改为

document.AcroForm.Fields["CASENUM"]
于 2011-07-12T23:08:53.937 回答
4

我今天早些时候遇到了同样的问题。但是,我认为源代码已经更新,所以如果你尝试上面的方法,你会得到一个 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();

于 2019-10-10T01:27:27.443 回答
1

解决这个问题的解决方案NullReferenceException是使用 Adob​​e Acrobat 打开您的预制 PDF,并通过将表单字段的属性类型更改为null.

于 2012-09-19T08:39:17.083 回答
0

当您尝试打开它时,您是否尝试过将当前目录放入其中?

改变

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

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

我很确定 PdfReader 需要完整的文件路径,尽管我只使用ASPOSE来创建 pdf。

于 2011-06-05T02:13:58.807 回答