.NET 7中HtmlRendererCore.PdfSharpCore生成PDF时图片仅显示一半
解决HtmlRendererCore.PdfSharpCore生成PDF时图片仅显示一半的问题
你遇到的图片显示不全问题和授权无关,核心原因是嵌入式资源流的指针位置异常,导致HtmlRenderer渲染时只能读取到部分图片内容。
问题根源
Assembly.GetManifestResourceStream返回的流默认是只读状态,且XImage.FromStream的委托可能会被HtmlRenderer多次调用。第一次读取后流指针会停在末尾,后续读取只能获取空内容,最终表现为图片只显示一半。
修复方案
将嵌入式资源流复制到MemoryStream中(支持重复定位读取),再传递给XImage.FromStream,修改后的代码如下:
private static void OnImageLoad(object sender, HtmlImageLoadEventArgs e) { using var logoStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("[resource path]"); // 复制原流到可复用的MemoryStream using var imageStream = new MemoryStream(); logoStream.CopyTo(imageStream); imageStream.Position = 0; // 复位指针到起始位置 var image = XImage.FromStream(() => imageStream); e.Callback(image); }
也可以直接复位原流指针(仅适用于支持定位的流):
private static void OnImageLoad(object sender, HtmlImageLoadEventArgs e) { var logoStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("[resource path]"); logoStream.Position = 0; // 确保流从起始位置读取 var image = XImage.FromStream(() => logoStream); e.Callback(image); }
验证方法
可以在代码中添加流状态打印,确认指针位置变化:
var logoStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("[resource path]"); Console.WriteLine($"初始位置:{logoStream.Position},总长度:{logoStream.Length}"); var image = XImage.FromStream(() => logoStream); Console.WriteLine($"创建XImage后位置:{logoStream.Position}");
替代库推荐(针对.NET Core免费PDF需求)
如果HTML转PDF的方案持续出问题,可以考虑这些更稳定的开源库:
- QuestPDF:纯.NET开源免费,采用声明式API,无需依赖HTML,渲染精度高,适合复杂文档生成
- iText 7 Community:AGPL协议开源,功能全面,支持HTML转PDF(需搭配
html2pdf组件) - PdfSharpCore:直接使用其原生API绘制PDF,比通过HTML转更可控,避免渲染兼容性问题
内容的提问来源于stack exchange,提问作者Mandroac
相关产品推荐
相关产品推荐

