【python】两张图片拼接为1张,输出为PDF文档和图片

用途:

将两张图片按照顺序(图片的阿拉伯数字顺序)拼接为1张,并输出到pdf中,输出的pdf与图片在同一文件夹,且pdf的名称为文件夹的名称。

适用场景于:

医师执业证、资格证等图片的处理。

代码:

from PIL import Image
from fpdf import FPDF
import os

print("=============== 程序介绍 ==============");
print("本程序目的:输出为PDF文档,和拼接后的图片");
print("本程序适用场景:医师执业证、资格证等图片的处理");
print("=======================================");
print("");


#输出PDF===========================
def convert_images_to_pdf(directory):
    image_files = sorted([f for f in os.listdir(directory) if f.endswith('.jpg') or f.endswith('.jpeg') or f.endswith('.png')])
    
    pdf = FPDF()

    # 将两张图片作为一页输出到pdf
    for i in range(0, len(image_files), 2):
        # 创建一个新的页面
        pdf.add_page()
        
        # 加载第一张图片
        image_path_1 = os.path.join(directory, image_files[i])
        image_1 = Image.open(image_path_1)
        
        # 计算图片缩放比例,使其适应页面宽度
        page_width = pdf.w - 2 * pdf.l_margin
        page_height = pdf.h - 2 * pdf.t_margin
        scale_1 = min(page_width / image_1.width, page_height / image_1.height)
        
        # 调整图片大小
        image_1 = image_1.resize((int(image_1.width * scale_1), int(image_1.height * scale_1)), Image.ANTIALIAS)
        
        # 将图片添加到pdf
        pdf.image(image_path_1, x=pdf.l_margin, y=pdf.t_margin, w=image_1.width, h=image_1.height)
        
        # 如果存在下一张图片,则继续添加
        if i+1 < len(image_files):
            # 加载第二张图片
            image_path_2 = os.path.join(directory, image_files[i+1])
            image_2 = Image.open(image_path_2)
            
            # 计算图片缩放比例,使其适应页面宽度
            scale_2 = min(page_width / image_2.width, page_height / image_2.height)
            
            # 调整图片大小
            image_2 = image_2.resize((int(image_2.width * scale_2), int(image_2.height * scale_2)), Image.ANTIALIAS)
            
            # 将图片添加到pdf
            pdf.image(image_path_2, x=pdf.l_margin, y=pdf.t_margin + image_1.height + 10, w=image_2.width, h=image_2.height)
        
    # 使用文件夹的名称来命名PDF文件
    folder_name = os.path.basename(directory)
    output_file = os.path.join(directory, f"{folder_name}.pdf")

    # 保存pdf文件
    pdf.output(output_file, 'F')



#输出图片===========================
def merge_images(folder_path):
    # 获取文件夹下所有图片文件
    image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.endswith(('.jpg', '.jpeg', '.png'))]

    # 根据图片名称中的数字排序
    image_files.sort(key=lambda x: int(''.join(filter(str.isdigit, x))))

    # 遍历每两张图片进行拼接
    merged_images = []
    for i in range(0, len(image_files), 2):
        image1 = Image.open(os.path.join(folder_path, image_files[i]))

        # 如果剩余的图片个数为奇数,最后一张图片与空白图片进行拼接
        if i == len(image_files) - 1:
            blank_image = Image.new('RGB', image1.size ,'white')
            merged_image = Image.new('RGB', (image1.size[0], image1.size[1] * 2))
            merged_image.paste(image1, (0, 0))
            merged_image.paste(blank_image, (0, image1.size[1]))
            merged_images.append(merged_image)
            break

        image2 = Image.open(os.path.join(folder_path, image_files[i+1]))

        # 确保两张图片的宽度一致
        if image1.size[0] != image2.size[0]:
            max_width = max(image1.size[0], image2.size[0])
            image1 = image1.resize((max_width, image1.size[1]))
            image2 = image2.resize((max_width, image2.size[1]))

        # 竖向拼接两张图片
        merged_image = Image.new('RGB', (image1.size[0], image1.size[1] + image2.size[1]))
        merged_image.paste(image1, (0, 0))
        merged_image.paste(image2, (0, image1.size[1]))
        merged_images.append(merged_image)

    # 保存拼接后的图片
    for i, image in enumerate(merged_images):
        image.save(os.path.join(folder_path, f'merged_{i+1}.jpg'))



# 示例用法
#循环输入文件夹路径并执行
while True:
    directory =input("请输入图片所在的文件路径:")
    folder_path = directory
    if directory.lower()=='q':
        break
    
    print("")
    print("请选择需要进行的操作:")
    print("1、仅输出PDF文档;")
    print("2、仅输出图片(拼接后的);")
    print("3、同时输出PDF文档和图片(拼接后的);")
    print("")

    choice = input()

    if choice == "1":
        convert_images_to_pdf(directory)#输出PDF
        print("PDF文档已完成!")
        print("=======================================")
        print("")
    elif choice == "2":
        merge_images(folder_path)#输出拼接的图片
        print("图片输出已完成!")
        print("=======================================")
        print("")
    elif choice == "3":
        convert_images_to_pdf(directory)#先输出PDF
        merge_images(folder_path)#后输出拼接的图片
        print("PDF文档和图片拼接完成!")
        print("=======================================")
        print("")
    else:
        print("选择无效!")
        print("=======================================")
        print("")

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亮猿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值