python | 图片转换为 pdf 实现方法

目录

一、PIL 库简介及安装使用方法

(一)python 不同版本下 PIL 的使用方法

二、图片转换为 pdf 的两种实现方法

(一)简易版——pdf 页面尺寸跟随图片大小

(二)常用版——pdf 每页尺寸统一为 A4


一、PIL 库简介及安装使用方法

本文将图片转换为 pdf 的实现方法,主要是基于 python 的第三方图像处理库 PIL。

PIL(Python Imaging Library),免费开源,提供了非常强大的图像处理功能。

PIL,只支持 python 2.x 版本;随着发展, Python 社区开发了一个名为 Pillow 的分支,一个兼容 PIL 的图像处理库,用以支持 python 3.x 版本。

Pillow,不仅继承了 PIL 的功能,还在其基础上增加了许多新的特性,使其成为比原始 PIL 更加活跃的图像处理库。

(一)python 不同版本下 PIL 的使用方法

(1)python 2.x:通常不需要单独安装,PIL 已包含在标准库中,可直接使用。

(2)python 3.x:需要单独安装 Pillow 库来代替 PIL。

作者使用的是 python 3.x,并直接通过 pip 安装了 Pillow 库。

安装命令如下:

pip install Pillow

查看是否安装成功及当前版本:

pip show pillow

图片

二、图片转换为 pdf 的两种实现方法

(一)简易版——pdf 页面尺寸跟随图片大小

该段代码适用于:

1、将单张或多张图片转换为 pdf。

2、目标文件夹中有几张图片,转换后的 pdf 就有多少页。

3、转换后的 pdf 页面默认尺寸设置:视具体情况而定。简单来说,就是转换后的 pdf 页面尺寸会跟随图片大小,这样也就导致 pdf 页面大小不一。

完整代码如下:

from PIL import Image as pilImage
import os# 简易版——图片转换为pdf,pdf页面随图片大小浮动
def convert_images_to_pdf(image_file):os.chdir(image_file)images = []file_lis = os.listdir(image_file)output_path = 'output.pdf'con = 0for image_path in file_lis:if image_path.endswith(('.jpg', '.png')):image = pilImage.open(image_path)images.append(image.convert("RGB"))con += 1print(image_path + ':第%d张' % con)images[0].save(output_path, save_all=True, append_images=images[1:])print('转换完成,共计%d张图片' % len(images))if __name__ == "__main__":image_file = input(r'输入目标图片所在文件夹路径(如E:\test):')convert_images_to_pdf(image_file)

测试结果—页面随图片大小

图片

图片

注:本段代码只涵盖了常见的 jpg、png 两种图片格式,其他格式可以直接在代码中追加。

图片

(二)常用版——pdf 每页尺寸统一为 A4

基于(一)中的代码,引入了第三方模块 reportlab,对转换后的 pdf 页面尺寸进行设置。

1、第一步,先通过命令:pip show reportlab ,查看是否已经安装有 reportlab 模块,已安装的情况下会提示版本号等信息,并且在使用时不会报错。

如果没有安装 reportlab 模块,则需要进行安装:pip install reportlab。

注:经作者实测,直接使用 pip 命令安装可能会失败,因每台电脑所装的 python 版本、环境依赖等,失败情况可能也有所不同。解决办法:先去下载对应自身 python 版本的 reportlab 包或 whl 文件,再进行安装。常用下载链接可参考: https://pypi.org/search/?q=reportlab。

2、第二步,安装好所需要的库后,直接复制并运行下面的代码,输入需要转换的图片文件夹路径即可。

该段代码适用于:

1、将单张或多张图片转换为 pdf。

2、目标文件夹中有几张图片,转换后的 pdf 就有多少页。

3、转换后的 pdf 每页大小均为 A4 。

完整代码如下:

