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

如何在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
)

关键说明

  1. Acrobat Reader路径:不同版本的Acrobat Reader安装路径可能略有差异,代码里做了常见路径的适配,你可以根据实际情况调整。
  2. 纸张来源编号:不同打印机的纸盒编号不一样,你可以通过Windows「设备和打印机」→右键打印机→「属性」→「高级」→「打印默认值」查看对应选项,或者用win32print枚举打印机的纸张来源列表获取准确编号。
  3. 替代方案:如果觉得Acrobat Reader的命令行不够灵活,也可以考虑用PyPDF2或pdf2image将PDF转成图片后,再用win32print直接打印,但这种方式可能会损失打印精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:58:21