面单批量打印怎么弄:SumatraPDF 一条命令静默打印(附 8 个实测卡点)

分类:SOP拆解 浏览量:4

摘要:

把一天几十上百单的订单批量生成 100×150mm 面单 PDF,并一条命令静默打印。含 8 个实测卡点与报错原文(Windows 11 实测)。

面单批量打印 SOP 实测:订单批量生成 100×150mm 面单 PDF,SumatraPDF 一条命令静默打印

这篇文章记录的是我在 2026-09-17 实际跑出来的一条流程:把一天几十上百单的订单信息,批量生成标准热敏面单尺寸(100×150mm)的 PDF、合并成一份,再用一条命令静默送进打印队列。文中的命令、报错、耗时都是原样复制,包括我踩到的坑。

先说清"一条命令"的边界:第 6 步的打印确实只有一条命令;但前面 1–5 步是一次性准备(建环境、装依赖、下载工具),装完以后每天发货只剩第 6–7 步。另外,发货台通常还要搭配打单软件、热敏打印机、面单纸,本文只覆盖"生成面单 PDF + 打印"这一段,不推荐具体型号(没有实测过的设备,不做推荐)。

做完你能得到什么

实测数字:生成 20 张面单 0.08 秒;合并成一份 20 页 PDF 共 256 KB;静默打印提交 2.6 秒,队列里显示 TotalPages = 20 / JobStatus = Normal——这就是"真的打印了"的铁证。

适合你:一天 20 单以上、发货台反复打印、平台自带打印不够用(要自定义、跨平台、合并成一份)。
不适合你:一天 3–5 单(平台自带够用);完全不想碰命令行的人。

前置条件(真实耗时)

系统 Windows(实测 Windows 11)
Python 3.10+,实测 3.13,装在隔离虚拟环境里,不污染系统
Python 依赖 reportlab、pypdf —— 实测安装耗时 35.4 秒(国内网络,共 4 个包)
中文字体 系统自带即可(黑体 simhei.ttf 实测注册成功)
打印工具 SumatraPDF 便携版,9.57 MB,解压即用,不装系统
打印机 静默打印对真实打印机已验证;虚拟 PDF 打印机不支持静默(见卡点 4)

步骤

第 1 步:隔离环境 + 依赖(实测 35.4 秒)

python -m venv venv
venvScriptspython.exe -m pip install reportlab pypdf

第 2 步:先确认环境是隔离的(别省,见卡点 8)

venvScriptspython.exe -c "import sys; print(sys.executable)"

第 3 步:先生成 1 张试(实测 0.01 秒)

venvScriptspython.exe gen_waybill.py --count 1
# 输出:中文字体:Hei ← C:WindowsFontssimhei.ttf
#      实测页尺寸:100.0 × 150.0 mm(A4 应为 210×297)  ← 这就是验收判据

第 4 步:批量 20 张并合并成一份(实测 0.4 秒)

venvScriptspython.exe gen_waybill.py --count 20 --merge
# 输出:合并 → outwaybills_all.pdf  共 20 页  256.2 KB

第 5 步:下载 SumatraPDF 便携版(9.57 MB,解压即用)

官网下载页搜 "SumatraPDF",选 64 位便携版(zip),解压到任意目录即可,不需要安装、不需要管理员权限。

第 6 步:一条命令静默批量打印(实测 2.6 秒提交完成)

SumatraPDF-3.6.1-64.exe -print-to "打印机名称" -silent -exit-when-done outwaybills_all.pdf

第 7 步:验收——查队列,确认任务真的进去了

powershell -NoProfile -Command "Get-PrintJob -PrinterName '打印机名称' | Format-List DocumentName,JobStatus,TotalPages"

# 实测输出:
# DocumentName : …waybills_all.pdf
# JobStatus    : Normal
# TotalPages   : 20
# Size         : 1450058

不要相信"命令成功"——详见卡点 1。

第 8 步(可选):打错了怎么取消

powershell -NoProfile -Command "Get-PrintJob -PrinterName '打印机名称' | Remove-PrintJob"

卡点清单(本文最值钱的部分)

卡点 1:命令打印"成功"了,其实一张都没打

Start-Process -FilePath 'waybills_all.pdf' -Verb Print
# 实测:exit=0,还回了一个进程:56280 wps

同时刻查队列,三台打印机全是 0 个任务。原因:这个命令只是把文件交给系统默认的 PDF 程序(我这台是 WPS),命令成功 ≠ 进打印队列。

判据:任何"打印成功"的断言,都必须落到打印队列的任务数上;队列为 0 就是没打。

卡点 2:抄来的 PrintTo 命令在本机直接报错

