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中的join()函数的用法
Apr 07 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
python自定义类并使用的方法
May 07 Python
Python中用于返回绝对值的abs()方法
May 14 Python
详解Python中的Cookie模块使用
Jul 06 Python
简单学习Python time模块
Apr 29 Python
Python键盘输入转换为列表的实例
Jun 23 Python
神经网络相关之基础概念的讲解
Dec 29 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python使用xpath实现图片爬取
Sep 16 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 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计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
前端性能优化及技巧
2016/05/06 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
python文件操作之目录遍历实例分析
2015/05/20 Python
Python实现股市信息下载的方法
2015/06/15 Python
Python实现KNN邻近算法
2021/01/28 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
如何利用find命令查找文件
2015/02/07 面试题
Servlet方面面试题
2016/09/28 面试题
儿媳婚宴答谢词
2014/01/14 职场文书
烹调加工管理制度
2014/02/04 职场文书
物理课外活动总结
2014/08/27 职场文书
民主生活会发言材料
2014/10/20 职场文书
出国签证在职证明范本
2014/11/24 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
4种非常实用的python内置数据结构
2021/04/28 Python
Java Socket实现多人聊天系统
2021/07/15 Java/Android
Python使用MapReduce进行简单的销售统计
2022/04/22 Python