
有个朋友是一个初中老师。嗯,教学行政两手抓的那种初中老师。
一天晚上突然微信问我,怎么把图片转成PDF。懵了一下,这个直接打印成PDF不就可以了?
遂告诉他,结果感觉两个人不是一个世界的:

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

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

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

提炼了一下他的需求:
现状是这样的图片文件:

需要按照一定的图片顺序进行排序并转换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 格式的文件。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(name)
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)
在对任务的关键点有了认识之后,我们按照流程,就可以轻松完成这个任务。
以上4步,就完成了这个手工操作浪费时间且令人抓狂的任务。运行代码不出一分钟,所有学生的PDF文件都已生成完成:

算上找模块的时间,花在代码上的时间满打满算20分钟。
瞬间把一个快炸毛的老师:

的毛给顺了下去:

如果需要源代码参考,请添加州的先生微信号:taoist_ling