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

目录

[一、PIL 库简介及安装使用方法](#一、PIL 库简介及安装使用方法)

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

[二、图片转换为 pdf 的两种实现方法](#二、图片转换为 pdf 的两种实现方法)

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

[(二)常用版------pdf 每页尺寸统一为 A4](#(二)常用版——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 库。

安装命令如下:

python 复制代码
pip install Pillow

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

python 复制代码
pip show pillow

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

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

该段代码适用于:

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

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

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

完整代码如下:

python 复制代码
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 。

完整代码如下:

python 复制代码
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的方法,可供参考。

相关推荐
waterHBO19 分钟前
python 爬虫 selenium 笔记
爬虫·python·selenium
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
AIAdvocate3 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼3 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
FreakStudio5 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
redcocal6 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
artificiali7 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
RaidenQ7 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
花生了什么树~.7 小时前
python基础知识(六)--字典遍历、公共运算符、公共方法、函数、变量分类、参数分类、拆包、引用
开发语言·python
Trouvaille ~8 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算