如何在Python的ShellExecute中指定页码范围、纸盒等打印参数?
解决Windows下用Python通过Adobe Acrobat Reader打印PDF时添加自定义选项的问题
你提到的ShellExecute的print动作确实有个痛点——它的参数支持非常有限,MSDN文档里也没详细说明和print配合的自定义打印选项参数,因为它本质是调用系统默认的打印流程,没法直接传递纸盒、页码范围这类精细化的设置。不过别担心,我们可以直接用Adobe Acrobat Reader本身的命令行打印参数来实现这些需求,这才是更可控的方式。
第一步:了解Adobe Acrobat Reader的命令行打印语法
Acrobat Reader(AcroRd32.exe)支持直接通过命令行执行打印,并且可以传递多种自定义参数,核心语法如下:
AcroRd32.exe /t "<PDF文件路径>" "<打印机名称>" "<打印机驱动名称>" "<打印机端口>"
其中:
/t参数表示后台静默打印(不会弹出打印对话框)- 后面依次是PDF路径、打印机名称、驱动名、端口名(后三个可以通过Windows的打印机属性查看,驱动名和端口名留空时系统会自动识别)
除此之外,我们还可以添加其他参数控制打印选项:
- 指定页码范围:使用
/o "page=起始页码-结束页码",比如只打印第2到第5页就是/o "page=2-5" - 指定纸张来源(纸盒):这个需要结合打印机的具体设置,我们可以通过Windows的设备上下文(DevMode)配置,或者用Python的
win32print模块修改打印设备的默认设置。
第二步:Python代码实现自定义打印选项
示例1:指定页码范围的静默打印
我们可以用subprocess模块调用Acrobat Reader的命令行,比ShellExecute更便于捕获输出和控制流程:
import subprocess import os def print_pdf_with_pages(pdf_path, printer_name, start_page, end_page): # 适配Acrobat Reader的常见安装路径 acrobat_path = r"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" if not os.path.exists(acrobat_path): acrobat_path = r"C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" # 构造带页码范围的命令参数 cmd_args = [ acrobat_path, "/t", pdf_path, printer_name, "", # 驱动名留空,系统自动识别 "", # 端口名留空,系统自动识别 "/o", f"page={start_page}-{end_page}" ] # 执行打印命令 subprocess.run(cmd_args, shell=False, check=True) # 使用示例 print_pdf_with_pages( r"C:\test.pdf", "NPIAC1EC3 (HP LaserJet Pro MFP M226dw)", 1, 3 )
示例2:添加纸张来源(纸盒)设置
如果要指定纸盒,需要先获取打印机的DevMode结构,修改其中的纸张来源参数,再执行打印:
import win32print import subprocess import os def set_printer_paper_source(printer_name, paper_source): # 打开打印机设备上下文 hprinter = win32print.OpenPrinter(printer_name) try: # 获取打印机默认的DevMode配置 devmode = win32print.GetPrinter(hprinter, 2)["pDevMode"] # 设置纸张来源编号:不同打印机的纸盒编号不同,比如7通常对应纸盒1,2对应手动进纸 devmode.DefaultSource = paper_source # 更新打印机默认设置 win32print.SetPrinter(hprinter, 2, {"pDevMode": devmode}, 0) finally: win32print.ClosePrinter(hprinter) def print_pdf_with_custom_options(pdf_path, printer_name, start_page, end_page, paper_source): # 先设置纸张来源 set_printer_paper_source(printer_name, paper_source) # 调用Acrobat Reader执行打印 acrobat_path = r"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" if not os.path.exists(acrobat_path): acrobat_path = r"C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" cmd_args = [ acrobat_path, "/t", pdf_path, printer_name, "", "", "/o", f"page={start_page}-{end_page}" ] subprocess.run(cmd_args, shell=False, check=True) # 使用示例:假设纸盒1的编号是7(请根据你的打印机实际情况修改) print_pdf_with_custom_options( r"C:\test.pdf", "NPIAC1EC3 (HP LaserJet Pro MFP M226dw)", 1, 3, 7 )
关键说明
- Acrobat Reader路径:不同版本的Acrobat Reader安装路径可能略有差异,代码里做了常见路径的适配,你可以根据实际情况调整。
- 纸张来源编号:不同打印机的纸盒编号不一样,你可以通过Windows「设备和打印机」→右键打印机→「属性」→「高级」→「打印默认值」查看对应选项,或者用
win32print枚举打印机的纸张来源列表获取准确编号。 - 替代方案:如果觉得Acrobat Reader的命令行不够灵活,也可以考虑用
PyPDF2或pdf2image将PDF转成图片后,再用win32print直接打印,但这种方式可能会损失打印精度。
内容的提问来源于stack exchange,提问作者Parvathy
相关产品推荐
相关产品推荐

