用途:
将两张图片按照顺序(图片的阿拉伯数字顺序)拼接为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("")