前言
最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。(比如看漫画)
主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果有大量图片文件,用WPS就不太方便了。
现成的工具找不到,索性自己整一个。python的pillow库和pypdf2库就可以实现这样的需求。
安装依赖库
本地的python版本为3.11。注意pypdf2升级到3.0版本后,一些类和方法和版本2有些区别。
python -m pip install PyPDF2==3.0.1 pillow==10.2.0
示例代码
目录结构示例
├── images
│ ├── 00001.jpg
│ ├── 00002.jpg
│ ├── 00003.jpg
│ ├── 00004.jpg
│ ├── 00005.jpg
│ ├── 00006.jpg
│ ├── 00007.jpg
│ ├── 00008.jpg
│ ├── 00009.jpg
│ └── 00010.jpg
├── main.py
└── temp
其中main.py内容如下
from PIL import Image
import os
import re
from PyPDF2 import PdfMerger
images_dir = "images"
tmpdir = "temp"
def trans_jpg2pdf(jpg_list: list) -> list:
"""jpg图片转换成pdf
Args:
jpg_list (list): 图片文件列表
Returns:
list: 图片转换后的pdf文件列表
"""
pdf_list = []
for jpg in jpg_list:
jpg_path = os.path.join(images_dir, jpg)
pdf_file = jpg.replace('.jpg', '.pdf')
pdf_path = os.path.join(tmpdir, pdf_file)
if os.path.exists(pdf_path):
os.remove(pdf_path)
pdf_list.append(pdf_path)
im = Image.open(jpg_path)
im.save(pdf_path, 'PDF', resolution=100.0)
return pdf_list
def merge_pdf(pdf_list: list, result_pdf: str = "result.pdf"):
""" 合并pdf文件
Args:
pdf_list (list): pdf文件列表
result_pdf (str): 合并后的pdf文件名称
"""
sorted_list = sorted(pdf_list, key=lambda x: int(re.search(r'\d+', x).group()))
f_merger = PdfMerger()
for pdf in sorted_list:
f_merger.append(pdf)
if os.path.exists(result_pdf):
os.remove(result_pdf)
f_merger.write(result_pdf)
if __name__ == '__main__':
jpg_list = [f for f in os.listdir(images_dir) if f.endswith(".jpg")]
pdf_list = trans_jpg2pdf(jpg_list)
merge_pdf(pdf_list, "result.pdf")
补充
- webp格式文件转PDF示例
from PIL import Image
im = Image.open("00033.webp")
rgb_im = im.convert("RGB")
rgb_im.save("00033.pdf", 'PDF', resolution=100.0)
评论区