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

如何为PyFPDF的MultiCell段落设置绝对单位(px、英寸等)的缩进?

如何用PyFPDF设置绝对单位的段落缩进

你之前用textwrap.indent加空格前缀的方式,本质是靠字符宽度模拟缩进,没法对应px、英寸这类绝对单位,而且PDF的自动换行逻辑和textwrap不一致,容易导致后续段落缩进混乱。正确的做法是用PyFPDF原生的坐标控制来实现精确的绝对单位缩进。

核心思路

利用PyFPDF的get_x()和set_x()方法控制文本输出的起始横坐标,结合multi_cell()实现自动换行且保持缩进的段落效果。PyFPDF支持毫米、英寸、磅等绝对单位,可直接指定或通过内置转换函数转换。

代码示例

基础实现

from fpdf import FPDF

pdf = FPDF(unit='mm')  # 初始化时指定单位,可选mm/in/pt等
pdf.add_page()
pdf.set_font('Arial', size=12)

# 普通无缩进段落
pdf.multi_cell(w=0, h=5, txt="这是一个标准段落,从默认左边距开始,自动换行填满页面宽度。")
pdf.ln(2)  # 段间距

# 设置段落缩进:10毫米
original_left = pdf.get_x()  # 保存当前默认左边界坐标
indent = 10
pdf.set_x(original_left + indent)  # 将起始位置右移指定缩进量
pdf.multi_cell(w=0, h=5, txt="这是一个缩进10毫米的段落,multi_cell会从新的起始位置输出,换行后自动保持该缩进宽度,完全基于绝对单位控制。")
pdf.ln(2)

# 恢复默认左边界,输出下一个普通段落
pdf.set_x(original_left)
pdf.multi_cell(w=0, h=5, txt="回到默认位置的段落,和第一个段落的起始位置完全一致。")

# 用英寸作为缩进单位(0.5英寸)
pdf.ln(2)
indent_inch = 0.5
pdf.set_x(original_left + pdf.in_to_mm(indent_inch))  # 英寸转毫米
pdf.multi_cell(w=0, h=5, txt="这个段落缩进了0.5英寸,通过内置转换函数实现跨单位的精确控制。")

pdf.output("indented_pdf.pdf")

封装成复用函数

如果需要频繁设置缩进,可以封装成函数:

def indented_paragraph(pdf, text, indent, unit='mm'):
    original_x = pdf.get_x()
    # 处理单位转换
    if unit == 'in':
        indent = pdf.in_to_mm(indent)
    elif unit == 'pt':
        indent = pdf.pt_to_mm(indent)
    # 设置缩进位置
    pdf.set_x(original_x + indent)
    pdf.multi_cell(w=0, h=pdf.font_size, txt=text)
    # 恢复原位置
    pdf.set_x(original_x)
    pdf.ln(2)

# 使用示例
indented_paragraph(pdf, "这是用封装函数实现的15毫米缩进段落", 15)
indented_paragraph(pdf, "这是0.3英寸的缩进段落", 0.3, unit='in')

关键说明

  • multi_cell(w=0)表示使用剩余页面宽度作为文本块宽度,换行后会自动以当前x坐标作为左边界,确保整个段落保持缩进
  • 缩进值可以直接用初始化时指定的单位(如示例中的mm),也可通过pdf.in_to_mm()、pdf.pt_to_mm()等函数转换其他单位
  • 输出完缩进段落后,务必恢复原x坐标,避免影响后续段落的排版

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:50:18