如何为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
相关产品推荐
相关产品推荐

