You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python实现抽奖券图片转PDF:自定义A4页行列排版求助

抽奖券PDF生成实现思路与代码示例

1. 输入合法性处理

先把用户输入的字符串转成整数,同时做异常捕获和有效性检查,避免非数字或无效值:

try:
    nbr_per_line = int(input("每行抽奖券数量: "))
    nbr_per_column = int(input("每列抽奖券数量: "))
except ValueError:
    print("请输入有效的正整数")
    exit()

if nbr_per_line <= 0 or nbr_per_column <= 0:
    print("行列数量必须大于0")
    exit()

2. 定义打印参数

以打印常用的300DPI为准,将A4纸的毫米尺寸转换成像素,同时设置页面边距避免内容贴边:

from PIL import Image

# 打印核心参数
DPI = 300
A4_WIDTH_MM = 210
A4_HEIGHT_MM = 297
MARGIN_MM = 10  # 页面四边留白

# 转换为像素单位(毫米转像素公式:mm * DPI / 25.4)
A4_WIDTH_PX = int(A4_WIDTH_MM * DPI / 25.4)
A4_HEIGHT_PX = int(A4_HEIGHT_MM * DPI / 25.4)
MARGIN_PX = int(MARGIN_MM * DPI / 25.4)

# 计算单张抽奖券的可用尺寸(扣除边距后均分)
available_width = A4_WIDTH_PX - 2 * MARGIN_PX
available_height = A4_HEIGHT_PX - 2 * MARGIN_PX
ticket_width = available_width // nbr_per_line
ticket_height = available_height // nbr_per_column

3. 图片缩放与居中处理

为避免拉伸变形,保持图片比例,同时将图片居中放置在预设的抽奖券尺寸区域内:

def process_ticket_image(img, target_w, target_h):
    # 转换为RGB模式(兼容RGBA透明图)
    img = img.convert('RGB')
    # 按比例缩小图片,不超过目标尺寸
    img.thumbnail((target_w, target_h))
    # 创建白色背景画布,将图片居中粘贴
    background = Image.new('RGB', (target_w, target_h), 'white')
    offset_x = (target_w - img.width) // 2
    offset_y = (target_h - img.height) // 2
    background.paste(img, (offset_x, offset_y))
    return background

4. 页面排版逻辑

循环遍历图片列表,将处理后的抽奖券依次粘贴到A4页面,排满一页就新建空白页:

pages = []
current_page = Image.new('RGB', (A4_WIDTH_PX, A4_HEIGHT_PX), 'white')
current_x, current_y = MARGIN_PX, MARGIN_PX

for img in PIL_img_list:
    processed_img = process_ticket_image(img, ticket_width, ticket_height)
    # 粘贴到当前页面指定位置
    current_page.paste(processed_img, (current_x, current_y))
    
    # 更新下一个粘贴位置
    current_x += ticket_width
    # 一行排满,切换到下一行
    if current_x + ticket_width > A4_WIDTH_PX - MARGIN_PX:
        current_x = MARGIN_PX
        current_y += ticket_height
        # 一页排满,保存当前页并新建空白页
        if current_y + ticket_height > A4_HEIGHT_PX - MARGIN_PX:
            pages.append(current_page)
            current_page = Image.new('RGB', (A4_WIDTH_PX, A4_HEIGHT_PX), 'white')
            current_x, current_y = MARGIN_PX, MARGIN_PX

# 将最后未排满的页面加入列表
if current_page not in pages:
    pages.append(current_page)

5. 保存为PDF

利用PIL的多页保存功能,将所有页面合并为一个可打印的PDF文件:

if pages:
    pages[0].save(
        '抽奖券打印版.pdf',
        save_all=True,
        append_images=pages[1:],
        resolution=DPI,
        quality=95
    )
    print("PDF文件已生成")
else:
    print("没有图片可生成PDF")

内容的提问来源于stack exchange,提问作者Frank Ithen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:40:33