通过调用Windows进程执行命令实现PDF按指定页面尺寸打印——C#实现
关于Adobe Acrobat Reader DC打印PDF时指定页面尺寸的问题
很遗憾,Adobe Acrobat Reader DC的命令行参数中并没有支持直接指定打印页面尺寸的选项——你尝试添加的/PageSize "Envelope C5"这类参数,Reader根本不会识别,所以这种方式行不通。
为什么会这样?
Reader的命令行打印参数(比如你用的/t(打印到指定打印机)、/h(隐藏Reader窗口))只负责触发打印动作,打印时的页面尺寸等细节,默认会遵循三个优先级:
- PDF文件本身内嵌的页面设置
- 目标打印机的默认纸张配置
- 系统打印对话框里的临时设置(但你用
CreateNoWindow=true会跳过对话框)
所以如果想强制用C5信封尺寸打印,得换其他方案:
方案1:临时修改打印机的默认纸张尺寸
你可以通过C#的System.Printing命名空间,临时把目标打印机的默认纸张改成C5,打印完成后再恢复原来的设置。示例代码大概是这样:
using System.Printing; // 获取目标打印机 var printerName = "My Printer Name"; var printServer = new LocalPrintServer(); var printQueue = printServer.GetPrintQueue(printerName); // 保存原默认打印票证 var originalTicket = printQueue.DefaultPrintTicket.Clone(); try { // 创建新的打印票证,设置C5信封尺寸 var newTicket = printQueue.DefaultPrintTicket.Clone(); newTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.EnvelopeC5); printQueue.DefaultPrintTicket = newTicket; printQueue.Commit(); // 执行你的打印进程 Process p = new Process(); p.StartInfo = new ProcessStartInfo() { CreateNoWindow = true, Verb = "print", Arguments = String.Format("/h /t \"{0}\" \"{1}\"", "MyFile.pdf", printerName) }; p.Start(); p.WaitForExit(); } finally { // 恢复原默认设置 printQueue.DefaultPrintTicket = originalTicket; printQueue.Commit(); }
注意:这个方法需要程序有足够的权限修改打印机设置,而且要处理可能的异常(比如打印机不存在、不支持C5尺寸)。
方案2:使用Adobe Acrobat COM接口(仅完整版Acrobat)
如果你使用的是Adobe Acrobat Pro(不是免费的Reader),可以通过COM对象直接控制打印参数,包括指定页面尺寸。示例思路:
// 需要添加对Adobe Acrobat类型库的引用 AcroPDDoc pdfDoc = new AcroPDDoc(); if (pdfDoc.Open("MyFile.pdf")) { // 设置打印参数,指定C5信封 var printParams = pdfDoc.GetPrintParams(); // 这里需要根据Acrobat的API设置纸张尺寸,具体参数需要查官方文档 printParams.PaperSize = ...; // 对应C5的枚举值 pdfDoc.PrintPages(0, pdfDoc.GetNumPages() - 1, 1, false, printParams); pdfDoc.Close(); }
但Reader没有这个COM接口,所以这个方案只适用于完整版Acrobat。
方案3:用第三方命令行打印工具(比如Ghostscript)
如果不想依赖Adobe的软件,可以用Ghostscript这类开源工具,它支持通过命令行直接指定纸张尺寸。比如:
gswin64c.exe -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile="%printer%My Printer Name" -sPAPERSIZE=c5 "MyFile.pdf"
在C#里调用这个命令即可,灵活性更高,能直接控制打印的各种参数。
内容的提问来源于stack exchange,提问作者Kelechi Daniels




