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

