【问题标题】:iText7 convert HTML to PDF "System.NullReferenceException."iText7 将 HTML 转换为 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();
        }
    }
}

【问题讨论】:

标签: pdf .net-core itext itext7 xmlworker


【解决方案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 阅读器库:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2018-08-13
    • 2019-08-26
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多