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使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
Python实现基本线性数据结构
Aug 22 Python
发布你的Python模块详解
Sep 15 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
Python绘制七段数码管实例代码
Dec 20 Python
python基础教程之while循环
Aug 14 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
python在地图上画比例的实例详解
Nov 13 Python
python中reload重载实例用法
Dec 15 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
php 安全过滤函数代码
2011/05/07 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
详解Django中的form库的使用
2015/07/18 Python
python目录与文件名操作例子
2016/08/28 Python
python实现批量监控网站
2016/09/09 Python
python中的字典操作及字典函数
2018/01/03 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
应届生如何写自荐信
2014/01/05 职场文书
中英文求职信范文
2014/01/27 职场文书
学校安全生产承诺书
2014/05/23 职场文书
应届毕业生自荐信
2014/05/28 职场文书
村委会贫困证明范本
2014/09/17 职场文书
瘦西湖导游词
2015/02/03 职场文书
军训新闻稿范文
2015/07/17 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL