花10分钟写一个Python脚本,解决了初中老师一下午的工作

82 篇文章 0 订阅
80 篇文章 0 订阅

有个朋友是一个初中老师。嗯,教学行政两手抓的那种初中老师。

一天晚上突然微信问我,怎么把图片转成PDF。懵了一下,这个直接打印成PDF不就可以了?

遂告诉他,结果感觉两个人不是一个世界的:

 

好不容易教他把图片放Word里面打印,结果发现他的需求并不止于此:

没辙,送佛送到西呗。继续挖他的需求:

还有需要特殊处理的地方:

 

提炼了一下他的需求:

  1. 有两百多张用手机拍的学生XXX档案资料;
  2. 已经按照每个学生的名字编好了号;
  3. 需要每个学生按照顺序 + 公共的图片,组合成一个新的PDF文件;
  4. 生成的文件体积大小需要在20MB以内;

现状是这样的图片文件:

需要按照一定的图片顺序进行排序并转换PDF。

总结起来,也就是处理文件,将图片拼接组合成PDF。这个小需求,用Python实现起来轻轻松松。

梳理一下这个任务的几个关键点:

缩放图片

因为图片是用手机拍摄的,现有的手机动不动就是几千万的像素。拍一张照片,十几兆的大小是逃不了的。而需求最终每一个PDF的大小不超过20MB,缩放图片是必须要做的。

在 Python 中处理图片很经典的第三方模块是 Pillow,通过它可以对图像进行各种操作,当然也不限于缩小图片。

# 缩放图片

dir_list = os.listdir(dir_path)

new_path = r"D:\Documents\Tencent Files\3280350050\FileRecv\new"

for f in dir_list:

    if f.endswith('.jpg'):

        img = Image.open(dir_path+'\\'+f)

        new_size = img.resize((1401,1867))

        new_size.save(new_path + '\\' + f)

上述代码就把图片缩小到了1401*1867像素大小。

图片转PDF

在这个任务里面,核心的需求是把图片转成 PDF 格式的文件。Python 中图片转 PDF 的功能有很多模块可以实现,在此州的先生选用的是 img2pdf。

直接调用img2pdf.convert()方法,将图片路径或图片列表路径作为参数传递进去,就可以得到一个转换好的 PDF 文件对象。

# 新建单个PDF文件with open(new_path+'\\'+'{}_1.pdf'.format(name),'wb') 
as pdf_file:    a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297)) 
# 创建A4纸格式    layout_fun = img2pdf.get_layout_fun(a4inpt) 
# 设置A4纸格式    # PDF写入图片    
pdf_file.write(        img2pdf.convert(            img_list,            # layout_fun=layout_fun        )    )

其 PyPI 的链接为:https://pypi.org/project/img2pdf/ ,感兴趣的朋友可以详细地了解其使用方法。

图像排列规则

因为需要按照一定的顺序对照片进行排序,然后还有一个特殊的情况,所以在对原始图片进行遍历的时候,需要进行一番处理,最后生成每一个人的图片的列表。

# 生成单个名称的图片列表

for name in sorted(name_list,reverse=False):
    print(ame)

    if name == '***': # 特殊情况学生的名字

        img_list = []

        for f in dir_list:

            print(f)

            file_name, file_suffix = f.split('.')

            file_sort = int(file_name[-1])

            if name == file_name[:-1]:

                if file_sort == 3:

                    img_list.insert(4, new_path + '\\' + f)

                else:

                    img_list.insert(int(file_name[-1]) - 1, new_path + '\\' + f)

        img_list.insert(1, new_path + '\\' + '公共1.jpg')

        img_list.insert(3, new_path + '\\' + '公共2.jpg')



        img_list.insert(9, new_path + '\\' + '公共4.jpg')

        img_list.insert(10, new_path + '\\' + '公共5.jpg')

        img_list.insert(11, new_path + '\\' + '公共6.jpg')



        print(img_list)

    else:

        img_list = []

        for f in dir_list:

            print(f)

            file_name,file_suffix = f.split('.')

            file_sort = int(file_name[-1])

            if name == file_name[:-1]:

                if file_sort == 3:

                    img_list.insert(5,new_path+'\\'+f)

                else:

                    img_list.insert(int(file_name[-1])-1,new_path+'\\'+f)

        img_list.insert(1,new_path+'\\'+'公共1.jpg')

        img_list.insert(3, new_path + '\\' + '公共2.jpg')

        img_list.insert(4, new_path + '\\' + '公共3.jpg')



        img_list.insert(9, new_path + '\\' + '公共4.jpg')

        img_list.insert(10, new_path + '\\' + '公共5.jpg')

        img_list.insert(11, new_path + '\\' + '公共6.jpg')



        print(img_list)

完整步骤

在对任务的关键点有了认识之后,我们按照流程,就可以轻松完成这个任务。

  1. 遍历原始图片文件夹,缩小图片,并将其另存到另一个文件夹;
  2. 遍历新图片的文件夹,生成除了公共图片之外的所有学生姓名列表;
  3. 遍历学生姓名列表,按照指定的图片排序规则,生成每个学生的图片列表;
    3.1 生成每个学生的图片列表之后,新建一个文件,将图片列表转为PDF;

以上4步,就完成了这个手工操作浪费时间且令人抓狂的任务。运行代码不出一分钟,所有学生的PDF文件都已生成完成:

算上找模块的时间,花在代码上的时间满打满算20分钟。

瞬间把一个快炸毛的老师:

 

的毛给顺了下去:

 最后

为了帮助大家更好的学习Python,小编给大家准备了一份Python学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,需要获取方式:扫描下方即可获取。

👉Python学习路线汇总

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

👉精品Python学习书籍👈

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

温馨提示:篇幅有限,已打包文件夹,获取方式:点击这里【 Python全套资料】 或扫描下方即可获取。

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

​​​

👉100道Python练习题👈

​​​

👉面试刷题👈

​​​

​​​

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

获取方式:点击这里【 Python全套资料】 或扫描下方即可获取。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值