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高级教程之html2pdf——6.在pdfHTML中使用字体