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.mzph.cn/bicheng/52210.shtml

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

相关文章

shellcode汇编复习

shellcode汇编复习 一、 汇编代码复习1.1 基础寄存器1. EAX (Accumulator Register)2. EBX (Base Register)3. ECX (Count Register)4. EDX (Data Register)5. ESI (Source Index Register)6. EDI (Destination Index Register) 二、 基础指令1. mov - 数据传送2. add - 加法3.…

Ansys Zemax|如何有效地模拟散射

附件下载 联系工作人员获取附件 概要 OpticStudio中,有两个用来提升散射模拟效率的工具:Scatter To List以及Importance Sampling。在这篇文章中,我们详细讨论了这两个工具,并且以一个杂散光分析为例示范了如何使用Importance S…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目,项目已经打好了jar包,现在我们发现jar包依赖的子包有问题,其中的一个mybatis xml文件查询数据不正确,我们需要替换项目&#xf…

批量将labelme的json文件转为png图片查看

文章目录 前提修改 l a b e l m e labelme labelme然后你就可以在这个环境下用代码批量修改了 前提 安装anaconda或者miniconda安装labelme 修改 l a b e l m e labelme labelme 查看labelme所处环境的路径:conda info --envs 比如我的是在py39_torch里面 修改la…

秋招力扣Hot100刷题总结——链表

1. 反转链表题目连接 题目要求:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 代码及思路 遍历所有节点,将所有节点的next指向前一个节点由于要改变节点的next指向,而链表是单向的,因此需要…

【Mac】植物大战僵尸杂交版 for Mac(经典策略塔防游戏)游戏介绍

游戏介绍 植物大战僵尸杂交版 for Mac是一款非常受欢迎的策略塔防游戏,植物大战僵尸游戏以其独特的主题、幽默的风格和富有挑战性的关卡设计而著称。玩家需要种植各种植物来防御入侵的僵尸,每种植物都有其特定的功能和攻击方式。植物大战僵尸杂交版&…

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件,然后发送广播事件 Android12类路径: frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…

SQL注入(head、报错、盲注)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢? 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…

java常见面试题汇总

🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明一、封装 继承 多态1.封装2.继承3.多态 二、什么是重载…

初始化列表 / 隐式转换 / 静态

目录 初始化列表隐式转换单参数的隐式类型转换多参数的隐式类型转换explicit关键字 static 初始化列表 大部分时候成员变量在对象实例化的时候调用构造函数就整体定义了,注意此时只有定义,不算初始化。而定义后的值的值是在构造函数里面给的。我们知道构…

<数据集>无人机航拍不同高度牧羊识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6065张 标注数量(xml文件个数):6065 标注数量(txt文件个数):6065 标注类别数:1 标注类别名称:[sheep] 序号类别名称图片数框数1sheep6065149785 使用标注工具&…

Macos M1 IDEA本地调试 HBase 2.2.2

# 1. 前提 执行 mvn clean package assembly:single -DskipTests没问题,并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹 证明Maven 下载依赖没问题 1.1 报错 1 这里应该是报错找不到 com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1 …

入门STM32—外部中断

外部中断的存在使得微控制器能够及时响应外部事件,避免频繁的轮询操作,从而提高系统的实时性、效率和低功耗性能。 1.什么是外部中断? 外部中断是指微控制器接收到外部引脚的信号变化时触发的中断。STM32F103系列微控制器支持多个外部中断线…

鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理(MediaKeySession)支持媒体密钥管理及媒体解密等,MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。 开发步骤 导入NDK接口,接口中提供了DRM相关的属性和方法,导入方法如下。 #include &…

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页,总不能人工一直去点,所以想到大学时候学过selenium技术,写个脚本来一直刷新,因为经常写java语言,所以选用java语言来写 实验环境 注意,需要先准备好Google浏览器和Chrome-Driver驱…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 …

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中,鉴于客户方服务器的安全配置对 MQ 中间件有所限制,我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而,近段时间客户关闭了相关端口,导致大量数据积压,需要进行补发。在补发过程…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

8.21-部署eleme项目

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…