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

