小y同学

V1

2023/05/03阅读:26主题:全栈蓝

Python制作图片批量合成PDF工具

由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~


针对没有找到合适的批量将图片合成为 PDF 的工具,而寻思基于 Python 的 PIL 图像处理模块和 fpdf 模块制作的图片转 PDF 脚本。

1 所需模块

1 PIL 库

PIL 库是 Python 的第三方图像处理库,为 Python 提供了强大的图像处理功能,这里主要是为了方便获取图片大小而根据创建对应的 PDF 页面。

2 fpdf 库

fpdf 库是一个pdf生成器,可以用它来生成pdf。

3 os模块

Python支持的一个系统模块,主要是用于获取文件路径,获取文件夹下面的内容。

小注

PIL库和fpdf库均是Python的第三方库,需要使用pip命令安装。

pip install PIL
pip install fpdf

2 具体实现步骤

1 获取文件夹下面的所有图片

使用os模块可以获取文件路径下所有的图片名称。

def GetPig(file_path, Pformat):
    """
    获取图片列表
    :param file_path: 含有图片文件夹的路径
    :param Pformat: 图片的格式,png,jpg;
    此处不支持多种格式如有需要可以改写
    :return: 图片名称列表,含后缀
    """

    img_list = [i for i in os.listdir(file_path)
                if i.endswith(f".{Pformat}")]
    return img_list

可以打印函数返回值如下:

2 获取图片的大小

使用PIL库的Image类来获取图片的宽度。

def GetPigSize(pig_path):
    """
    获取图片大小
    :param pig_path: 图片的路径
    :return: 图片的宽度和高度
    """

    cover = Image.open(pig_path)
    width, height = cover.size  # 获取图片大小
    return width, height

3 将图片依次写入 PDF

使用fpdf来生成pdf。

def CreatPDF(width, height, PDFName, img_list, file_path):
    # 创建pdf对象,format为页面的尺寸
    pdf = FPDF(unit="pt", format=[width, height])
    img_list.sort(key=lambda x: int(x[:-4]))  # 按照数字排序
    for i in img_list:
        print(f"{PDFName}正在处理{i}")
        pdf.add_page()
        # 添加图片,0,0为图片的起始位置
        pdf.image(file_path + "/" + i, 00)
    pdf.output(f"{PDFName}.pdf""F")
    print(f"{PDFName},pdf ----------pdf生成完成")

3 完整源码

# _*_coding:utf-8_*_
# created by cy on 2023/5/3

import os

from PIL import Image
from fpdf import FPDF


def GetPig(file_path, Pformat):
    """
    获取图片列表
    :param file_path: 含有图片文件夹的路径
    :param Pformat: 图片的格式,png,jpg;
    此处不支持多种格式如有需要可以改写
    :return: 图片名称列表,含后缀
    """

    img_list = [i for i in os.listdir(file_path)
                if i.endswith(f".{Pformat}")]
    return img_list


def GetPigSize(pig_path):
    """
    获取图片大小
    :param pig_path: 图片的路径
    :return: 图片的宽度和高度
    """

    cover = Image.open(pig_path)
    width, height = cover.size  # 获取图片大小
    return width, height


def CreatPDF(width, height, PDFName, img_list, file_path):
    # 创建pdf对象,format为页面的尺寸
    pdf = FPDF(unit="pt", format=[width, height])
    img_list.sort(key=lambda x: int(x[:-4]))  # 按照数字排序
    for i in img_list:
        print(f"{PDFName}正在处理{i}")
        pdf.add_page()
        # 添加图片,0,0为图片的起始位置
        pdf.image(file_path + "/" + i, 00)
    pdf.output(f"{PDFName}.pdf""F")
    print(f"{PDFName},pdf ----------pdf生成完成")


if __name__ == '__main__':
    # todo 设置图片的路径
    filePath = "test_pig"
    # 获取图片名称列表
    img_list = GetPig(filePath, "png")
    # 获取图片的大小
    width, height = GetPigSize(f"{filePath}/{img_list[0]}")
    CreatPDF(width, height, "test", img_list, filePath)

4 注意事项

  1. 本程序目前只适合图片格式单一的情况,对于图片格式复杂的情况暂未考虑进去。
  2. 本程序由于需要合成pdf的图片已经由另外一个脚本提前获取到,所以命名上面有一定的规则,目前就本程序而言,想设置图片顺序,只能从图片名称下手。
  3. 程序目前在Windows系统上表现良好,对于Linux和Mac系统可能会由于文件路径的分隔符不同而产生报错现象。
  4. 程序总有不足之处,欢迎读者批评指正!

  • 路虽远,行则将至;事虽难,做则必成。希望认真学习的你能够有所收获!

  • 本公众号的原创成果,在未经允许的情况下,请勿用于任何商业用途!

  • 您的点赞、收藏与关注是我创作的最大动力!


微信公众号
微信公众号
CSDN博客二维码
CSDN博客二维码

分类:

后端

标签:

Python

作者介绍

小y同学
V1