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

QuestPDF生成空白页、iTextSharp无法嵌入PDF图片问题求助

PDF图片嵌入问题解决方案

一、QuestPDF生成空白页问题修复

问题分析

代码中Layers组件未正确配置元素布局,且未确保Model.CaraA_2/Model.CaraB_1是QuestPDF支持的图片类型(如SKBitmap、byte[]或本地文件路径),导致内容无法渲染。同时空catch块掩盖了报错信息,阻碍问题排查。

修复代码

public void Crear(string output)
{
    try
    {
        var doc = Document.Create(container =>
        {
            // 第一页
            container.Page(p =>
            {
                p.Size(PageSizes.A0.Landscape());
                // 先简化布局,确认基础内容可渲染
                p.Content().Stack(stack =>
                {
                    stack.Item().Text("Hello").FontSize(20);
                    // 确保图片源有效,添加布局约束保证可见
                    stack.Item().Image(Model.CaraA_2)
                               .FitArea();
                });
            });

            // 第二页
            container.Page(page =>
            {
                page.Size(PageSizes.A0.Landscape());
                page.Content().Stack(stack =>
                {
                    stack.Item().Text("Hello").FontSize(20);
                    stack.Item().Image(Model.CaraB_1)
                               .FitArea();
                });
            });
        });
        doc.GeneratePdf(output);
    }
    catch (Exception ex)
    {
        // 保留异常信息用于排查
        Console.WriteLine($"生成PDF出错:{ex.Message}");
        throw;
    }
}

关键修复点

  • 移除Layers组件先做基础测试,确认文本和图片正常渲染后再考虑分层
  • 为Image添加.FitArea()或.FitWidth()等布局约束,确保图片在页面内可见
  • 确保Model.CaraA_2/Model.CaraB_1是QuestPDF支持的类型:本地文件路径、byte[]或SKBitmap
  • 去掉空catch块,保留异常信息

二、iTextSharp图片不显示问题修复

问题分析

HTMLWorker是iTextSharp旧版组件,对data:image格式的Base64图片支持有限且已被弃用,需改用XmlWorker并配置图片解析逻辑。

修复代码

先安装iTextSharp.xmlworker NuGet包,再修改生成代码:

public static string CreatePdf(string[] body, string output)
{
    float dpi = 100f;
    float widthInches = (3600f * 1.1f) / dpi;
    float heightInches = (2575f * 1.1f) / dpi;
    var pageSize = new iTextSharp.text.Rectangle(widthInches * 72f, heightInches * 72f);

    using (var memoryStream = new MemoryStream())
    {
        try
        {
            var pdfDoc = new iTextSharp.text.Document(pageSize, 10f, 10f, 10f, 0f);
            var writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
            pdfDoc.Open();

            // 配置XmlWorker管道,支持Base64图片
            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
            var charset = Encoding.UTF8;
            var context = new HtmlPipelineContext(null);
            context.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
            
            var imageProvider = new DataUriImageProvider();
            var imagePipeline = new ImageProviderPipeline(imageProvider, new PdfWriterPipeline(pdfDoc, writer));
            var htmlPipeline = new HtmlPipeline(context, imagePipeline);
            var cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
            var worker = new XMLWorker(cssPipeline, true);

            foreach (var html in body)
            {
                using (var sr = new StringReader(html))
                {
                    var parser = new XMLParser(true, worker, charset);
                    parser.Parse(sr);
                }
                if (body.Length > 1 && html != body.Last())
                {
                    pdfDoc.NewPage();
                }
            }

            pdfDoc.Close();
            File.WriteAllBytes(output, memoryStream.ToArray());
        }
        catch (Exception ex)
        {
            Console.WriteLine($"生成PDF出错:{ex.Message}");
            throw;
        }
    }
    return output;
}

// 自定义解析data URI图片的提供者
public class DataUriImageProvider : IImageProvider
{
    public Image GetImage(string src, IDictionary<string, string> attrs, ChainedProperties chain, IDocListener doc)
    {
        if (src.StartsWith("data:image/", StringComparison.OrdinalIgnoreCase))
        {
            var base64Data = src.Split(',')[1];
            var imageBytes = Convert.FromBase64String(base64Data);
            return Image.GetInstance(imageBytes);
        }
        return Image.GetInstance(src);
    }
}

关键修复点

  • 替换HTMLWorker为XmlWorker,需安装对应NuGet包
  • 实现IImageProvider自定义类,解析HTML中的data:image格式Base64图片
  • 调整为XmlWorker管道模式处理HTML和CSS
  • 移除空catch块,保留异常信息

图片转Base64代码验证

你的转Base64代码逻辑正常,确保传入正确的mimeType(如image/png、image/jpeg)即可:

private string ImagePathToBase64(string path, string mimeType)
{
    if (!File.Exists(path))
    {
        throw new Exception($"File not found {path}");
    }
    var bytes = File.ReadAllBytes(path);
    return $"data:{mimeType};base64,{Convert.ToBase64String(bytes)}";
}

内容的提问来源于stack exchange,提问作者PontiacGTX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:42:03