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

news2024/11/26 6:22:47

目录

一、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 = 0
    for image_path in file_lis:
        if image_path.endswith(('.jpg', '.png')):
            image = pilImage.open(image_path)
            images.append(image.convert("RGB"))
            con += 1
            print(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 = 0
        for 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())  # 在每张图片后添加PageBreak
            con += 1
            print(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.coloradmin.cn/o/2061127.html

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

相关文章

C#PACS系统源码,影像存档与传输系统源码,数字化医学影像系统源码,三维重建影像PACS系统源码

C#PACS系统源码,影像存档与传输系统源码,数字化医学影像系统源码,三维重建影像PACS系统源码 PACS即影像存档与传输系统(Picture Archiving and Communication System),是医学影像、数字化图像技术、计算机技…

C++遍历for_each

#include <iostream> #include <stack> #include <vector> #include <algorithm> using namespace std; //打印数组 class bianli { public:void operator()(int val){cout << val << " ";} }; void printVector(int val) {cout…

【经验分享】将ui文件转化成py代码

目录 先写一个简单的ui界面 将ui文件另存为 将UI文件转换为py代码 测试一下你生成的py文件 &#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&…

第R2周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是LSTM 1.LSTM的本质 长短时记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;的本质是一种特殊的循环神经网络&#xff08;Recurrent…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 05网络虚拟化

本章帮助网络工程师或架构师回答如下问题&#xff1a; 什么是网络虚拟化?网络虚拟化有哪些用途?网络虚拟化领域内有哪些不同的技术方向?网络虚拟化的控制面有哪些选择?当使用 VXLAN 时如何进行桥接和路由&#xff1f; 什么是网络虚拟化&#xff1f; 网络虚拟化可以让网络…

揭秘!格行如何成为随身WiFi界的‘比亚迪’!如何成为随身WiFi热销第一名?

比亚迪把续航超过2000km的油车打入了10万元以内&#xff01;创造历史&#xff01; 为什么这么说&#xff1f;还不是因为这两辆车都搭载了比亚迪最新研发的第五代 Dmi 混动技术。这项技术有多“逆天”&#xff1f;直接创下了三项全球之最——全球最高发动机热效率、百公里最低油…

CUDA C++ 最佳实践指南

CUDA C 最佳实践指南 (nvidia.com)https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#getting-started2. 异构计算 CUDA 编程涉及在两个不同的平台上同时运行代码&#xff1a;具有一个或多个 CPU 的主机系统和一个或多个支持 CUDA 的 NVIDIA GPU 设备。 …

Hermite 三次插值可编辑样条

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 利用三次样条和Hermite插值制作一个类似于ppt里的曲线工作。 基本思路 对于给定点&#xff0c;初始生成时用参数化三次函数插值的方式生成。三次样条函数插…

【Py/Java/C++三种语言详解】LeetCode743、网络延迟时间【单源最短路问题Djikstra算法】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读一、题目描述二、题目解析三、参考代码PythonJavaC 时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 相关推荐阅读 …

Java入门:06.Java中的方法--进阶01

1 JVM中方法的执行过程 1.1 JVM内存模型 在java程序的执行过程中会产生一些数据&#xff0c;这些数据将会存在jvm内存中。 JVM将内存分成了不同的逻辑区域&#xff0c;存储不同含义&#xff08;类别&#xff09;的数据 JVM内存模型有5种 方法区 &#xff1a; 存储类信息 堆…

初识redis:Set类型

Set有很多种含义&#xff0c;比如集合&#xff0c;比如设置&#xff08;和get相对应&#xff09;。 在这里我们说的set是指的redis中的集合&#xff0c;并且这里的集合是无序的&#xff0c;和之前的list是对应的。 List &#xff1a; [1,2,3] 和 [2,1,3] 是两个不同的listSe…

hbase-manager图形化界面的安装与配置

相关资料下载 夸克网盘分享 1、上传项目到linux上 解压&#xff1a; 切换到conf目录下&#xff1a;/opt/installs/hbase-manager-2.0.8-hbase-2.x/conf/ 2、修改数据库配置信息 application-druid.yml 3、创建hbase-manager数据库(注意字符集编码)&#xff0c;导入数据库脚本…

飞鸟物联平台数字化解决方案:全方位提升OEM厂商销售、售后服务能力

自从OEM厂商把设备销售给终端客户&#xff0c;这笔交易就到此为止了。一旦目标行业出现下行趋势&#xff0c;订单和利润往往难以为继&#xff0c;OEM厂商往往遭受着其特有的三重考验&#xff1a;设备状况不透明、设备维保成本高、终端客户粘性低。这些挑战如同“三害”压得OEM厂…

AI搜索产品:秘塔、天工、perplexity、felo、360AI搜索

1、秘塔 https://metaso.cn/ 2、天工 https://www.tiangong.cn/ 3、perplexity https://www.perplexity.ai/ 4、Felo https://felo.ai/search 5、360ai搜索 https://www.sou.com/

洛谷P3865.ST表

洛谷P3865.ST表 i的取值为[1,n−2j1]从而推出j的取值为 j < lg[n]找区间最值时&#xff1a; 要找一段起始点L的可覆盖[L,R]的区间&#xff0c;即L 2k - 1 < R –> k < lg[R-L1] (区间长度)同时起点为 D R - 2k 1 (起始点)即f[D][k] #include <bits/stdc.…

12.1.案例专题-数据流图

文章目录 数据流图结构化语言描述示例 练习题2020年真题2021年上真题 数据流图 数据流图DFD基本图形元素&#xff1a;外部实体、加工、数据存储、数据流。 数据流&#xff1a;由一组固定成分的数据组成&#xff0c;表示数据的流向。在DFD中&#xff0c;数据流的流向必须经过…

IP进程间的通信方式以及不同主机间的通信方式

一&#xff0c;IP进程间的通信方式 共享内存&#xff08;最高效&#xff09; 1.是一块内核的预留空间 2.避免了用户空间到内核空间的数据拷贝 1.产生key:ftok函数 功能&#xff1a;将pathname和pid_id转化为key 参数&#xff1a;(路径名&#xff0c;A) 返回值&#xff1…

Java并发类API——ExecutorService

1.ExecutorService概述 ExecutorService 是 Java 并发库中一个非常重要的接口&#xff0c;它提供了一种管理和控制线程执行的方法。ExecutorService 是 Executor 接口的扩展&#xff0c;除了 Executor 提供的基础任务执行功能之外&#xff0c;ExecutorService 提供了更强大的功…

如何用Python构建高校爬虫与k-means算法实现专业评分可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

工业互联网与大数据实训室解决方案

一、引言 1.1 工业互联网与大数据的重要性 工业互联网作为新一代信息技术与制造业深度融合的产物&#xff0c;正在全球范围内推动着制造业的数字化、网络化、智能化转型。它通过连接机器、物料、人和信息系统&#xff0c;实现数据的全面感知、动态传输和智能分析&#xff0c;…