【Python小技巧】使用python一键批量按顺序打印目录下所有文件(pdf,word、图片统统一起打印,不想打印的也可以跳过,限制打印解除限制再打印)
文章目录
前言
为迎接检查,需要提供很多文件,还要求打印。
打印文件本身没什么难度,问题是批量打印文件,文件还在不同目录,目录还套目录,还要求按顺序打印,有pdf文件,还有图片,一个一个文件打开,一个一个点打印,再按顺序归档,这谁记得住啊!
不行,我得找python帮忙!
一、批量打印文件二三事
- 文件再多,目录再多,我们用一个os.walk(directory)就可遍历目录了。逐个按顺序打印,那就不在话下了。
for root, dirs, files in os.walk(directory):
# 获取目录中所有文件和文件夹的名字
for file in files:
win32api.ShellExecute(0, "print", file, None, ".", 0)
- pdf、word等文件直接打印就OK。Excel文件比较特殊,有些表格超出了打印区域,需要手工调节一下再打印。所以目录下这些文件需要跳过。
# 跳过指定扩展名的文件,避免误打印。Excel文件因为表格多,有些不再一页内,建议单独打印。
if os.path.isfile(filename) and file.lower().endswith(skip_ext):continue
- 打印途中碰到图片文件,python打印罢工了。这个可怎么好?对了,把它们转成pdf再打印不就OK了吗?
def convert_images_to_pdf(image_path_list, output_path):
# 传入图片路径列表,将其按顺序合成pdf文件
from PIL import Image # pip install Pillow 安装此包
images = []
for image_path in image_path_list:
image = Image.open(image_path)
images.append(image.convert("RGB"))
images[0].save(output_path, save_all=True, append_images=images[1:])
print(f'将所有图片合成为PDF文件:{output_path}')
- 咦?打印个文件还有报错:无法打印此文件。仔细检查,有些pdf文件设置了禁止打印的权限。这个嘛,也难不倒咱。
def decrypt_pdf(filepath):
# 碰到不能打印的PDF,使用这个转存一下
import pikepdf
with pikepdf.open(filepath) as pdf:
file = filepath.replace(".pdf", "")
newfile = f"{file}_转存非加密文件.pdf"
pdf.save(newfile)
return newfile
二、批量打印文件完整代码
import os,time
import win32api
def convert_images_to_pdf(image_path_list, output_path):
# 传入图片路径列表,将其按顺序合成pdf文件
from PIL import Image # pip install Pillow 安装此包
images = []
for image_path in image_path_list:
image = Image.open(image_path)
images.append(image.convert("RGB"))
images[0].save(output_path, save_all=True, append_images=images[1:])
print(f'将所有图片合成为PDF文件:{output_path}')
def decrypt_pdf(filepath):
# 碰到不能打印的PDF,使用这个转存一下
import pikepdf
with pikepdf.open(filepath) as pdf:
file = filepath.replace(".pdf", "")
newfile = f"{file}_转存非加密文件.pdf"
pdf.save(newfile)
return newfile
def print_file(filename):
# 打印单个文件
win32api.ShellExecute(0, "print", filename, None, ".", 0)
def print_files_in_directory(directory,skip_ext=('.xlsx', '.xls', '.doc', '.docx', '.pdf'),img_ext=('.png', '.jpg', '.jpeg', '.bmp')):
# 打印目录下所有文件
image_path_list = []
for root, dirs, files in os.walk(directory):
# 获取目录中所有文件和文件夹的名字
for file in files:
filename = os.path.join(root, file)
# 跳过指定扩展名的文件,避免误打印。Excel文件因为表格多,有些不再一页内,建议单独打印。
if os.path.isfile(filename) and file.lower().endswith(skip_ext):continue
# 遇到图片文件,将其路径保存到列表image_path_list,后续合成pdf后打印
if os.path.isfile(filename) and file.lower().endswith(img_ext):image_path_list.append(filename)
print(f'准备开始打印文件{filename}')
win32api.ShellExecute(0, "print", filename, None, ".", 0)
# 频繁打印容易导致电脑卡顿,故打印一个文件停一会儿等待打印机输出。
time.sleep(10)
# 如果有图片则将清单合成为PDF文件后打印,单独打印图片太慢
if image_path_list:
print(f'图片文件路径列表image_path_list:\n{image_path_list}')
output_path = r'd:\image2pdf_temp.pdf'
convert_images_to_pdf(image_path_list, output_path)
print(f'准备开始打印图片合成PDF文件{output_path}')
win32api.ShellExecute(0, "print", output_path, None, ".", 0)
print('所有文件已打印完毕!')
if __name__ == '__main__':
print_files_in_directory(r'D:\需打印文件包\材料',skip_ext=('.xlsx', '.xls')) # 修改为自己的文件路径,skip_ext表示哪些扩展名的文件跳过打印
if 0:
# 碰到不能打印的PDF,使用这个转存一下再打印
filepath = r'D:\需打印文件包\材料\限制打印的文件.pdf'
newfile = decrypt_pdf(filepath)
print_file(newfile)
总结
以上方法,经过实践,批量打印几千个文件,那就是喝杯咖啡的事儿。
别人还在忙着打开目录,打开文件,打印文件,关闭文件,再打开再打印再关闭。你只需要运行一下,就可以去泡杯咖啡去品尝了。只要打印机纸墨管够,剩下的就是打印完去拿回来就完成了。
如果有帮到你,不妨用您发财的小手打赏一杯咖啡钱,让我们一同分享轻松办公的喜悦!
作者:IT里的交易员