from PIL import Image as pilImage
from reportlab.platypus import SimpleDocTemplate, Image, PageBreak
from reportlab.lib.pagesizes import A4, landscape
import os# 获取目标文件下图片文件
def get_Images(image_file):images = []file_lis = os.listdir(image_file)for image_path in file_lis:if image_path.endswith(('jpg', 'png')):images.append(image_path)return images, image_file# 常用版——图片转换为pdf,限制pdf页面大小为A4
def convert_images_to_pdfp(images, image_file):os.chdir(image_file)# 获取A4尺寸a4_w, a4_h = landscape(A4)# 创建一个PDF文档pdf_doc = SimpleDocTemplate(r'tmp.pdf')if len(images) == 0:print('该文件夹路径下无图片,请检查图片格式!')elif len(images) == 1:# 获取图片尺寸img = pilImage.open(images[0])img_w, img_h = img.size# 设置合适的缩放比率ratio = min(a4_w / img_w, a4_h / img_h)# 创建文档page = Image(images[0], img_w * ratio, img_h * ratio)pdf_doc.build([page])print(images[0] + '——转换完成')else:frames = []  # 用于存储多张图片框架con = 0for image in images:# 获取图片尺寸img = pilImage.open(image)img_w, img_h = img.size# 设置合适的缩放比率ratio = min(a4_w / img_w, a4_h / img_h)# 储存文档内容page = Image(image, img_w * ratio, img_h * ratio)frames.append(page)  # 将文档内容添加到列表中frames.append(PageBreak())  # 在每张图片后添加PageBreakcon += 1print(image + '——第%d张' % con)pdf_doc.build(frames)print('转换完成,共计%d张' % len(images))if __name__ == "__main__":image_file = input(r'输入目标图片所在文件夹路径(如E:\test):')images = get_Images(image_file)convert_images_to_pdfp(images[0], images[1])

测试结果——每页均为 A4 大小

图片

图片

注:本段代码只涵盖了常见的 jpg、png 两种图片格式,其他格式可以直接在代码中追加即可。

总结:图片的大小是转换后的 pdf 是否清晰、符合要求的重要因素。代码(二)中对图片进行了简单缩放,可以根据自身需求在代码中对图片大小进行调整。(如果对代码不是很熟悉,有一招简单方法,就是转换之前,可以先P图)。

以上就是基于 python 第三方库 PIL、reportlab ,将图片转换为pdf的方法,可供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406200.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++,std::bind 详解

文章目录 1. 概述2. 基本用法2.1 使用占位符2.2 示例 3. 总结 1. 概述 std::bind 是 C11 引入的一个功能,它允许你将函数(或成员函数、函数对象)与其参数绑定,生成一个新的可调用对象。这个功能在需要将函数及其参数一起传递给其…

闲鱼IP属地地址:去外地会自动变化吗?解析实时更新机制

在数字化时代,网络交易平台如闲鱼已成为我们日常生活中不可或缺的一部分。在进行二手交易时,了解对方的地理位置信息成为许多买家和卖家的关切点。那么,去外地闲鱼IP会变吗?闲鱼IP属地地址是实时更新吗?本文将深入探讨…

基于百度智能云爆破验证码识别

目录 基于百度智能云爆破验证码识别 一、基于php提供验证码校验接口 二、基于百度云API识别验证码 1、领取资源,创建应用 2、利用应用的API Key和Secret Key获取Access Token 3、文字识别 4、编写爆破程序 基于百度智能云爆破验证码识别 一、基于php提供验证…

华为手机换ip地址怎么换?手机换ip地址有什么影响

在数字化时代,网络已成为我们生活中不可或缺的一部分。无论是日常沟通、工作学习还是娱乐休闲,我们都离不开互联网。然而,随着网络安全问题的日益突出,如何保护个人隐私和信息安全成为了用户关注的焦点。更换手机IP地址作为提升网…

2024年下半年,单独划定的地区报名软考的温馨提示

软考分数线分为全国分数线、省分数线(陕西省下半年已取消,仅剩青海省)、以及单独划线地区分数线。目前各地2024年下半年软考正在接受报名,请单独划线地区的考生注意——有些地区可能要求考生在考试后进行单独划线申请,…

删除或丢失的移动硬盘数据如何恢复?三种办法助你找回宝贵资料

在数字化时代,移动硬盘已成为我们存储重要数据不可或缺的工具。然而,数据丢失或误删除的情况时有发生,让人倍感焦虑。别担心,本文将为你详细介绍如何恢复删除或丢失的移动硬盘数据,帮助你找回那些宝贵的资料。 一、检…

