Python 多张图片合并成一个pdf的参考示例

作者:临时营地 时间:2021-10-15 23:32:45 

目录
  • 过程

    • 拍照

    • 用到的Python 操作库

    • Python遍历文件夹获取图片

    • 旋转图片展示方向并压缩像素

  • 整体代码

    • 整体代码

      • 将脚本打包成exe

        • 安装 PyInstaller

        • 打包脚本

      • 总结

        过程

        拿到一个需求最重要的就是将大块任务拆分成一个个小模块,逐个击破。

        拍照

        这一步首先是将所有的书页拍好,需要注意的是要按照书的页码来拍,因为后面的排序是按照文件名进行排序的,拍照的文件名基本上是按照时间生成的,如果拍的时候乱了,到时候生成的 pdf 里面的页码也会乱掉。

        用到的Python 操作库

        Python 最好的地方就是有大量的第三方库能帮我们快速实现我们想要的方法,搜索到了两个库, PyFPDF 和img2pdf,我们这里选择img2pdf来完成我们的需求 pip install img2pdf

        Python遍历文件夹获取图片


           dirname = "f:/wlzcool"
           imgs = []
           for fname in os.listdir(dirname):
               if not fname.endswith(".jpg"):
                   continue
               path = os.path.join(dirname, fname)
               if os.path.isdir(path):
                   continue
               imgs.append(path)

        需要注意图片的文件名如果是纯数字且位数不一样,排序会为1之后是10而不是2,需要进行一个排序,如果是手机拍的文件就没有这个问题。 files.sort(key=lambda x: int(x[:-4]))

        旋转图片展示方向并压缩像素

        有的时候手机拍出来的图片是水平的,需要将其改为竖直的
        用rotate旋转方向的时候需要注意加上expand=True 这个参数,否则会有黑边出现。

        手机的照片像素太高,有的需要进行压缩以保证最后生成的pdf的大小适中。


           img = Image.open(path)    
           if img.size[0] > img.size[1]:
               im_rotate = img.rotate(90, expand=True)
               size = (int(im_rotate.size[0] / 3), int(im_rotate.size[1] / 3))
               im_rotate = im_rotate.resize(size)
               im_rotate.save(savepath, quality=95)
           else:
               size = (int(img.size[0] / 3), int(img.size[1] / 3))
               img = img.resize(size)
               img.save(savepath, quality=95)

        整体代码

        写成脚本需要考虑的有很多,为了方便使用,需要将各种参数改为允许用户输入的。比如图片文件夹所在的路径,压缩比之类的


        from PIL import Image
        import os
        import img2pdf

        flag = False
        while not flag:
           dirname = input("请输入图片文件夹所在路径(例如d:/wlzcool):")
           flag = os.path.exists(dirname)
           if not flag:
               print("图片文件夹所在路径不存在!")
        saveflag = False
        while not saveflag:
           savedirname = input("请输入目标图片文件夹所在路径(例如d:/wlzcool2):")
           saveflag = os.path.exists(savedirname)
           if not saveflag:
               print("图片文件夹所在路径不存在!")
               automakedir = input("是否自动创建对应文件夹?(是Y/否N):")
               if automakedir.strip().upper() == "Y":
                   os.makedirs(savedirname)
                   saveflag = True
        files = os.listdir(dirname)
        reductionFactor = int(input("请输入长宽压缩比(例如3):"))
        if reductionFactor <= 0:
           reductionFactor = 3
        isConvertBlack = input("是否输出黑白版本?(是Y/否N):").strip().upper() == "Y"
        for fname in files:
           if not fname.endswith(".jpg"):
               continue
           path = os.path.join(dirname, fname)
           savePath = os.path.join(savedirname, fname)
           if os.path.isdir(path):
               continue
           img = Image.open(path)    
           if img.size[0] > img.size[1]:
               im_rotate = img.rotate(90, expand=True)
               size = (int(im_rotate.size[0] / reductionFactor), int(im_rotate.size[1] / reductionFactor))
               im_rotate = im_rotate.resize(size)
               if isConvertBlack:
                   im_rotate = im_rotate.convert("L")
               im_rotate.save(savePath, quality=95)
           else:
               size = (int(img.size[0] / reductionFactor), int(img.size[1] / reductionFactor))
               img = img.resize(size)
               if isConvertBlack:
                   img = img.convert("L")
               img.save(savePath, quality=95)
        filename = input("请输入输出文件名(例如:第一章):")
        with open(filename + ".pdf", "wb") as f:
           imgs = []
           files = os.listdir(savedirname)
           for fname in files:
               if not fname.endswith(".jpg"):
                   continue
               path = os.path.join(savedirname, fname)
               if os.path.isdir(path):
                   continue
               imgs.append(path)
           f.write(img2pdf.convert(imgs))

        整体代码

        写成脚本需要考虑的有很多,为了方便使用,需要将各种参数改为允许用户输入的。比如图片文件夹所在的路径,压缩比之类的


        from PIL import Image
        import os
        import img2pdf

        flag = False
        while not flag:
           dirname = input("请输入图片文件夹所在路径(例如d:/wlzcool):")
           flag = os.path.exists(dirname)
           if not flag:
               print("图片文件夹所在路径不存在!")
        saveflag = False
        while not saveflag:
           savedirname = input("请输入目标图片文件夹所在路径(例如d:/wlzcool2):")
           saveflag = os.path.exists(savedirname)
           if not saveflag:
               print("图片文件夹所在路径不存在!")
               automakedir = input("是否自动创建对应文件夹?(是Y/否N):")
               if automakedir.strip().upper() == "Y":
                   os.makedirs(savedirname)
                   saveflag = True
        files = os.listdir(dirname)
        reductionFactor = int(input("请输入长宽压缩比(例如3):"))
        if reductionFactor <= 0:
           reductionFactor = 3
        isConvertBlack = input("是否输出黑白版本?(是Y/否N):").strip().upper() == "Y"
        for fname in files:
           if not fname.endswith(".jpg"):
               continue
           path = os.path.join(dirname, fname)
           savePath = os.path.join(savedirname, fname)
           if os.path.isdir(path):
               continue
           img = Image.open(path)    
           if img.size[0] > img.size[1]:
               im_rotate = img.rotate(90, expand=True)
               size = (int(im_rotate.size[0] / reductionFactor), int(im_rotate.size[1] / reductionFactor))
               im_rotate = im_rotate.resize(size)
               if isConvertBlack:
                   im_rotate = im_rotate.convert("L")
               im_rotate.save(savePath, quality=95)
           else:
               size = (int(img.size[0] / reductionFactor), int(img.size[1] / reductionFactor))
               img = img.resize(size)
               if isConvertBlack:
                   img = img.convert("L")
               img.save(savePath, quality=95)
        filename = input("请输入输出文件名(例如:第一章):")
        with open(filename + ".pdf", "wb") as f:
           imgs = []
           files = os.listdir(savedirname)
           for fname in files:
               if not fname.endswith(".jpg"):
                   continue
               path = os.path.join(savedirname, fname)
               if os.path.isdir(path):
                   continue
               imgs.append(path)
           f.write(img2pdf.convert(imgs))

        将脚本打包成exe

        不是所有的电脑都有Python环境,我们需要将脚本打包成exe方便在任意一台电脑上使用。 使用 PyInstaller 来进行脚本的打包

        安装 PyInstaller

        pip install pyinstaller

        打包脚本

        在脚本所在的路径的cmd中执行以下命令即可


        pyinstaller -F yourprogram.py

        总结

        人生苦短,我用 Python,在强大的第三方库帮助下,我们只需很少的时间就可以开发一个很有意思的小功能。

        来源:https://juejin.cn/post/6971218428128411684

        标签:python,图片合成,pdf
        0
        投稿

        猜你喜欢

      • 从开发人员角度看IE8的开发新特性

        2010-02-26 10:48:00
      • 使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

        2023-08-26 23:12:32
      • JSP组件commons-fileupload实现文件上传

        2023-07-03 03:16:01
      • asp如何定义参数?

        2010-05-16 15:20:00
      • Python基于正则表达式实现文件内容替换的方法

        2023-08-23 00:14:09
      • php中对象引用和复制实例分析

        2023-10-20 23:05:02
      • python Django连接MySQL数据库做增删改查

        2023-11-14 10:44:35
      • CSS hack浏览器兼容一览表

        2007-08-14 10:35:00
      • python接口自动化使用requests库发送http请求

        2023-08-02 02:04:37
      • 修正IE6不支持position:fixed的bug[译]

        2009-08-01 12:44:00
      • sqlserver 2000中创建用户的图文方法

        2012-03-26 18:26:39
      • 5种禁用html页面的缓存方法

        2007-09-30 12:12:00
      • 鼠标驱动图片变化

        2009-07-26 10:03:00
      • Access数据库出现0x80004005问题的解决方法

        2008-11-28 14:25:00
      • javascript模拟php函数in_array

        2023-10-15 22:12:49
      • Mootools 1.2教程(20)——选项卡效果(Tabs)

        2008-12-26 18:19:00
      • 交互设计师应该具备哪些素质

        2009-03-12 12:21:00
      • [CSS+JS]同一页面可以重复使用的选项卡

        2009-02-12 12:53:00
      • 浅析Oracle中sys、system和Scott用户下的数据库连接问题

        2023-07-02 15:14:06
      • js实现input+select组合 抛砖引玉

        2010-08-02 12:34:00
      • asp之家 网络编程 m.aspxhome.com