在看一位up主的“矩阵分析”课程的时候,up主的课件是以图片形式保存在QQ空间的。图片形式不便于学习,所以想要通过Python代码,把保存在“矩阵分析课件”里面的图片,转换为pdf,并保持图片的长宽比例不变,pdf文件以当前时间命令。在添加图片之前对图片文件名进行排序,这样就可以确保PDF中的页面顺序与图片顺序一致。
import os
import datetime
from PIL import Image
from fpdf import FPDF
# 图片所在文件夹路径
img_folder = "矩阵分析课件"
# 获取文件夹中的所有文件
images = [img for img in os.listdir(img_folder) if img.endswith(".jpg") or img.endswith(".png") or img.endswith(".jpeg")]
# 按照文件名排序
images.sort()
# 创建一个pdf对象
pdf = FPDF(unit="mm")
# 遍历每一个图片
for i in range(len(images)):
img_path = os.path.join(img_folder, images[i])
# 使用PIL库打开图片并获取尺寸
img = Image.open(img_path)
width, height = img.size
# 转换尺寸单位到毫米
width_mm = width * 0.264583
height_mm = height * 0.264583
# 把图片添加到pdf
pdf.add_page(format=(width_mm, height_mm))
pdf.image(img_path, x = 0, y = 0, w = width_mm, h = height_mm)
# 以当前时间命名PDF文件
now = datetime.datetime.now()
pdf_name = now.strftime("%Y-%m-%d_%H-%M-%S") + ".pdf"
# 保存pdf文件
pdf.output(pdf_name, "F")
下面是对每一部分代码的详细解释:
导入必要的库:
import os
import datetime
from PIL import Image
from fpdf import FPDF
这里我们导入了四个库:os,datetime,PIL和fpdf。os和datetime库是Python的内置库,用于处理操作系统和时间相关的操作。PIL(Pillow)是一个图像处理库,我们用它来获取图像的尺寸。FPDF库用于创建和编辑PDF文件。
指定图像所在的文件夹,并获取所有的图像文件:
# 图片所在文件夹路径
img_folder = "矩阵分析课件"
# 获取文件夹中的所有文件
images = [img for img in os.listdir(img_folder) if img.endswith(".jpg") or img.endswith(".png") or img.endswith(".jpeg")]
# 按照文件名排序
images.sort()
这部分代码首先设置图像所在文件夹的路径,然后使用os库的listdir函数获取该文件夹中的所有文件名。列表推导式用于过滤出.jpg、.png和.jpeg的图片文件,并把它们的名称添加到列表中。最后,对列表中的文件名进行排序。
创建FPDF对象并遍历每一张图片:
# 创建一个pdf对象
pdf = FPDF(unit="mm")
# 遍历每一个图片
for i in range(len(images)):
img_path = os.path.join(img_folder, images[i])
# 使用PIL库打开图片并获取尺寸
img = Image.open(img_path)
width, height = img.size
# 转换尺寸单位到毫米
width_mm = width * 0.264583
height_mm = height * 0.264583
# 把图片添加到pdf
pdf.add_page(format=(width_mm, height_mm))
pdf.image(img_path, x = 0, y = 0, w = width_mm, h = height_mm)
首先,创建一个FPDF对象,设置单位为毫米。然后,遍历每一张图片,使用PIL库打开图片并获取尺寸,然后将图片尺寸从像素转换为毫米。最后,为每一张图片添加一个新的页面,并将图片添加到该页面上。每个页面的尺寸都会根据其对应的图片的尺寸进行设置。
使用当前时间来命名并保存PDF文件:
# 以当前时间命名PDF文件
now = datetime.datetime.now()
pdf_name = now.strftime("%Y-%m-%d_%H-%M-%S") + ".pdf"
# 保存pdf文件
pdf.output(pdf_name, "F")
这部分代码首先获取当前的日期和时间,然后使用strftime函数将时间格式化为字符串,并作为PDF文件的名称。最后,使用FPDF对象的output方法保存PDF文件。