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实现类似ftp传输文件的网络程序示例
Apr 08 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
Python内建模块struct实例详解
Feb 02 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
python 如何用terminal输入参数
May 25 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计算title标题相似比的方法
2015/07/29 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
vue-cli入门之项目结构分析
2017/04/20 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
详解重置Django migration的常见方式
2019/02/15 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
3种python调用其他脚本的方法
2020/01/06 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
酒店管理毕业生自荐信
2014/05/25 职场文书
入党函调证明材料
2014/12/24 职场文书
七夕情人节问候语
2015/11/11 职场文书
课改心得体会范文
2016/01/25 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
python识别围棋定位棋盘位置
2021/07/26 Python