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

Python中使用FPDF调整PDF图片间距及固定行列排版自动分页问题咨询

实现方案

边距计算规则

你使用的是A4横向规格PDF,单位为mm时,页面总宽297mm、总高210mm,边距可按以下逻辑设定:

  • 水平方向总占用 = 左右侧边距 + 4张图片宽度 + 3个列间距 = 297mm
  • 垂直方向总占用 = 上下侧边距 + 4张图片高度 + 3个行间距 = 210mm
    你可以根据自身需求调整参数,只要符合上述公式即可保证内容不超出页面。

修改后代码

from fpdf import FPDF
import glob

# 请提前定义filePath1为你的图片目录路径
class MyFPDF(FPDF):
     pass

def photos_pdf():
    # 可自定义参数
    margin = 5 # 页面四周统一边距,单位mm
    img_w = 63 # 单张图片宽度
    img_h = 44 # 单张图片高度
    col_gap = 8 # 列与列之间的间距
    row_gap = 8 # 行与行之间的间距
    per_line = 4 # 每行图片数
    per_col = 4 # 每列图片数
    per_page = per_line * per_col # 单页总图片数

    pdf = MyFPDF("L", format='A4', unit='mm')
    photos = glob.glob(filePath1 + "/*.img") # 仅匹配img格式文件,避免把生成的PDF也读入
    x = margin
    y = margin
    line_counter = 0 # 当前行已放图片数
    page_counter = 0 # 当前页已放图片数
    pdf.add_page()

    for photo in photos:
        pdf.image(photo, x=x, y=y, w=img_w, h=img_h)
        page_counter += 1
        line_counter +=1

        # 判断是否要换行
        if line_counter == per_line:
            line_counter = 0
            x = margin
            y += img_h + row_gap
        else:
            x += img_w + col_gap
        
        # 判断是否要换页
        if page_counter == per_page:
            pdf.add_page()
            page_counter = 0
            line_counter = 0
            x = margin
            y = margin
    
    pdf.output(filePath1 + "/A4_cards.pdf", 'F')

photos_pdf()

核心调整说明

  • 修复了原代码换页前后边距不一致的问题,所有页面边距统一
  • 实现了每行4张、每列4张的排版要求,满16张自动新建页面
  • 所有排版参数均提取为可配置变量,你可以根据实际需求调整图片大小、边距、间距

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:36:03