You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 调整打印机设置

  • 打开打印机属性,切换到「高级」选项卡,把“后台打印”改为直接打印到打印机,让任务按发送顺序实时处理。
  • 检查打印机的任务优先级设置,确保所有打印任务的优先级一致。

验证方法

  1. 运行修改后的脚本,同步观察控制台输出和打印机队列的任务顺序。
  2. 若用合并PDF方案,先打开合并后的文件,确认页面顺序和原文件夹一致后再打印。

内容的提问来源于stack exchange,提问作者jradigan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:03:25