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
相关产品推荐
相关产品推荐

