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 = 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的方法,可供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位代码

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值