一个 Windows 桌面小工具:选一个文件夹,把里面的 PDF 一次性送去打印机。
每行可以单独设置打印页码和份数,勾选哪些就打哪些,底部实时显示预计耗纸量。
因为那些软件的命令行打印需要本机装好对应程序,而且各家参数不统一:
SumatraPDF -print-to-default file.pdf—— 得先装 SumatraPDFAcrobat.exe /t file.pdf printer—— 得装 Adobe,版本之间还变- WPS 的打印接口更是不对外公开
换一台电脑、换一个版本,脚本就废了。
这个程序自带 PDF 渲染引擎(pypdfium2),把每一页渲染成位图后直接画到 Windows 的打印接口(GDI)上。只要系统里装了打印机驱动,不需要任何第三方阅读器。
- 添加文件 / 添加文件夹:文件夹会递归扫描所有
.pdf - 每行独立设置:页码范围、份数各管各的,互不影响
- 勾选控制:只打勾上的,表头可以一键全选 / 全不选
- 实时统计:底部随时显示「N 个文件,共 N 页,耗纸 N 张」
- 指定打印机:支持本机和网络打印机,可调渲染清晰度
- 随时停止:打印中按钮变成「停止打印」
- 自动适配:页面方向和纸张方向不一致时自动旋转 90°;等比缩放居中
- 记住设置:打印机和清晰度会记住,下次打开直接用
- 坏文件跳过:加密或损坏的 PDF 会标灰并跳过,不影响其他文件
到 Releases 页面下载 PDFBatchPrint-v1.0.0.exe,双击运行。
GitHub 不允许发布资源使用中文文件名,所以下载下来是英文名。你可以自己改成
PDF批量打印.exe,不影响使用。
不需要安装 Python,不需要安装任何阅读器。
首次启动大约 3–5 秒(单文件程序要先解压到临时目录),之后就快了。
程序没有代码签名,Windows 可能弹「Windows 已保护你的电脑」。点 更多信息 → 仍要运行 即可。
部分杀毒软件会把 PyInstaller 打包的单文件程序误报成木马,这是打包工具的常见问题,不是程序有问题,加白名单即可。
- 点 + 添加文件 或 添加文件夹
- 在「打印页面范围」里填要打的页,在「份数」里填份数
- 不需要打的,把左边的勾去掉
- 点 批量打印设置 选打印机和清晰度
- 点 开始打印
| 写法 | 含义 |
|---|---|
1-3 |
第 1 到第 3 页 |
1,3,5 |
只打第 1、3、5 页 |
1-3,7 |
第 1 到 3 页,再加第 7 页 |
5 |
只打第 5 页 |
| 留空 | 全部页 |
全部 |
全部页 |
写错了(比如超出实际页数、出现字母)会当场提示,不会打错。
| 档位 | 适用 |
|---|---|
| 150 dpi | 草稿、内部传阅,最快 |
| 200 dpi | 一般文档 |
| 300 dpi | 推荐。表格、合同、试卷都够清晰 |
| 400 dpi | 图片多的文档,渲染较慢 |
pip install pypdfium2 pillow
python pdf_batch_print.py
环境要求:Windows 10/11,Python 3.9+,且安装时勾选了 tcl/tk(tkinter 是界面库)。
双击 重新打包.bat。它会自动检查并安装依赖,然后调用 PyInstaller 打包,最后把产物复制成 PDF批量打印.exe。
也可以手动执行:
pip install pyinstaller
pyinstaller --noconfirm --onefile --windowed --icon app.ico ^
--version-file version_info.txt --name PDFBatchPrint pdf_batch_print.py
打包后可以跑一次自检,确认渲染引擎和打印机都正常:
PDF批量打印.exe --selftest
结果会写到 %TEMP%\pdfprint_selftest.txt。
打印出来内容偏小或留白很多? 程序会按纸张可打印区域等比缩放并居中。如果原 PDF 页面尺寸特殊(比如 A5 排在 A4 纸上),可能是比例问题。检查打印机设置里的纸张尺寸是否和 PDF 页面匹配。
打印位置偏移? 程序按打印机驱动报告的可打印区域绘制,正常情况下不会偏。如果偏了,多半是驱动里的边距设置有问题。
支持双面打印吗? 目前没有直接控制,取决于打印机驱动的默认设置。可以在系统打印机首选项里设成双面。
能打印其他格式吗? 不能。目前只处理 PDF。Word/Excel 需要先另存为 PDF。
支持 macOS / Linux 吗? 不支持。打印部分直接调用 Windows GDI 接口,是 Windows 专用的。
-
界面:tkinter(自绘勾选框和图标,因为 ttk 的控件改不了颜色)
-
渲染:pypdfium2,按 72 dpi 基准缩放
-
打印:ctypes 直接调用
gdi32/winspool.drv,不依赖 pywin32流程:CreateDCW → StartDocW → (StartPage → StretchDIBits → EndPage) × N → EndDoc
-
打包:PyInstaller onefile
StretchDIBits 要求 DIB 每行按 4 字节对齐。少补这个 padding,程序会直接抛
access violation 崩溃。
而且它很隐蔽:如果图片宽度 × 3 刚好能被 4 整除(比如 1240px),完全不会报错; 只有宽度不整除时(比如 A4@300dpi 的 2481px)才崩。用内存 DC 测试也发现不了,必须在真实打印机上才会暴露。
作者:张翀