Start-Process -Verb PrintTo -ArgumentList '"out.pdf"'
# 实测报错原文:
# This command cannot be run due to the error:
# No application is associated with the specified file for this operation.

原因是该文件类型的关联程序没有注册 printto 动词。这不是你写错了,而是"网上抄的命令在你的机器上不一定存在"。(限定:把 PDF 关联程序换成支持 printto 的应用能否走通,我们没有测试。)

卡点 3:正解——SumatraPDF 的 -print-to(实测把 20 页送进了队列)

SumatraPDF-3.6.1-64.exe -print-to "HP Laser NS MFP 1005" -silent -exit-when-done outwaybills_all.pdf

实测 exit=0、2.6 秒,队列立刻出现 20 页任务(TotalPages=20 / JobStatus=Normal)。这就是"真打印"和"假成功"的分界线。

卡点 4:虚拟 PDF 打印机不支持静默打印(实测会卡住)

把打印目标换成 Microsoft Print to PDF,实测 20 秒未退出(在等"保存文件"对话框),队列仍是 0 个任务,Documents/Downloads 也没有新文件。

结论:要一键静默批量,走真实打印机;虚拟 PDF 打印机需要人工点保存,不适合命令行批量。限定:这里只测了 Microsoft Print to PDF 这一台虚拟打印机,其他虚拟打印机(例如"导出为 WPS PDF")没有逐台验证。

卡点 5:-help 会让图形界面挂住

实测给 SumatraPDF 加 -help,它会打开图形界面并且一直不退出,我的自动化脚本因此卡死了整整 600 秒。

修法:任何调用图形界面程序的脚本,都必须设置超时,并在超时后结束进程树(taskkill /T /F /PID)。

卡点 6:PowerShell 5.1 读 UTF-8 脚本会中文乱码

实测报错原文:Unexpected token '' + $printer + '' in expression or statement.——原因是 PowerShell 5.1 把没有 BOM 的 UTF-8 脚本按 GBK 解析,中文全变乱码,甚至破坏语法。

修法:脚本存成 UTF-8 with BOM,或者干脆让脚本里只用英文(我最后就是这么改的)。

卡点 7:不设页面尺寸 = 默认 A4,打出来比例全错

实测:不显式设置页面尺寸时,生成结果是 210.0 × 297.0 mm(A4),而热敏面单纸是 100×150mm。判据是生成后立刻读回页尺寸。

卡点 8:环境装错地方(老坑,必查)

不建隔离环境时,python 会解析到电脑上别的软件自带的解释器,依赖装到别处、后续命令行为诡异。判据是 print(sys.executable) 必须指向你自己的环境目录。

怎么确认"真的打印了"(比退出码可靠)

打印 Get-PrintJob 的 TotalPages / JobStatus;队列 0 = 没打
生成 PDF 读回页面尺寸(面单必须 100×150mm,是 A4 就是错的)
装依赖 pip show + 解释器路径都在你自己的环境里
命令成功但无效 典型例子就是 Start-Process -Verb Print

诚实边界(本文没验证到的部分)

生成面单 PDF(100×150mm、中文、条码) ✅ 已实测
批量 20 张 + 合并一份(0.4s / 20 页 / 256KB) ✅ 已实测
静默批量打印(SumatraPDF → 实体打印机) ✅ 已实测(任务入队 20 页,验证后已取消)
打印到虚拟 PDF 打印机(静默) ❌ 实测不支持(等保存对话框,队列 0)
实体出纸 ❌ 未验证(测试机上打印机未连线,本次没有出纸)

常见问题

面单批量打印怎么设置?把"生成"和"打印"拆开:生成走脚本(第 3–4 步),打印走第 6 步一条命令。

为什么点了打印没反应?见卡点 1:命令成功不代表入队,用 Get-PrintJob 看任务数。

打出来比例不对怎么办?见卡点 7:检查页面尺寸是不是 100×150mm。

要买什么打印机?本文没有验证实体打印机,不做推荐——不写没验证过的结论。

一定要装 SumatraPDF 吗?要静默批量打印,就需要一个支持命令行打印的 PDF 程序;便携版不装系统,用完可以直接删。

实测环境

2026-09-17 | Windows 11 | 隔离虚拟环境(Python 3.13)| reportlab 5.0.1 · pypdf 6.19.0 · SumatraPDF 3.6.1 便携版。
打印设备:Microsoft Print to PDF、导出为 WPS PDF、HP Laser NS MFP 1005(离线未连线)。
本次未做实体出纸;凡未验证的部分本文均已明写。

相关工具

微信微博邮箱复制链接