重复多个图像到 PDF 的转换:使用 Python 代码轻松实现自动化
上一篇文章如何将多个图像转换为 PDF?今天,我们将更进一步:如果您从特定文件夹中的子文件夹(A)创建了一个多图像 PDF 文件,而该特定文件夹的另一个子文件夹(B)中还有其他图像,该怎么办?如果一个特定文件夹中混合了已创建 PDF 文件的文件夹和未创建 PDF 文件的文件夹,而您想将每个文件夹转换为 PDF 文件,该怎么办?写下来后就比较难解释了,请看下面的内容,就明白我的意思了。

代码说明:用 Python 进行多图像 PDF 转换
在该代码中, 枕头和 报告实验室 使用库将多个图像自动转换为 PDF。在图像处理和 PDF 创建过程中,您可以浏览目录结构,将多个图像单独转换为 PDF。

1. 加载所需的 Python 库
导入 os
从 PIL 导入图像
从 reportlab.pdfgen 导入 canvas
从 reportlab.lib.pagesizes 导入 portrait第一步是加载必要的库,在本例中是加载 奥斯,PIL"(《世界人权宣言》) 图片和 报告实验室"(《世界人权宣言》) 帆布 和 肖像 使用页面大小选项。
os:浏览目录中的文件并创建路径。枕头 (PIL)说明:打开并处理图像文件。报告实验室PDF:创建 PDF 文件并插入图像。
2. 编写一个图像处理函数
def process_images(c, dir_path):
img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
if img_list:
for img_name in img_list[1:]:
img_path = os.path.join(dir_path, img_name)
img = Image.open(img_path)
img_width, img_height = img.size
c.setPageSize((img_width, img_height))
c.showPage()
c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)该功能是处理图像文件并将其转换为 PDF 的关键部分。
- 图像列表从给定目录中只获取".png "文件,并对其进行排序。
os.listdir(dir_path)将获取目录中的所有文件、if img_name.endswith(".png")该条件只选择 PNG 文件。- 打开图像文件:创建图像路径后
图像.open()打开图像。 - 设置页面大小:
setPageSize()来设置页面大小以适应图像大小。 - 添加图像:
drawInlineImage()将图像插入 PDF 页面。 - showPage():完成页面并准备新页面。
此过程可将每个 PNG 文件转换成一个 PDF 页面。
3. 处理目录内的子目录
def process_subdirs(main_dir, output_dir):
for subdir in os.listdir(main_dir):
subdir_path = os.path.join(main_dir, subdir)
if os.path.isdir(subdir_path):
for second_subdir in os.listdir(subdir_path):
second_subdir_path = os.path.join(subdir_path, second_subdir)
如果 os.path.isdir(second_subdir_path):
pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
if not os.path.exists(pdf_path):
os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
c = canvas.Canvas(pdf_path, pagesize=None)
process_images(c, second_subdir_path)
c.save()
print(f "Generated PDF file: {pdf_path}")该函数负责处理给定主目录下的所有子目录,为每个目录生成一个 PDF 文件。
- os.listdir():获取主目录和子目录下的文件列表。
os.path.isdir()条件来检查它是否是一个目录。- 创建 PDF 文件路径:
os.path.join()来创建 PDF 文件的路径,并且只有在 PDF 文件不存在的情况下才会创建该文件。 - 创建和保存 PDF 文件方法是创建一个画布对象、
process_images()函数来处理图像并保存 PDF 文件。 - os.makedirs()创建一个文件夹来存储 PDF 文件(如果还不存在)。
该功能会遍历目录结构,并自动将每个子目录中的 PNG 文件转换为 PDF。
4. 调用主函数
main_dir = "C:\Users\user\Documents\Book"
output_dir = "C:\Users\user\Documents\Book_pdf"
process_subdirs(main_dir, output_dir)最后,在指定路径上运行 PDF 转换任务。
- 主目录主目录的路径,包括图像。
- 输出目录:保存 PDF 文件的路径。
- process_subdirs() 函数,该函数用于转换主目录中的所有图像并将其保存为 PDF 文件。
完整的 Python 代码
导入 os
从 PIL 导入图像
从 reportlab.pdfgen 导入 canvas
从 reportlab.lib.pagesizes 导入 portrait
def process_images(c, dir_path):
img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
if img_list:
for img_name in img_list[1:]:
img_path = os.path.join(dir_path, img_name)
img = Image.open(img_path)
img_width, img_height = img.size
c.setPageSize((img_width, img_height))
c.showPage()
c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)
def process_subdirs(main_dir, output_dir):
for subdir in os.listdir(main_dir):
subdir_path = os.path.join(main_dir, subdir)
if os.path.isdir(subdir_path):
for second_subdir in os.listdir(subdir_path):
second_subdir_path = os.path.join(subdir_path, second_subdir)
如果 os.path.isdir(second_subdir_path):
pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
if not os.path.exists(pdf_path): # 仅在未创建 PDF 文件时运行
os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
c = canvas.Canvas(pdf_path, pagesize=None)
process_images(c, second_subdir_path)
c.save()
print(f "Generated PDF file: {pdf_path}")
# 起始点
main_dir = "C:\Users\user\Documents\\Book"
output_dir = "C:\Users\user\Documents\Book_pdf"
process_subdirs(main_dir, output_dir)该代码可自动查找多个目录中的 PNG 图像文件并将其转换为 PDF。现在,您也可以使用 Python 高效地处理多个图像到 PDF 的转换任务了!
# 其他说明
我要用 Python 代码来解释我想做的事情,这可能会增加难度,所以我要写一些额外的细节。例如,假设文件夹 A 下有 1、2、3......个子文件夹,文件夹 B 下也有同样的 1、2、3......个子文件夹。文件夹 A 中的每个子文件夹都包含 png 图像文件,因此在完成上述操作后,您将在单个 pdf 文件中看到文件夹 B 中的多个图像,每个图像的文件夹名称相同。
但是,如果我们想不删除文件夹 A 中的图片(pdf 文件已在文件夹 B 中创建),我们就需要编写 Python 代码,以便在执行上述操作时跳过创建 pdf 文件的文件夹 A 的子文件夹。在上面的完整代码中,您可以看到 "#仅在未创建 PDF 文件时运行'就可以了。现在你应该可以轻松地将每个文件夹中的多个图像转换为 PDF 了。






