Python合并多张图片成PDF


Posted in Python onJune 09, 2021

前言

最近需要将记的笔记整理成一个 pdf 进行保存,所以就研究了一下如何利用 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 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实现图片合并pdf的方法的文章就介绍到这了,更多相关Python 图片合并pdf内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python的Flask框架中的signals信号机制
Jun 13 Python
python中的随机函数小结
Jan 27 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python函数返回不定数量的值方法
Jan 22 Python
python ddt数据驱动最简实例代码
Feb 22 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python+mysql实现个人论文管理系统
Oct 25 Python
pytorch中的自定义数据处理详解
Jan 06 Python
Python检测端口IP字符串是否合法
Jun 05 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
Python3 多线程(连接池)操作MySQL插入数据
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Django rest framework如何自定义用户表
Jun 09 #Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 #Python
python缺失值的解决方法总结
Jun 09 #Python
Python提取PDF指定内容并生成新文件
Python激活Anaconda环境变量的详细步骤
Jun 08 #Python
You might like
详解php中curl返回false的解决办法
2019/03/18 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
jquery自定义表格样式
2015/11/23 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
Python实现去除代码前行号的方法
2015/03/10 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
生产班组长岗位职责
2014/01/05 职场文书
服务员岗位职责
2014/01/29 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
人事主管岗位职责
2015/02/04 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
军事博物馆观后感
2015/06/05 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
Python学习开发之图形用户界面详解
2021/08/23 Python