iText7将HTML转换为PDF“;System.NullReferenceException;

iText7将HTML转换为PDF“;System.NullReferenceException;,pdf,.net-core,itext,itext7,xmlworker,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

旧标题: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();
            }
        }
这是生成异常的代码:

static FontCache() {
            try {
                LoadRegistry();
                foreach (String font in registryNames.Get(FONTS_PROP)) {
                    allCidFonts.Put(font, ReadFontProperties(font));
                }
            }
            catch (Exception) {
            }
registryNames count=0,并且.Get(FONTS\u PROP)引发异常

更新3

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

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

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

以下是完整的代码:

public static byte[] ToPdf(string html)
{
    using (var workStream = new MemoryStream())
    {
        using (var pdfWriter = new PdfWriter(workStream))
        {                    
            HtmlConverter.ConvertToPdf(html, pdfWriter);
            return workStream.ToArray();
        }
    }
}

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

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

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


我的转换为PDF函数现在运行正常。

您是否阅读了有关堆栈溢出的问题和答案:?两年前,当我们发布iText 7以取代iText 5时,“iTextSharp”的名称被改为“iText for.NET”。你应该扔掉你的代码,用和重新开始。不要期望在旧的iText 5和XML Worker上有太多帮助。请包括堆栈跟踪。可能是因为您的.NET核心版本?iText支持。
public static byte[] ToPdf(string html)
{
    using (var workStream = new MemoryStream())
    {
        using (var pdfWriter = new PdfWriter(workStream))
        {                    
            HtmlConverter.ConvertToPdf(html, pdfWriter);
            return workStream.ToArray();
        }
    }
}