基于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
相关产品推荐
相关产品推荐

