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

WinForms自定义打印机打印PDF异常:选打印机仍用默认打印机

解决PDF打印对话框选择打印机无效的问题

这个问题我之前也碰到过!核心原因是你传递打印机参数的方式不对——print动词并不会把你加在Arguments里的打印机名传递给PDF阅读器,系统还是会默认调用默认打印机来处理打印请求。下面给你两种可行的解决思路:

方法一:利用PDF阅读器的命令行参数(简单直接)

大多数主流PDF阅读器(比如Adobe Acrobat Reader、Foxit Reader)都支持通过命令行指定打印机。以最常用的Adobe Acrobat Reader为例,它的打印参数格式是/t "<PDF文件路径>" "<打印机名>",我们可以直接调用阅读器的进程并传递正确参数:

private void SendToPrinter(string filename)
{
    using (PrintDialog dialog = new PrintDialog())
    {
        // 先判断用户是否确认了打印选择
        if (dialog.ShowDialog() == DialogResult.OK) 
        {
            ProcessStartInfo printProcessInfo = new ProcessStartInfo()
            {
                // 如果AcroRd32.exe不在系统PATH中,需要填写完整路径,比如 @"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
                FileName = "AcroRd32.exe",
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden,
                // 构造符合阅读器要求的参数:/t 文件名 打印机名
                Arguments = $"\"{filename}\" \"{dialog.PrinterSettings.PrinterName}\""
            };

            using (Process printProcess = new Process())
            {
                printProcess.StartInfo = printProcessInfo;
                printProcess.Start();
                
                // 等待打印完成,设置10秒超时避免进程挂起
                if (!printProcess.WaitForExit(10000))
                {
                    printProcess.Kill();
                }
            }
        }
    }
}

如果你的用户用的是其他阅读器,需要调整参数格式:

  • Foxit Reader:参数格式是/p "<filename>" /n "<printername>"
  • Sumatra PDF:参数格式是-print-to "<printername>" "<filename>"

方法二:使用PDF渲染库直接打印(不依赖外部软件)

如果不想依赖用户机器上的PDF阅读器,可以用PDF渲染库(比如PdfSharp、iTextSharp)直接在程序中渲染PDF并打印。以PdfSharp为例:

首先需要安装PdfSharp的NuGet包,然后编写代码:

using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using PdfSharp.Drawing;
using System.Drawing.Printing;

private void SendToPrinter(string filename)
{
    using (PrintDialog dialog = new PrintDialog())
    {
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            // 打开PDF文档
            PdfDocument document = PdfReader.Open(filename, PdfDocumentOpenMode.Import);
            
            PrintDocument printDoc = new PrintDocument();
            // 直接复用PrintDialog中用户选择的打印机设置
            printDoc.PrinterSettings = dialog.PrinterSettings;
            
            // 绑定打印页面事件,逐页渲染PDF
            printDoc.PrintPage += (sender, e) =>
            {
                int pageIndex = e.PageSettings.PrintableArea.PageNumber;
                if (pageIndex < document.PageCount)
                {
                    XGraphics gfx = XGraphics.FromGraphics(e.Graphics, e.PageBounds);
                    PdfPage pdfPage = document.Pages[pageIndex];
                    // 按打印页面大小渲染PDF页
                    gfx.DrawPdfPage(pdfPage, new XRect(0, 0, e.PageBounds.Width, e.PageBounds.Height));
                }
            };
            
            // 执行打印
            printDoc.Print();
        }
    }
}

这种方法的优点是不依赖外部软件,打印逻辑完全由你的程序控制,还可以自定义页面缩放、分页规则等细节,但需要处理PDF渲染的相关逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:17:30