Python实现将多张图片转换为A4大小的PDF文件,并添加页码


from PIL import Image, ImageDraw, ImageFont
import os
import re


def sort_key(filename):
    # 提取文件名中的数字部分
    return int(re.findall(r'\d+', filename)[0])


def compress_image(image, max_size=(2480, 3508), quality=85):
    # 调整图像大小以适应A4纸张大小
    img = image.copy()
    img.thumbnail(max_size, Image.LANCZOS)
    return img


def add_page_number(image, page_number, font_path=None):
    # 在图像上添加页码
    draw = ImageDraw.Draw(image)
    font_size = 50
    if font_path:
        font = ImageFont.truetype(font_path, font_size)
    else:
        font = ImageFont.truetype("arial.ttf", font_size)  # 例如在Windows系统中

    text = f"{page_number}"
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
    width, height = image.size
    position = (width - text_width - 1200, height - text_height - 30)
    draw.text(position, text, font=font, fill="black")
    return image


def images_to_pdf(image_folder, output_pdf, max_size=(2480, 3508), quality=85, font_path=None):
    # 获取文件夹中的所有图片文件
    image_files = [f for f in os.listdir(image_folder) if f.lower().endswith(('png', 'jpg', 'jpeg'))]
    # 按照文件名中的数字部分排序
    image_files.sort(key=sort_key)

    # 打开所有图像并存储在列表中
    image_list = []
    for idx, image_file in enumerate(image_files):
        image_path = os.path.join(image_folder, image_file)
        img = Image.open(image_path)
        # 压缩图像
        img = compress_image(img, max_size, quality)
        # 将图像转换为RGB模式,如果不是的话
        if img.mode != 'RGB':
            img = img.convert('RGB')
        # 添加页码
        img = add_page_number(img, idx + 1, font_path)
        image_list.append(img)

    # 将图像列表保存为PDF
    if image_list:
        image_list[0].save(output_pdf, save_all=True, append_images=image_list[1:])


# 使用函数将文件夹下的图片转换为PDF
image_folder = './照片所在文件夹'
output_pdf = 'output.pdf'
font_path = None  # 如果需要使用自定义字体,请提供字体路径
images_to_pdf(image_folder, output_pdf, max_size=(2480, 3508), quality=85, font_path=font_path)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值