C#使用PdfSharp生成含绘制图片的PDF后下载为空问题求助
解决PdfSharp生成空PDF的问题
你的代码之所以会生成空PDF,核心问题是处理后的图片根本没被加入到PDF文档里,而且错误地提前把图片写入了Response流,导致后续的PDF生成流程完全没用到这张图。
错误点分析
- 你执行了
imgBackground.Save(Response.OutputStream, ...),这一步直接把图片输出到了响应流,但后续创建的PDF文档和这一步没有任何关联。 - 创建PDF页面后,没有调用任何绘制图片的方法,直接保存了空的PDF文档。
修正后的代码
var foo = new PrivateFontCollection(); foo.AddFontFile(HttpContext.Current.Server.MapPath("~/assets/css/base/fonts/Coustom.ttf")); var Font_6 = new Font((FontFamily)foo.Families[0], 6f); StringFormat rf = new StringFormat(); rf.LineAlignment = StringAlignment.Far; rf.Alignment = StringAlignment.Far; Brush _RedColor = new SolidBrush(Color.FromArgb(63, 110, 123)); System.Drawing.Image imgBackground = System.Drawing.Image.FromFile(Server.MapPath("../assets/EmptyDoc/Letterhead-FA-A4.jpg")); int _X = 2300; int _Y = 450; // 在图片上绘制文字 using (Graphics graphics = Graphics.FromImage(imgBackground)) { graphics.DrawString("TEST", Font_6, _RedColor, new PointF((_X - 40), (_Y)), rf); } // 将处理后的图片保存到内存流,而不是直接写入Response MemoryStream imgStream = new MemoryStream(); imgBackground.Save(imgStream, System.Drawing.Imaging.ImageFormat.Png); imgStream.Position = 0; // 重置流指针到开头 // 创建PDF文档并添加图片 PdfDocument document = new PdfDocument(); PdfPage page = document.AddPage(); // 设置PDF页面尺寸和图片一致(如果需要) page.Width = XUnit.FromPixels(imgBackground.Width); page.Height = XUnit.FromPixels(imgBackground.Height); XGraphics gfx = XGraphics.FromPdfPage(page); XImage xImage = XImage.FromStream(imgStream); // 将图片绘制到PDF页面的左上角 gfx.DrawImage(xImage, 0, 0); // 保存PDF到内存流 MemoryStream pdfStream = new MemoryStream(); document.Save(pdfStream, true); byte[] fileContents = pdfStream.ToArray(); // 输出PDF到Response,强制下载 Response.Clear(); Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment; filename=TEST.pdf"); Response.BinaryWrite(fileContents); Response.End(); // 确保响应结束,避免后续输出干扰
额外注意事项
- 注意流的
Position重置:将图片写入内存流后,必须把指针移到开头,否则后续读取流会从末尾开始,读不到内容。 - 页面尺寸匹配:如果需要图片占满整个PDF页面,记得设置PDF页面的宽高和图片一致,避免拉伸或留白。
- 资源释放:可以考虑给
imgBackground、imgStream、pdfStream加上using语句,确保资源被正确释放。
内容的提问来源于stack exchange,提问作者amirlol
相关产品推荐
相关产品推荐

