我遇到过一个需求,按顺序打印一个文件夹内多份pdf文件。其中有的文件几页,有的文件五六十页。我参考了其他一些人的打印程序,虽然能用,但是最后打印顺序是混乱的。普通的sleep能有效按顺序打印几页的文件,但是一遇到几十页的就会失效。
以下是我参考了其他人的代码及微软官方api写出的代码,因为实际需求比较复杂,因此我只贴出核心部分的代码。
# order_to_print_file为数组,每一项为需打印文件的绝对路径,将按数组顺序打印
def to_print(order_to_print_file):
while True:
flag = input('您是否确定打印以上文件?(y/n):')
if flag == 'y':
print('正在打印......')
default_printers = win32print.GetDefaultPrinter() # 获取默认打印机的名称
handle = win32print.OpenPrinter(default_printers) # 获取打印机的handle
for file in order_to_print_file:
if os.path.exists(file):
win32api.ShellExecute(0, "print", file, '/d:"%s"' % win32print.GetDefaultPrinter(), ".", 0) # 这个是执行打印的命令,按照默认打印设置打印
time.sleep(2) # sleep一下才能有效获取打印机的队列,特别是遇到大文件。文件非常大可适当增加sleep的时间
tasks = win32print.EnumJobs(handle,0, -1, 1) # 按顺序打印的核心
if tasks:
print('任务阻塞中,正持续打印,请稍等...')
while tasks: # 发现打印队列中有任务就持续sleep直到打印完成
time.sleep(2)
tasks = win32print.EnumJobs(handle, 0, -1, 1)
break
elif flag == 'n':
print('正在取消打印,如有需要请重试。')
break
else:
print('请正确输入指令(y/n)!')
按顺序打印,起关键的是获取打印队列的命令EnumJobs。
参考:EnumJobs 函数 (Winspool.h) - Win32 apps | Microsoft Docs
使用python的win32模块打印PDF_揭晖的博客-CSDN博客_python win32print
Python监控打印机队列_IT蜗壳_IT蜗壳-Tango_InfoQ写作社区
如果你不要求双面打印,有个最简单的方法是将全部pdf合并成一个pdf再打印
如果需要边打印边工作,推荐使用福昕pdf阅读器,可以挂后台让它自己打印。用Adobe Acrobat会一闪一闪的白屏,十分影响。