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

时间:2018-07-24 16:54:22

标签: pdf .net-core itext itext7 xmlworker

  

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

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

我尝试了许多在网上找到的代码段,但所有代码段均产生异常:“文档无页面。”

这是我当前的代码:

 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计数= 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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

Settings in Visual Studio

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

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