.NET 6结合PdfSharpCore实现服务器端打印的问题求助
服务器端PDF打印:PdfSharpCore页面转可打印图像问题解决
问题核心
使用PdfSharpCore 1.3.47实现服务器端打印时,无法将PDF页面转换为可用于打印任务的图像/位图,原代码尝试直接读取PDF页面的Stream创建Bitmap,这是错误的——page.Stream是PDF页面的原始数据流,并非图像格式,无法直接生成可打印的位图。
错误原因分析
原代码中这段逻辑完全错误:
using (var pageStream = new MemoryStream(page.Stream.Value)) using (var bmp = new Bitmap(pageStream)) { args.Graphics.DrawImage(bmp, args.PageBounds); }
PdfSharpCore的PdfPage.Stream存储的是PDF页面的底层指令数据,不是PNG/JPG这类图像流,直接用它创建Bitmap会抛出格式错误,导致打印失败。
解决方案:直接渲染PDF页面到打印上下文
不需要将PDF转成Bitmap,直接使用PdfSharpCore的XGraphics将PDF页面渲染到PrintPageEventArgs提供的打印图形上下文即可。以下是修正后的完整代码:
using System; using System.Drawing.Printing; using System.IO; using PdfSharpCore.Pdf; using PdfSharpCore.Pdf.IO; using PdfSharpCore.Drawing; using System.Drawing; public void PrintPdf(byte[] pdfBytes, string printerName, string? jobName = null, bool isColor = true) { using (var pdfStream = new MemoryStream(pdfBytes)) using (var doc = PdfReader.Open(pdfStream)) { if (!OperatingSystem.IsWindows()) { Console.WriteLine("仅支持Windows系统下的打印操作"); return; } using (var pd = new PrintDocument()) { pd.PrinterSettings.PrinterName = printerName; // 校验打印机有效性 if (!pd.PrinterSettings.IsValid) { pd.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[0]; Console.WriteLine("指定打印机无效,已切换至默认打印机"); foreach (string printer in PrinterSettings.InstalledPrinters) { Console.WriteLine($"可用打印机:{printer}"); } } pd.DocumentName = jobName ?? "打印任务"; pd.DefaultPageSettings.Landscape = false; pd.DefaultPageSettings.Color = isColor; int currentPage = 0; pd.PrintPage += (sender, args) => { if (currentPage >= doc.PageCount) { args.HasMorePages = false; return; } var pdfPage = doc.Pages[currentPage]; // 创建适配打印上下文的XGraphics using (var xGraphics = XGraphics.FromGraphics(args.Graphics, new XSize(pdfPage.Width, pdfPage.Height))) { // 设置缩放,适配打印页面边界 var scale = Math.Min(args.PageBounds.Width / pdfPage.Width, args.PageBounds.Height / pdfPage.Height); xGraphics.ScaleTransform(scale); // 渲染PDF页面 XGraphicsPdfRenderer renderer = new XGraphicsPdfRenderer(xGraphics, XPageDirection.Downwards); renderer.RenderPage(pdfPage); } currentPage++; args.HasMorePages = currentPage < doc.PageCount; }; try { pd.Print(); } catch (Exception ex) { Console.WriteLine($"打印执行失败:{ex.Message}"); } } } }
关键修改点
- 引入
PdfSharpCore.Drawing命名空间,使用XGraphics和XGraphicsPdfRenderer直接渲染PDF页面到打印图形上下文 - 移除错误的
Bitmap创建逻辑,避免格式错误 - 添加页面缩放逻辑,确保PDF页面适配打印纸张边界
- 优化页面索引判断,避免越界
内容的提问来源于stack exchange,提问作者V.d.S Wim
相关产品推荐
相关产品推荐

