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 03 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
在centos7中分布式部署pyspider
May 03 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python对象与引用的介绍
Jan 24 Python
详解python 爬取12306验证码
May 10 Python
Python使用configparser库读取配置文件
Feb 22 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
Python网络编程之ZeroMQ知识总结
Apr 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的库,结果发现很多东西
2006/12/31 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
img标签中onerror用法
2009/08/13 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python获取网页上图片下载地址的方法
2015/03/11 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
python实现决策树分类
2018/08/30 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
Python字典底层实现原理详解
2019/12/18 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
python怎么自定义捕获错误
2020/06/29 Python
Django-imagekit的使用详解
2020/07/06 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
验房委托书
2014/08/30 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
办公用房租赁协议书
2014/11/29 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis