使用iText.Html2pdf在C#生成PDF时遇NullReferenceException求助
解决HtmlConverter.ConvertToDocument空引用异常问题
可能的异常诱因
- 字体提供器初始化参数错误:你使用
new DefaultFontProvider(false, false, false),意味着既不加载iText内置标准字体,也不加载系统字体,仅依赖手动添加的字体目录。若目录字体未被正确识别,或HTML中使用的字体无法匹配,会触发内部空引用。 - Document对象生命周期处理不当:用
using包裹ConvertToDocument返回的Document,可能提前释放关联资源,导致写入流时出现异常。 - 输入参数未校验:未判断传入的
html是否为空,空字符串会导致后续转换逻辑出错。
修正后的代码
public static Byte[] CreatePdf(string html) { if (string.IsNullOrEmpty(html)) throw new ArgumentNullException(nameof(html)); using (var ms = new MemoryStream()) { var converterProperties = new ConverterProperties(); // 加载标准字体+系统字体,再补充自定义字体目录作为兜底 var fontProvider = new iText.Html2pdf.Resolver.Font.DefaultFontProvider(true, true, true); fontProvider.AddDirectory(@"C:\Windows\Fonts\"); converterProperties.SetFontProvider(fontProvider); using (var pdfWriter = new iText.Kernel.Pdf.PdfWriter(ms)) { pdfWriter.SetCloseStream(false); // 避免用using包裹Document,手动关闭确保内容写入流 var document = HtmlConverter.ConvertToDocument(html, pdfWriter, converterProperties); document.Close(); } ms.Position = 0; return ms.ToArray(); } }
关键修正说明
- 调整字体提供器参数:将三个参数改为
true,确保基础字体库加载完成,避免因字体缺失引发内部空引用,自定义目录字体作为补充。 - 修改Document管理方式:移除
using包裹,手动调用document.Close(),确保文档内容完整写入内存流后再释放资源。 - 增加输入校验:提前拦截空HTML输入,避免无效转换操作。
内容的提问来源于stack exchange,提问作者livisghton araujo
相关产品推荐
相关产品推荐

