我的知识记录

Python批量打印PDF:自动发送到打印机

用Python调用系统打印命令批量把PDF发送到默认打印机,Windows用SumatraPDF/Acrobat,Linux用lp命令,适合财务、仓库每天批量打印单据。

场景痛点

仓库每天到货单、财务每天报销单、客服每天快递面单,几十上百个PDF要打印,手动一个个右键打印点确认,一天下来光点鼠标了。用Python直接调系统打印命令,把整个文件夹的PDF按队列送进打印机,人不用守着。

用到的库

# Python 只用标准库 subprocess
# Windows 推荐装 SumatraPDF(免费、命令行参数干净):
#   https://www.sumatrapdfreader.org/download-free-pdf-viewer
# Linux 系统自带 lp 命令(CUPS)
# Mac 用 lp 命令即可

完整代码

# -*- coding: utf-8 -*-
"""
批量把 PDF 文件发送到系统默认打印机。
自动识别 Windows / Linux / Mac,调用对应打印命令。
"""
import platform
import shutil
import subprocess
from pathlib import Path


def find_sumatra() -> str:
"""Windows 下找 SumatraPDF。"""
candidates = [
r"C:\Program Files\SumatraPDF\SumatraPDF.exe",
r"C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe",
]
for c in candidates:
if Path(c).exists():
return c
return shutil.which("SumatraPDF") or ""


def print_pdf(pdf_path: str, printer_name: str = None, copies: int = 1):
system = platform.system()

if system == "Windows":
# 优先用 SumatraPDF,命令行干净不弹窗
sumatra = find_sumatra()
if sumatra:
cmd = [sumatra, "-print-to-default", "-silent", pdf_path]
if printer_name:
cmd = [sumatra, f"-print-to\"{printer_name}\"", "-silent", pdf_path]
else:
# 兜底:用 Acrobat Reader
cmd = [
"AcroRd32.exe", "/t", pdf_path,
printer_name or "",
]
else:
# Linux / Mac:CUPS 的 lp 命令
cmd = ["lp"]
if printer_name:
cmd += ["-d", printer_name]
if copies > 1:
cmd += ["-n", str(copies)]
cmd.append(pdf_path)

subprocess.run(cmd, check=True)
print(f"已发送到打印机:{Path(pdf_path).name}")


def batch_print(input_dir: str, printer_name: str = None, copies: int = 1):
src = Path(input_dir)
pdf_files = sorted(src.glob("*.pdf"))
if not pdf_files:
print("目录下没有 PDF 文件")
return

print(f"共 {len(pdf_files)} 个文件,开始打印...")
for f in pdf_files:
try:
print_pdf(str(f), printer_name=printer_name, copies=copies)
except subprocess.CalledProcessError as e:
print(f"打印失败:{f.name} -> {e}")


if __name__ == "__main__":
batch_print(
input_dir="to_print",
printer_name=None,   # None 表示用系统默认打印机
copies=1,
)

代码讲解

  • platform.system() 判断操作系统,Windows走SumatraPDF/Acrobat,Linux/Mac走CUPS的lp命令。
  • SumatraPDF的-print-to-default -silent参数直接静默打印到默认打印机,不弹阅读器窗口,这是批量打印最稳的方案。
  • lp是Linux/Mac自带的打印命令,-d 打印机名指定打印机,-n 份数打印多份,不加参数就是默认打印机打一份。
  • sorted(src.glob("*.pdf")) 按文件名顺序打印,建议文件命名001.pdf002.pdf保证顺序。
  • 单个文件打印失败不会中断整个批次,错误信息打印出来继续打下一个。

运行结果

把要打印的PDF放进to_print/目录,脚本跑完所有文件按顺序进打印机队列,打印机自动开始出纸。在系统打印机队列里能看到任务列表。

注意事项

  • Windows下如果没装SumatraPDF,Acrobat Reader的/t参数经常弹"另存为"对话框,不适合无人值守,强烈建议装SumatraPDF。
  • 打印前先确认打印机默认纸张和PDF页面大小匹配,A4打印机打A3 PDF会缩印或裁切。
  • 网络打印机要先在系统里添加好,Python只是把任务丢给系统打印服务,不直接和打印机通信。
  • 想双面打印,Linux下加-o sides=two-sided-long-edge,Windows下SumatraPDF加-print-settings "duplex"

Python批量打印PDF:自动发送到打印机

标签:

更新时间:2026-09-14 21:40:56

上一篇:Python批量读取文件夹所有PDF文字 汇总教程

下一篇:Python批量为PDF添加公司Logo页眉:每页统一抬头