当前位置: 首页 > 知识库问答 >
问题:

调用iText7 PdfAcroForm时出现空引用异常。GetAcroForm()在中。Net Core 3.1类库

白星渊
2023-03-14

我正在将一个应用程序转换为。Net Core 3.1,在我的类库中,我从现有模板生成一个PDF表单,并用数据填充该表单。在IText7的前身ITextSharp中,PdfAcroForm静态方法“.GetAcroForm()”工作得很好,但在当前版本的IText7(7.1.12)中,会引发空引用异常。我已经尽我所能地遵循文档,但我不确定如何继续。如有任何建议,将不胜感激。

注意:模板路径存在,新文档显示它已正确填写,并且不可能“新建”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; }; 
        }

如有任何建议,将不胜感激

共有2个答案

仇浩旷
2023-03-14

我也遇到了同样的问题,在深入挖掘iText7的内部对象和方法之后,我终于“解决”了我的问题。

显然,iText有一些内部错误/异常,它们只是“跳过”和“推过去”,因为我意外地意识到我在Visual Studio中禁用了“仅启用我的代码”,所以我的系统试图调试iText7的代码以及我的代码。我在Visual Studio设置(工具)中重新启用它的那一刻

所以我花了四个小时试图解决他们代码中的一个问题,但是他们显然找到了一些方法来解决这个问题,并且无论如何都要通过这个方法,即使是在空引用失败的情况下。

我的转换为PDF功能现在运行良好。

姜鸿
2023-03-14

这只是一个更新给任何人寻找这个问题。这是一个已知的问题,在当前的开发分支中已修复。在更正异常之前,可以安全地绕过visual studio中的异常。这对功能没有负面影响,是原始iText7源中错误返回的结果。

 类似资料:
  • 这是我的客户端代码 这是我的Rest控制器代码: 如果我在调用后使用 String.class 作为返回类型,则相同的代码也有效。但不是响应实体类。我做错了什么,如果我需要客户端也相同的响应实体

  • 但是,该方法(authContext.AcquireTokenAsync)与其他参数(如客户端id等)很好地配合使用,如下所示。result=await authContext.AcquireTokenSilentAsync(ResourceId,clientId); UWP是否对具有ClientCredential(clientid,key)的AuthContext.AcquireTokenSi

  • 我试图在运行在Android中的SubscriptionClient实例上调用RegisterMessageHandler方法。 在将消息发布到特定主题(通过自动测试)20秒左右之后,我在我的Android应用程序中收到了几个超时异常,该应用程序实际上包含了SubscriptionClient实例的RegisterMessageHandler。 输出窗口 这里有个错误: **System.Time

  • > 单击 受保护得空onPrepareDialog(int id,Dialog Dialog) 受保护的对话框onCreateDialog(int id) 如果我对timepickerdialog代码做了什么错误,请告诉我。

  • 我正在尝试添加一个网络安全配置文件到一个Android应用程序构建的Xamarin工具。(Xamarin表格版本2.5.1.527436)。 我遵循了本文中的步骤:https://devblogs.microsoft.com/xamarin/cleartext-http-android-network-security/ 但是,在启动时,对Xamarin.Forms.Platform.Androi

  • 问题内容: MyClass.java: 编译MyClass.java文件的SimpleCompileTest.java的清单。 SimpleCompileTest.java: 我正在执行SimpleCompileTest类并获取NullPointerException。ToolProvider.getSystemJavaCompiler()返回null。有人可以告诉我代码有什么问题吗 问题答案: