小
小y同学
V1
2023/05/03阅读:26主题:全栈蓝
Python制作图片批量合成PDF工具
「由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~」
针对没有找到合适的批量将图片合成为 PDF 的工具,而寻思基于 Python 的 PIL 图像处理模块和 fpdf 模块制作的图片转 PDF 脚本。
1 所需模块
1 PIL 库
PIL 库是 Python 的第三方图像处理库,为 Python 提供了强大的图像处理功能,这里主要是为了方便获取图片大小而根据创建对应的 PDF 页面。
2 fpdf 库
fpdf 库是一个pdf生成器,可以用它来生成pdf。
3 os模块
Python支持的一个系统模块,主要是用于获取文件路径,获取文件夹下面的内容。
小注
PIL库和fpdf库均是Python的第三方库,需要使用pip命令安装。
pip install PIL
pip install fpdf
2 具体实现步骤
1 获取文件夹下面的所有图片
使用os模块可以获取文件路径下所有的图片名称。
def GetPig(file_path, Pformat):
"""
获取图片列表
:param file_path: 含有图片文件夹的路径
:param Pformat: 图片的格式,png,jpg;
此处不支持多种格式如有需要可以改写
:return: 图片名称列表,含后缀
"""
img_list = [i for i in os.listdir(file_path)
if i.endswith(f".{Pformat}")]
return img_list
可以打印函数返回值如下:

2 获取图片的大小
使用PIL库的Image类来获取图片的宽度。
def GetPigSize(pig_path):
"""
获取图片大小
:param pig_path: 图片的路径
:return: 图片的宽度和高度
"""
cover = Image.open(pig_path)
width, height = cover.size # 获取图片大小
return width, height
3 将图片依次写入 PDF
使用fpdf来生成pdf。
def CreatPDF(width, height, PDFName, img_list, file_path):
# 创建pdf对象,format为页面的尺寸
pdf = FPDF(unit="pt", format=[width, height])
img_list.sort(key=lambda x: int(x[:-4])) # 按照数字排序
for i in img_list:
print(f"{PDFName}正在处理{i}")
pdf.add_page()
# 添加图片,0,0为图片的起始位置
pdf.image(file_path + "/" + i, 0, 0)
pdf.output(f"{PDFName}.pdf", "F")
print(f"{PDFName},pdf ----------pdf生成完成")
3 完整源码
# _*_coding:utf-8_*_
# created by cy on 2023/5/3
import os
from PIL import Image
from fpdf import FPDF
def GetPig(file_path, Pformat):
"""
获取图片列表
:param file_path: 含有图片文件夹的路径
:param Pformat: 图片的格式,png,jpg;
此处不支持多种格式如有需要可以改写
:return: 图片名称列表,含后缀
"""
img_list = [i for i in os.listdir(file_path)
if i.endswith(f".{Pformat}")]
return img_list
def GetPigSize(pig_path):
"""
获取图片大小
:param pig_path: 图片的路径
:return: 图片的宽度和高度
"""
cover = Image.open(pig_path)
width, height = cover.size # 获取图片大小
return width, height
def CreatPDF(width, height, PDFName, img_list, file_path):
# 创建pdf对象,format为页面的尺寸
pdf = FPDF(unit="pt", format=[width, height])
img_list.sort(key=lambda x: int(x[:-4])) # 按照数字排序
for i in img_list:
print(f"{PDFName}正在处理{i}")
pdf.add_page()
# 添加图片,0,0为图片的起始位置
pdf.image(file_path + "/" + i, 0, 0)
pdf.output(f"{PDFName}.pdf", "F")
print(f"{PDFName},pdf ----------pdf生成完成")
if __name__ == '__main__':
# todo 设置图片的路径
filePath = "test_pig"
# 获取图片名称列表
img_list = GetPig(filePath, "png")
# 获取图片的大小
width, height = GetPigSize(f"{filePath}/{img_list[0]}")
CreatPDF(width, height, "test", img_list, filePath)
4 注意事项
-
本程序目前只适合图片格式单一的情况,对于图片格式复杂的情况暂未考虑进去。 -
本程序由于需要合成pdf的图片已经由另外一个脚本提前获取到,所以命名上面有一定的规则,目前就本程序而言,想设置图片顺序,只能从图片名称下手。 -
程序目前在Windows系统上表现良好,对于Linux和Mac系统可能会由于文件路径的分隔符不同而产生报错现象。 -
程序总有不足之处,欢迎读者批评指正!
-
「路虽远,行则将至;事虽难,做则必成。希望认真学习的你能够有所收获!」
-
「本公众号的原创成果,在未经允许的情况下,请勿用于任何商业用途!」
-
「您的点赞、收藏与关注是我创作的最大动力!」


作者介绍
小
小y同学
V1