如何用Python Pillow在内存中生成带文本图片并转为PDF
实现内存内处理并生成多页PDF的方案
你可以通过Pillow结合内存缓冲区(BytesIO)完成全程无中间磁盘读写的操作,核心思路是:在内存中创建并处理A4图片,直接将内存中的图片对象合并为PDF,最后仅把最终PDF写入磁盘。以下是具体实现:
步骤说明
- 在内存中创建A4尺寸图片,添加文本后保留图片对象
- 用
BytesIO作为内存缓冲区,将多个图片对象直接合并为PDF - 最后一次性将内存中的PDF数据写入磁盘文件
完整代码示例
from PIL import Image, ImageDraw, ImageFont import io def create_a4_image_with_text(text, font_path="arial.ttf", font_size=40): # A4尺寸:300DPI下为2480x3508像素(高分辨率),72DPI下为595x842,可按需调整 A4_WIDTH, A4_HEIGHT = 2480, 3508 # 内存中创建白色背景的A4图片 img = Image.new("RGB", (A4_WIDTH, A4_HEIGHT), "white") draw = ImageDraw.Draw(img) # 加载字体,替换为你本地的字体路径,找不到则用默认字体 try: font = ImageFont.truetype(font_path, font_size) except IOError: font = ImageFont.load_default() # 计算文本居中位置 text_width, text_height = draw.textsize(text, font=font) x = (A4_WIDTH - text_width) // 2 y = (A4_HEIGHT - text_height) // 2 # 添加文本到图片 draw.text((x, y), text, font=font, fill="black") # 返回内存中的图片对象,不落地到磁盘 return img # 生成两张带不同文本的A4图片(全程在内存中) page1 = create_a4_image_with_text("这是第一页内容") page2 = create_a4_image_with_text("这是第二页内容") # 创建内存缓冲区存储PDF数据 pdf_buffer = io.BytesIO() # 将两张图片合并为多页PDF,写入内存缓冲区 page1.save( pdf_buffer, format="PDF", save_all=True, append_images=[page2], resolution=300 # 保持A4的300DPI分辨率 ) # 把内存中的PDF数据写入磁盘文件(仅这一次磁盘操作) with open("output.pdf", "wb") as f: f.write(pdf_buffer.getvalue()) pdf_buffer.close()
关键细节
save_all=True和append_images是Pillow实现多页PDF的核心,直接将内存中的图片对象追加为后续页面BytesIO全程在内存中暂存PDF数据,彻底避免了中间图片文件的创建、读写与删除- 字体部分做了容错处理,找不到指定字体时自动使用默认字体,可根据需求替换为自己的字体路径
内容的提问来源于stack exchange,提问作者Abdurrasyiid Alaik Sander
相关产品推荐
相关产品推荐

