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变量和字符串详解
Apr 29 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
django定期执行任务(实例讲解)
Nov 03 Python
基于Django用户认证系统详解
Feb 21 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Python pygame绘制文字制作滚动文字过程解析
Dec 12 Python
Python函数调用追踪实现代码
Nov 27 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
python实现手机推送 代码也就10行左右
Apr 12 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中上传大体积文件时需要的设置
2006/10/09 PHP
mysq GBKl乱码
2006/11/28 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
php与js的区别是什么
2013/08/05 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
vue使用recorder.js实现录音功能
2019/11/22 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
Python的Flask框架中web表单的教程
2015/04/20 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python实现分页效果
2017/10/25 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python中拆分字符串的操作方法
2019/07/23 Python
python 消费 kafka 数据教程
2019/12/21 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
python 下划线的不同用法
2020/10/24 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
出纳岗位职责范本
2013/12/01 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书