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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:05:34