『 C++ 』IO流

文章目录 IO流概述iostream 的标准对象C流和C标准库I/O函数的同步 sync_with_stdiofstream 文件流文件流的打开标志二进制读写二进制读写的浅拷贝问题文本读写 字符串流注意 IO流概述 流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以…

用Python在Ashare获取金融数据官方文档解读

Ashare,也被写作AKShare,是一个基于Python的开源完全免费的财经数据接口库。它的主要目的是为用户提供股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据的采集、清洗和落地的一整套工具。AKSha…

算法的学习笔记—把二叉树打印成多行(牛客JZ78)

😀前言 在算法面试中,二叉树的层序遍历是一个经典的题目。而这道题的要求是进一步将二叉树的每一层结点值打印成多行,即同一层结点从左至右输出,最终结果存放到一个二维数组中返回。接下来,我们将通过代码实例详细解析…

什么是光伏气象站—光伏气象站的简述

随着全球对可再生能源需求的日益增长,光伏发电作为清洁、可再生的能源形式,正逐步成为能源结构转型的重要力量。然而,光伏电站的发电效率受到多种气象因素的影响,如太阳辐射强度、温度、风速、湿度等。为了最大化光伏系统的发电潜…

C/C++ 多线程[1]---线程创建+线程释放+实例

文章目录 前言1. 多线程创建2. 多线程释放3. 实例总结 前言 说来惭愧,写了很久的代码,一个单线程通全部。可能是接触的项目少吧,很多多线程的概念其实都知道,但是实战并没有用上。前段时间给公司软件做一个进度条,涉及…

Java 2.4 - JVM

一、Java 内存区域详解(重点) 本篇讨论的是 HotSpot 虚拟机 相比于 C 而言,程序员不需要对每个 new 操作都写对应的 delete / free 操作,这些操作我们会交给虚拟机去做。因此,如果不了解虚拟机的原理,一旦…

【Vue3】集成 Ant Design Vue

【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…

Android TableLayout中TextView文本不居中问题

概述 | 平台 RK3288 Android 8.1 compileSdkVersion 26. | 问题 使用了TableLayout布局电话的拨号按键界面, 效果如下图 (正常): 在后续开发过程的某次修改后, 出现效果图(不正常): 合并两张效果图可看得更明显(红线参考位置): 在布局中 TextView 的 android:g…

SEO优化:如何优化自己的文章,解决搜索引擎不收录的问题

可以使用bing的URL检查,来检查自己的文章是不是负荷收录准测,如果页面有严重的错误,搜索引擎是不会进行收录的,而且还会判定文章为低质量文章! 检查是否有问题。下面的页面就是有问题,当然如果是误报你也可…

Stage模型应用程序包结构

一、开发态包结构 在DevEco Studio上创建一个项目工程,并尝试创建多个不同类型的Module。根据实际工程中的目录对照本章节进行学习,可以有助于理解开发态的应用程序结构。 工程结构主要包含的文件类型及用途如下: 文件类型说明配置文件 包括…

ISO 26262中的失效率计算:IEC 61709-Clause 17_Switches and push-buttons

概要 IEC 61709是国际电工委员会(IEC)制定的一个标准,即“电子元器件 可靠性 失效率的基准条件和失效率转换的应力模型”。主要涉及电学元器件的可靠性,包括失效率的基准条件和失效率转换的应力模型。本文介绍IEC 61709第十七章&…

docker部署postgresSQL 并做持久化

先安装docker,安装docker 方法自行寻找方法 然后安装pgsql 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest运行容器 docker run -it --name postgres --privileged --restart always -e POSTGRES_PASSWORDYo5WYypu0mCCh…

Ansys Rocky在电池制造行业应用

Ansys Rocky在电池制造行业应用 对于电池电极制造的理解 干湿混合应用 砑光应用 微尺度电极干燥应用 更多应用 材料生产 电极和电池生产

2024前端面试题-css篇

1.p和div区别 p自带有一定margin-top和margin-bottom属性值,而div两个属性值为0,也便是两个p之间有不一定间距,而div没有。 2.对css盒模型的理解 标准盒模型:content不包括padding、border、margin ie盒模型:conten…