PDFSharp填充表单字段
本文关键字:字段 表单 填充 PDFSharp | 更新日期: 2023-09-27 17:58:28
我想在预制PDF文档中填写表单字段,但运行AcroForm时收到Null Refence错误。
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,因为许可证原因无法使用)。
任何帮助都会很棒!
如果您试图填充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
我今天一直在处理这个问题,并设法创建了一个有效的解决方案。我已经在下面粘贴了我的工作代码。我能看到的代码和OP之间唯一真正的区别是:
- 我包含了Marc Ferree的代码来设置NeedAppearances(+1和非常感谢!!)
- 我使用String变量设置字段的Text属性,而不是使用PdfStringValue属性
希望这对尝试做同样事情的人有用。
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.
今天早些时候我遇到了同样的问题。但是,我认为源代码有吗?更新,所以如果你尝试上面的方法,你会得到一个NullExceptionError。相反,对于TextField,您需要生成一个PdfString并使用testfield。值而不是.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();
我刚刚经历了类似的事情。我打开的第一个pdf文件不包含acroform数据,并导致了如上所述的null异常。问题不在于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");
}
}
ADENDUM
我还注意到这行代码中的密钥不应该有角括号
document.AcroForm.Fields["<CASENUM>"]
将其更改为
document.AcroForm.Fields["CASENUM"]
克服NullReferenceException
的解决方案是打开预先制作的PDF和Adobe Acrobat,并通过将表单字段的属性类型更改为null
以外的其他类型,为表单字段提供默认值。
打开当前目录时,您是否尝试将其放入?
更改
PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);
至
PdfDocument document = PdfReader.Open(Path.Combine(Directory.GetCurrentDirectory(), fileN4), PdfDocumentOpenMode.Modify);
我很确定PdfReader需要一个完整的文件路径,尽管我只使用ASPOSE创建pdf。