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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:28:11