Python脚本打印目录PDF无法保持原顺序问题求助
解决PDF打印队列顺序与脚本输出不一致的问题
问题核心
控制台输出的文件顺序正确,但打印机队列出现数字串序(如1、11、12…2、3),且常规排序方法无效,本质是脚本按顺序发送任务,但系统/打印机的异步处理逻辑打乱了队列顺序——哪怕你同步调用打印命令,打印机可能因任务大小、后台调度优先级,导致后发的任务先进入处理队列。
实用解决方案
1. 强制等待上一个任务完成再发下一个
通过监控打印任务状态,确保每个PDF打印完成后再发送下一个,从根源上保证顺序。以Windows平台为例:
import os import win32print import win32api from natsort import natsorted def wait_for_job_done(printer_name, job_id): while True: printer_handle = win32print.OpenPrinter(printer_name) jobs = win32print.EnumJobs(printer_handle, 0, -1, 1) win32print.ClosePrinter(printer_handle) job_exist = False for job in jobs: if job["JobId"] == job_id: job_exist = True # 检查任务是否完成 if job["Status"] & win32print.JOB_STATUS_COMPLETE: return break if not job_exist: # 任务已从队列移除,视为完成 return def print_pdfs_in_order(folder_path): default_printer = win32print.GetDefaultPrinter() # 自然排序获取PDF列表 pdf_list = natsorted([f for f in os.listdir(folder_path) if f.lower().endswith(".pdf")]) for pdf_file in pdf_list: full_path = os.path.join(folder_path, pdf_file) print(f"开始打印: {pdf_file}") # 发送打印任务并获取任务ID job_id = win32api.ShellExecute( 0, "print", full_path, f'/d:"{default_printer}"', ".", 0 ) # 等待当前任务完成 wait_for_job_done(default_printer, job_id) if __name__ == "__main__": print_pdfs_in_order("你的PDF文件夹路径")
2. 合并所有PDF为单个文件再打印
把所有PDF按顺序合并成一个文件,一次性发送打印请求,彻底避免队列顺序问题:
import os from PyPDF2 import PdfMerger from natsort import natsorted import win32api import win32print def merge_and_print(folder_path): pdf_paths = natsorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith(".pdf")]) merged_file = os.path.join(folder_path, "temp_merged.pdf") # 合并PDF merger = PdfMerger() for pdf in pdf_paths: merger.append(pdf) merger.write(merged_file) merger.close() # 打印合并文件 default_printer = win32print.GetDefaultPrinter() win32api.ShellExecute( 0, "print", merged_file, f'/d:"{default_printer}"', ".", 0 ) print("所有PDF已合并并提交打印") # 可选:打印完成后删除临时文件 # os.remove(merged_file) if __name__ == "__main__": merge_and_print("你的PDF文件夹路径")
3. 调整打印机设置
- 打开打印机属性,切换到「高级」选项卡,把“后台打印”改为直接打印到打印机,让任务按发送顺序实时处理。
- 检查打印机的任务优先级设置,确保所有打印任务的优先级一致。
验证方法
- 运行修改后的脚本,同步观察控制台输出和打印机队列的任务顺序。
- 若用合并PDF方案,先打开合并后的文件,确认页面顺序和原文件夹一致后再打印。
内容的提问来源于stack exchange,提问作者jradigan
相关产品推荐
相关产品推荐

