You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:35:58