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轻松实现代码编码格式转换
Mar 26 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
python文件写入实例分析
Apr 08 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python求正态分布曲线下面积实例
Nov 20 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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分页函数代码(简单实用型)
2010/12/02 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
浅析python继承与多重继承
2018/09/13 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
python实现按行分割文件
2019/07/22 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
我的中国梦口号
2014/06/16 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
房屋出售授权委托书
2014/10/12 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang