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

如何在Windows系统使用Python发送指令直接打印PDF文件?

Windows下用Python直接打印PDF的实现方案

在Windows环境下,直接用win32print发送原始指令打印PDF的核心难点是:普通打印机无法原生解析PDF,必须先将PDF转换为打印机可识别的原始数据流(如PCL、PostScript或RAW位图)。以下是两种不依赖第三方工具的实现方式,均基于Windows系统自带组件和pywin32库(win32print是其中一部分):

方法1:借助系统默认PDF查看器静默打印

这种方式利用Windows自带的PDF渲染组件(如Microsoft Edge)处理PDF,代码简洁易实现:

import win32print
from win32com.client import Dispatch

def print_pdf(pdf_path, printer_name=None):
    # 未指定打印机则使用系统默认打印机
    if not printer_name:
        printer_name = win32print.GetDefaultPrinter()

    # 调用Windows Shell执行静默打印命令
    shell = Dispatch("WScript.Shell")
    # /p 参数触发打印,/h 隐藏打印对话框
    shell.Run(f'"{pdf_path}" /p /h', 0, False)

# 使用示例:替换为你的PDF路径和打印机名称
print_pdf(r"C:\test.pdf", "HP laserjet 001")

方法2:转换为RAW数据流后用win32print直接发送

这种方式更贴近你“直接发送原始指令”的需求,先将PDF转换为打印机兼容的RAW数据,再通过win32print发送:

import win32print
import subprocess
import os

def print_pdf_raw(pdf_path, printer_name=None):
    if not printer_name:
        printer_name = win32print.GetDefaultPrinter()

    # 临时存储RAW打印数据的文件路径
    temp_raw_file = os.path.join(os.environ["TEMP"], "temp_print_stream.raw")

    try:
        # 用系统自带的printui.dll将PDF转换为RAW数据
        subprocess.run([
            "rundll32.exe", "printui.dll,PrintUIEntry",
            "/k", "/d:" + printer_name, "/n", printer_name,
            "/f", pdf_path, "/raw"
        ], check=True, shell=True)

        # 读取RAW数据
        with open(temp_raw_file, "rb") as f:
            raw_print_data = f.read()

        # 向打印机发送原始数据
        printer_handle = win32print.OpenPrinter(printer_name)
        try:
            # 初始化打印作业
            win32print.StartDocPrinter(printer_handle, 1, ("PDF Print Job", None, "RAW"))
            win32print.StartPagePrinter(printer_handle)
            win32print.WritePrinter(printer_handle, raw_print_data)
            win32print.EndPagePrinter(printer_handle)
            win32print.EndDocPrinter(printer_handle)
        finally:
            win32print.ClosePrinter(printer_handle)
    finally:
        # 清理临时文件
        if os.path.exists(temp_raw_file):
            os.remove(temp_raw_file)

# 使用示例
print_pdf_raw(r"C:\test.pdf", "HP laserjet 001")

注意事项

  • 确保你的Python环境已安装pywin32库(可通过pip install pywin32安装)。
  • 路径需使用Windows格式的绝对路径(如C:\test.pdf),避免使用Linux风格的路径。
  • 第二种方法依赖打印机支持RAW打印模式,绝大多数现代打印机都支持该模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:40:14