ASP.NET中使用HtmlRenderer.PdfSharp生成PDF时图片显示红叉求助
解决HtmlRenderer.PdfSharp渲染PDF时二进制图片显示红叉的问题
这个问题本质是HtmlRenderer.PdfSharp默认只支持加载URL、本地文件路径或标准Data URI格式的图片,内存中的二进制对象不在它的默认加载逻辑里。结合你的代码,我给你几个针对性的解决方案:
1. 直接将二进制图片转为Base64 Data URI嵌入HTML
这是最省心的方式——如果你的图片是byte[]类型,先把它转成Base64字符串,再嵌入HTML的<img>标签中:
// 假设你有一个存储二进制图片的byte[]变量 byte[] imageBytes = GetYourBinaryImageData(); string base64Img = Convert.ToBase64String(imageBytes); // 生成带Base64源的img标签(注意替换图片格式后缀,比如jpg/png) string imgHtml = $"<img src=\"data:image/png;base64,{base64Img}\" alt=\"自定义图片\" />"; // 将这段imgHtml合并到你的_body变量中
这样HtmlRenderer就能直接识别并渲染图片,不需要修改核心渲染逻辑。
2. 自定义图片加载器(适合内存中缓存二进制图片的场景)
如果你的HTML通过自定义标识(比如data-img-id="pic1")关联内存中的二进制图片,可以通过注册ImageLoad事件手动处理加载逻辑:
修改你的代码如下:
// 新增参数imageCache,用来存储图片ID和对应的二进制数据 private void PdfFormat(string _body, ref MemoryStream _stream, Dictionary<string, byte[]> imageCache) { // 去掉冗余的Bitmap/GDI+转换,直接操作PDF页面 PdfDocument pdf = new PdfDocument(); PdfPage page = new PdfPage(); pdf.Pages.Add(page); XGraphics xgr = XGraphics.FromPdfPage(pdf.Pages[0]); TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer container = new TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer(); // 注册图片加载拦截事件 container.ImageLoad += (sender, e) => { // 从img标签的自定义属性中获取图片ID string imgId = e.Tag.GetAttribute("data-img-id"); if (imageCache.TryGetValue(imgId, out byte[] imgBytes)) { // 将二进制数据转为XImage供渲染器使用 using (var imgStream = new MemoryStream(imgBytes)) { e.Image = XImage.FromStream(imgStream); e.Handled = true; // 标记为已处理,跳过默认加载逻辑 } } }; container.SetHtml(_body); container.PerformLayout(xgr); container.PerformPaint(xgr); pdf.Save(_stream, false); }
代码优化说明
- 移除了你原代码中多余的
Bitmap和Graphics转换步骤:直接用XGraphics.FromPdfPage渲染到PDF页面即可,中间的位图转换不仅没必要,还可能干扰图片加载逻辑。 - 通过
ImageLoad事件拦截加载请求,手动从内存缓存中读取二进制图片并转换为渲染器支持的XImage类型。
3. 检查HTML中img标签的格式正确性
确认你的<img>标签没有语法错误:
- 如果用Base64格式,必须包含正确的前缀(比如
data:image/png;base64,),格式后缀要和图片实际类型匹配; - 如果用自定义标识,确保属性名称(比如
data-img-id)在HTML中正确设置。
内容的提问来源于stack exchange,提问作者user3766852
相关产品推荐
相关产品推荐

