You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:32:35