您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python 多张图片合并成一个pdf的参考示例

51自学网 2021-10-30 22:26:55
  python
这篇教程Python 多张图片合并成一个pdf的参考示例写得很实用,希望能帮到您。

过程

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

拍照

这一步首先是将所有的书页拍好,需要注意的是要按照书的页码来拍,因为后面的排序是按照文件名进行排序的,拍照的文件名基本上是按照时间生成的,如果拍的时候乱了,到时候生成的 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 Imageimport osimport img2pdfflag = Falsewhile not flag:    dirname = input("请输入图片文件夹所在路径(例如d:/wlzcool):")    flag = os.path.exists(dirname)    if not flag:        print("图片文件夹所在路径不存在!")saveflag = Falsewhile 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 = Truefiles = os.listdir(dirname)reductionFactor = int(input("请输入长宽压缩比(例如3):"))if reductionFactor <= 0:    reductionFactor = 3isConvertBlack = 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 Imageimport osimport img2pdfflag = Falsewhile not flag:    dirname = input("请输入图片文件夹所在路径(例如d:/wlzcool):")    flag = os.path.exists(dirname)    if not flag:        print("图片文件夹所在路径不存在!")saveflag = Falsewhile 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 = Truefiles = os.listdir(dirname)reductionFactor = int(input("请输入长宽压缩比(例如3):"))if reductionFactor <= 0:    reductionFactor = 3isConvertBlack = 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的资料请关注51zixue.net其它相关文章!


Python使用oslo.vmware管理ESXI虚拟机的示例参考
Python+Tableau广东省人口普查可视化的实现
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。