• [python]将多张图片合并为单个pdf文件


    前言

    最近有个个人需求是要把多个图片文件合并为一个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)
    
  • 相关阅读:
    【Spring】Spring MVC 程序开发
    el-date-picker自定义只能选中当前月份和半年内月份等
    SpringMVC识 乱码过滤+ajax请求+SpringMVC四种跳转方式和默认的参数类型以及日期处理
    Python函数的默认参数值在定义函数时已经生成,不能使用可变对象
    ECMAScrip-ES6-新变量-let--注意块级作用域
    LeetCode 2258. 逃离火灾:BFS
    Nginx源码:内存池的实现
    数据结构-快速排序“人红是非多”?看我见招拆招
    从零开始的C++(三)
    物联网设备安装相关知识整理
  • 原文地址:https://www.cnblogs.com/XY-Heruo/p/18048750