如何解决.Net Core 3.1类库中的调用iText7 PdfAcroForm.GetAcroForm时,空引用异常
我正在将应用程序转换为.Net Core 3.1,在类库中,我从现有模板生成PDF表单,然后用数据填充该表单。在IText7的前身ITextSharp中,PdfAcroForm静态方法“ .GetAcroForm()”可以很好地工作,但是在当前版本的iText7(7.1.12)中,将引发Null引用异常。我已尽我所能阅读了该文档,但不确定如何继续。任何建议将不胜感激。
注意:模板路径已存在,新文档显示已正确填充该模板路径,并且无法“新建” PdfAcroForm,您需要使用静态.GetAcroForm()方法。
空检查将不能解决此问题,因为该对象永远不能为空。文档指出,如果参数“ createNotExist”设置为true,则.GetAcroForm()方法将创建一个新表单。
我已经研究并在iText GitHub上找到了一个问题,该问题表明该问题大约在一年前被“修复”:https://github.com/itext/itext7/pull/44#issue-351612749
以下是准备表格的方法:
public string DocumentGenerator(string templatePath,FormFieldSet[] formFieldSet,bool useSpecailOutputPath)
{
if(!File.Exists(templatePath))
{
throw new Exception("The template file provided does not exist: MC-071(iText)");
}
string newFile = useSpecailOutputPath ?
m_SpecialOutputPath :
Path.GetTempPath() + Guid.NewGuid().ToString() + ".pdf";
try
{
PdfDocument newDocument = new PdfDocument(new PdfReader(templatePath),new PdfWriter(newFile));
PdfAcroForm acroForm = PdfAcroForm.GetAcroForm(newDocument,true); // <=== Exception Thrown Here
foreach (FormFieldSet fs in formFieldSet)
{
acroForm.GetField(fs.FieldName).SetValue(fs.FillValue);
}
// Sets form flattening
acroForm.FlattenFields();
// Closes and writes the form
newDocument.Close();
return newFile;
}
catch { return string.Empty; };
}
任何建议将不胜感激
解决方法
只是对寻找此问题的任何人的更新。这是一个已知问题,已在当前开发分支中修复。您可以绕过Visual Studio中的异常,直到对其进行纠正为止。这对功能没有负面影响,并且是原始iText7源中的返回错误放置的结果。
,我也遇到了同样的问题,经过一路深挖到iText7的内部对象和方法,我终于“解决”了我的问题。
显然 iText 有一些内部错误/异常,它们只是“跳过”和“推过去”,因为我偶然意识到我在 Visual Studios 中禁用了“仅启用我的代码”,所以我的系统是试图调试 iText7 的代码以及我的代码。在我的 Visual Studio 设置(工具 > 选项 > 调试 > 常规 > 启用仅我的代码复选框)中重新启用它的那一刻,问题神奇地消失了。
所以我花了四个小时试图解决他们代码中的问题,但他们显然找到了一些解决方法,即使在空引用失败的情况下也能通过该方法。
我的转换为 PDF 功能现在工作正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。