【Python小技巧】使用python一键批量按顺序打印目录下所有文件(pdf,word、图片统统一起打印,不想打印的也可以跳过,限制打印解除限制再打印)


前言

为迎接检查,需要提供很多文件,还要求打印。
打印文件本身没什么难度,问题是批量打印文件,文件还在不同目录,目录还套目录,还要求按顺序打印,有pdf文件,还有图片,一个一个文件打开,一个一个点打印,再按顺序归档,这谁记得住啊!

不行,我得找python帮忙!


一、批量打印文件二三事

  1. 文件再多,目录再多,我们用一个os.walk(directory)就可遍历目录了。逐个按顺序打印,那就不在话下了。
    for root, dirs, files in os.walk(directory):
        # 获取目录中所有文件和文件夹的名字
        for file in files:
        	win32api.ShellExecute(0, "print", file, None, ".", 0)
  1. pdf、word等文件直接打印就OK。Excel文件比较特殊,有些表格超出了打印区域,需要手工调节一下再打印。所以目录下这些文件需要跳过。
            # 跳过指定扩展名的文件,避免误打印。Excel文件因为表格多,有些不再一页内,建议单独打印。
            if os.path.isfile(filename) and file.lower().endswith(skip_ext):continue
  1. 打印途中碰到图片文件,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}')
  1. 咦?打印个文件还有报错:无法打印此文件。仔细检查,有些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)
    

总结

以上方法,经过实践,批量打印几千个文件,那就是喝杯咖啡的事儿。

别人还在忙着打开目录,打开文件,打印文件,关闭文件,再打开再打印再关闭。你只需要运行一下,就可以去泡杯咖啡去品尝了。只要打印机纸墨管够,剩下的就是打印完去拿回来就完成了。

如果有帮到你,不妨用您发财的小手打赏一杯咖啡钱,让我们一同分享轻松办公的喜悦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT里的交易员

分享是一种快乐,打赏是一种肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值