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基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
在python中bool函数的取值方法
Nov 01 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python多线程threading模块用法实例分析
May 22 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
详解python程序中的多任务
Sep 16 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
关于文本留言本的分页代码
2006/10/09 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
JQuery优缺点分析说明
2011/04/10 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
实现高性能javascript的注意事项
2019/05/27 Javascript
python去除字符串中的换行符
2017/10/11 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
python如何代码集体右移
2020/07/20 Python
Python self用法详解
2020/11/28 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
一月红领巾广播稿
2014/02/11 职场文书
财政专业求职信范文
2014/02/19 职场文书
会计毕业生自荐书
2014/06/12 职场文书
设计专业自荐信
2014/06/19 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js