广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 多张图片合并成一个pdf的参考示例
  • 507
分享到

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

python图片合成python合成pdf 2022-06-02 22:06:03 507人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录过程拍照用到的python 操作库Python遍历文件夹获取图片旋转图片展示方向并压缩像素整体代码整体代码将脚本打包成exe安装 PyInstaller打包脚本总结过程 拿到一个需求最重要的就是将大块

目录
  • 过程
    • 拍照
    • 用到的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,在强大的第三方库帮助下,我们只需很少的时间就可以开发一个很有意思的小功能。

        以上就是Python 多张图片合并成一个pdf的参考示例的详细内容,更多关于Python 图片合并成pdf的资料请关注编程网其它相关文章!

        --结束END--

        本文标题: Python 多张图片合并成一个pdf的参考示例

        本文链接: https://www.lsjlt.com/news/11036.html(转载时请注明来源链接)

        有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

        本篇文章演示代码以及资料文档资料下载

        下载Word文档到电脑,方便收藏和打印~

        下载Word文档
        猜你喜欢
        软考高级职称资格查询
        编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
        • 官方手机版

        • 微信公众号

        • 商务合作