当前位置: 首页 > 知识库问答 >
问题:

iText7将超文本标记语言转换为PDF"System. Null参考异常"。

钱修雅
2023-03-14

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

我正在使用iTextSharp和xmlworker在ASP中将html从视图转换为PDF。净核心2.1

我尝试了网上找到的许多代码片段,但都生成了一个异常:“文档没有页面。”

以下是我目前的代码:

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

但我了解这个系统。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(字体)抛出异常

更新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();
        }
    }
}

共有2个答案

汪跃
2023-03-14

我也遇到了这个错误,但注意到它只是在SvgConverter的第一次尝试加载时出现的。所以我在班上的第一名加上了这个,它似乎 固定的 隐藏了漏洞。

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
        }
    }
    ...
}
闻安宜
2023-03-14

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

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

所以我花了四个小时试图解决他们代码中的一个问题,但是他们显然找到了一些方法来解决这个问题,并且无论如何都要通过这个方法,即使是在空引用失败的情况下。

我的转换为PDF功能现在运行良好。

 类似资料:
  • 我之所以发布这个问题,是因为许多开发人员或多或少地以不同的形式问同一个问题。我会自己回答这个问题(我是iText Group的创始人/首席技术官),这样它就可以成为“维基答案”如果堆栈溢出的“文档”特性仍然存在,那么这将是文档主题的一个很好的候选者。 我正在尝试将以下HTML文件转换为PDF: 在浏览器中,这种超文本标记语言如下所示: HTMLWorker根本不考虑CSS 当我使用时,我需要创建一

  • 我们有一个基于Java的系统,它从数据库中读取数据,用预设的标记合并单个数据字段,并用将结果转换为。 在格式中,它看起来像这样: 现在我正在寻找一种方法来允许一些字段包含静态超文本标记语言格式的内容。此内容将由我们启用超文本标记语言的编辑器(类似、等的东西)生成或从外部粘贴。 我的计划是遵循这篇JavaWorld文章的配方: < li >使用< code>JTidy将HTML格式的字符串转换为正确

  • 我正在使用ITextRenderer从html生成PDF。然而,我得到以下异常: 你能帮帮我吗? 任何帮助都将不胜感激。 先谢谢你。

  • 我将html表格从网页复制到excel,并尝试使用下面的代码,但没有结果。请就如何解决这个问题提出建议。我做了所有的实验,但没有得到正确的结果。

  • 我正在尝试使用BeautifulSoup转换HTML文本块。以下是一个示例: 我试着做了这样的事情: ...但是这样我的span元素总是在新行上。这当然是一个简单的例子。有没有办法在超文本标记语言页面中获取文本,就像它在浏览器中呈现的方式一样(不需要css规则,只是div、spans、li等元素呈现的常规方式)在Python中?

  • 问题内容: 我有大量文本字符串,这些字符串显然是PDF文件的原始数据,我需要将其重新制作为PDF。 目前,我正在将字符串读取到StringBuffer中,但是如果需要,可以更改它。从那里,我尝试将其写到文件中并更改扩展名(我真的希望这样做能起作用,但是我有点不知道),我尝试将其带入String,然后从中取出byte []。并将其写入文件,或使用DataOutputStream将字节放入文件中。这些