【问题标题】:PDFSharp filling in form fieldsPDFSharp 填写表单域
【发布时间】:2011-09-08 14:16:31
【问题描述】:

我想在预制的 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["&lt;CASENUM&gt;"]); 是错误发生的地方。似乎 AcroForm 甚至无法识别这些字段。

另一种选择是在 PDF 中查找和替换文本(不使用 itextsharp,因为由于许可而无法使用)。

任何帮助都会很棒!

【问题讨论】:

    标签: c# pdf pdfsharp


    【解决方案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
    

    【讨论】:

    • 很好的提示!非常感谢,我到处都在寻找这个
    • 对于懒惰的人,在 C# 中是这样的: if (doc.AcroForm.Elements.ContainsKey("/NeedAppearances") == false) doc.AcroForm.Elements.Add("/NeedAppearances", new PdfBoolean(true)); else doc.AcroForm.Elements["/NeedAppearances"] = new PdfBoolean(true);
    【解决方案2】:

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

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

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

    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.
    

    【讨论】:

      【解决方案3】:

      我刚刚经历了类似的事情。我打开的第一个 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"]
      

      【讨论】:

      • 我试过你的代码,它确实返回“成功”。但是由于某种原因,我仍然遇到了 null ref 问题。你做了什么让你的工作?
      • 我在我的解决方案中添加了一个小更新,但我不相信这会导致您所说的发生的行出现空引用错误。PDFSharp 下载中有一个示例,但没有在线。
      • 我放弃并使用了 iTextSharp(暂时)我目前正在研究一个使用 XDP 文件来处理表单填充的 hack,可以在这里阅读:stackoverflow.com/questions/1757397/…
      • 我删除了尖括号,同样的事情。在查看了我在currentField.Value = caseNamePdfStr; 上实际写的内容后,它会引发 Null Ref 错误
      • 在这种情况下,问题是 currentField 为空。当您尝试获取价值时,程序会告诉您它找不到价值,因为它不存在。您的 pdf 中的字段名称可能不是“CASENUM”。请注意,这将区分大小写
      【解决方案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();
      
      

      【讨论】:

        【解决方案5】:

        克服NullReferenceException 的解决方案是打开您的预制 PDF 与 Adob​​e Acrobat 并通过将其属性类型更改为 null 以外的其他内容为您的表单字段提供默认值。

        【讨论】:

          【解决方案6】:

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

          改变

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

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

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

          【讨论】:

          • textBox4.text 是主路径(textBox4.Text + "\\", fileN4)。我也尝试过粘贴路径以进行测试。同样的事情。
          • Point 仍然存在。您正在将文件从一个路径复制到另一个路径,并且这些路径都不匹配您尝试打开的路径。你有没有在调试模式下进入它并检查它是否真的在正确的位置寻找文件?据我了解,当找不到文件时会发生空引用。
          • 我也尝试了您的代码并检查了调试。仍然是同样的事情,它正在查看正确的目录和文件名。还尝试将您的代码更改为以下内容: PdfDocument document = PdfReader.Open(Path.Combine("C:\\Temp\\", fileN4), PdfDocumentOpenMode.Modify);
          • 不知道那是什么。可能是文件问题或权限问题。表单文件是否使用用户名/密码锁定,该文件夹是否允许 .net 读取/写入该文件夹?
          • 它不应该被锁定。该文件是通过将两个文档合二为一并保存而在代码中创建的。那行得通。但是从保存点重新打开或编辑会导致 Null Reference 出现问题。
          猜你喜欢
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 1970-01-01
          • 2015-04-10
          • 2017-05-28
          • 1970-01-01
          相关资源
          最近更新 更多