iText7 将 HTML 转换为 PDF“System.NullReferenceException”。

Posted

技术标签:

【中文标题】iText7 将 HTML 转换为 PDF“System.NullReferenceException”。【英文标题】:iText7 convert HTML to PDF "System.NullReferenceException." 【发布时间】:2019-01-01 09:21:21 【问题描述】:

旧标题:iTextSharp 将 html 转换为 PDF“文档没有页面。”

我在 ASP.NET Core 2.1 中使用 iTextSharp 和 xmlworker 将 html 从视图转换为 PDF

我尝试了很多我在网上找到的代码sn-ps,但都产生异常:“文档没有页面。”

这是我当前的代码:

 public static byte[] ToPdf(string html)
 

        byte[] output;
        using (var document = new Document())
        
            using (var workStream = new MemoryStream())
            
                PdfWriter writer = PdfWriter.GetInstance(document, workStream);
                writer.CloseStream = false;
                document.Open();
                using (var reader = new StringReader(html))
                
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
                    document.Close();
                    output = workStream.ToArray();
                
            
        
        return output;
 

更新 1

感谢@Bruno Lowagie 的建议,我升级到了 iText7 和 pdfHTML ,但我找不到太多关于它的教程。

我试过这段代码:

 public static byte[] ToPdf(string html)
        
             html = "<html><head><title>Extremely Basic Title</title></head><body>Extremely Basic Content</body></html>";


            byte[] output;

            using (var workStream = new MemoryStream())
            using (var pdfWriter = new PdfWriter(workStream))
            
                using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
                
                    //Passes the document to a delegated function to perform some content, margin or page size manipulation
                    //pdfModifier(document);
                

                //Returns the written-to MemoryStream containing the PDF.   
                return workStream.ToArray();
            
        

但我得到 System.NullReferenceException: 当我调用 HtmlConverter.ConvertToDocument(html, pdfWriter)

我错过了什么吗?

更新 2

我尝试使用源代码进行调试。

这是堆栈跟踪

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=itext.io
  StackTrace:
   at iText.IO.Font.FontCache..cctor() in S:\Progetti\*****\itext7-dotnet-develop\itext\itext.io\itext\io\font\FontCache.cs:line 76

这是产生异常的代码:

static FontCache() 
            try 
                LoadRegistry();
                foreach (String font in registryNames.Get(FONTS_PROP)) 
                    allCidFonts.Put(font, ReadFontProperties(font));
                
            
            catch (Exception) 
            

registryNames count = 0 并且 .Get(FONTS_PROP) 抛出异常

更新 3

问题与某种缓存有关。我真的不明白是什么,但是正如您在代码中看到的那样,当他尝试从缓存加载字体时会生成异常。 我意识到在一个新项目中尝试了相同的代码并且它有效。

所以我清理了解决方案,删除了 bin、obj、.vs,杀死了 IIS Express,删除并重新安装了所有 nuget 包,然后再次运行,神奇地它工作了。

然后我只需要修复代码: 而不是 HtmlConverter.ConvertToDocument 只生成 15 字节的文档,我使用 HtmlConverter.ConvertToPdf 生成完整的 pdf。

完整代码如下:

public static byte[] ToPdf(string html)

    using (var workStream = new MemoryStream())
    
        using (var pdfWriter = new PdfWriter(workStream))
                            
            HtmlConverter.ConvertToPdf(html, pdfWriter);
            return workStream.ToArray();
        
    

【问题讨论】:

您是否阅读过 Stack Overflow 上的这个问答:Converting HTML to PDF with iText?两年前,当我们发布 iText 7 以替换 iText 5 时,名称“iTextSharp”已更改为“iText for .NET”。您应该丢弃您的代码并重新开始使用 iText 7 for .NET 和 pdfHTML add-on。不要期望对旧的 iText 5 和 XML Worker 有太多帮助。 请包含堆栈跟踪。 可能是因为您的 .NET Core 版本? iText 支持.NET Standard 1.6, which is .NET Core 1.0。 【参考方案1】:

我也遇到了这个错误,但注意到它只是在第一次尝试加载 SvgConverter 时出现的。所以我把这个添加到我的班级顶部,它似乎已经 fixed 隐藏了这个错误。

using iText.Kernel.Pdf;
using iText.IO.Font;
public class PdfBuilder 

    static PdfBuilder() 
        try 
            FontCache.GetRegistryNames();
        
        catch(Exception) 
            // ignored... this forces the FontCache to initialize
        
    
    ...

【讨论】:

【参考方案2】:

我遇到了同样的问题,并且在一直挖掘到 iText7 的 FontCache 对象并尝试从原始 TTF 文件创建我的 OWN FontProgram 以使用时出现错误(该文件也因相同的空引用错误而失败) ,我终于“解决”了我的问题。

显然 iText 有一些内部错误/异常,它们只是一种“跳过”和“推过去”,因为我偶然意识到我在 Visual Studios 中禁用了“仅启用我的代码”,所以我的系统是尝试调试 iText7 的代码以及我的代码。当我在 Visual Studio 设置中重新启用它时(工具 > 选项 > 调试 > 常规 > 启用我的代码复选框),问题就神奇地消失了。

所以我花了四个小时试图解决他们代码中的问题,但他们显然找到了一些解决方法,并且即使在空引用失败的情况下也可以通过该方法。

我的转换为 PDF 功能现在可以正常工作了。

【讨论】:

这是正确的解决方法。我在 8 个月前开发了控制台应用程序,它在阅读 PDF 时突然停止工作并抛出类似的异常。但奇怪的是,这解决了问题 - 我想知道发生了什么以及 VS 中的某些设置如何影响我们使用 iTextCore 开发的代码!感谢您的解决方法,否则我可能会花费数小时寻找解决方法,并且可能会切换到另一个付费 PDF 阅读器库:)

以上是关于iText7 将 HTML 转换为 PDF“System.NullReferenceException”。的主要内容,如果未能解决你的问题,请参考以下文章

Itext7 HtmlConverter不显示gif

iText7高级教程之html2pdf——6.在pdfHTML中使用字体

iText7高级教程之html2pdf——6.在pdfHTML中使用字体

iText7高级教程之html2pdf——0.引言

iText7:合并两个pdf时文件指针出错

项目结构iText7