旧标题: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();
}
}
}
答案 0 :(得分:0)
我遇到了完全相同的问题,并且在一直深入到 iText7 的 FontCache 对象并尝试创建我自己的 FontProgram 以从原始 TTF 文件中使用时出错(该文件也因相同的空引用错误而失败) ,我终于“解决”了我的问题。
显然 iText 有一些内部错误/异常,它们只是“跳过”和“推过去”,因为我偶然意识到我在 Visual Studios 中禁用了“仅启用我的代码”,所以我的系统是试图调试 iText7 的代码以及我的代码。在我的 Visual Studio 设置(工具 > 选项 > 调试 > 常规 > 启用仅我的代码复选框)中重新启用它的那一刻,问题神奇地消失了。
所以我花了四个小时试图解决他们代码中的问题,但他们显然找到了一些解决方法,即使在空引用失败的情况下也能通过该方法。
我的转换为 PDF 功能现在工作正常。