【发布时间】: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。
标签: pdf .net-core itext itext7 xmlworker