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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:35:35