FPDF MultiCell自动分页问题:如何避免测验题目跨页显示
解决FPDF MultiCell内容跨页拆分问题
要实现包含题目和选项的完整段落不跨页打印,核心是提前计算段落所需高度,判断当前页面剩余空间是否足够,不足则自动新建页面。
实现步骤
- 编写辅助函数,计算指定文本生成MultiCell所需的高度
- 在循环打印每个题目时,计算当前题目(含上方间距)的总高度
- 对比页面剩余空间,若不足则新增页面
- 执行打印操作
代码实现
首先添加计算MultiCell高度的辅助函数:
def calculate_multicell_height(pdf, text, cell_height=4): original_y = pdf.get_y() # 计算MultiCell的实际宽度(0对应占满页面可用宽度) cell_width = pdf.w - pdf.l_margin - pdf.r_margin # 模拟生成MultiCell以获取高度(不显示边框) pdf.multi_cell(cell_width, cell_height, text, border=0) total_height = pdf.get_y() - original_y # 恢复原始光标位置 pdf.set_y(original_y) return total_height
然后修改原循环代码:
for question in questions: spacing = 4 # 计算当前题目所需的总高度:间距 + MultiCell高度 cell_height = calculate_multicell_height(pdf, question, cell_height=4) total_required = spacing + cell_height # 获取当前页面剩余可用高度 remaining_height = pdf.page_break_trigger - pdf.get_y() # 剩余空间不足则新建页面 if remaining_height < total_required: pdf.add_page() # 打印题目和选项 pdf.ln(spacing) pdf.multi_cell(0, 4, question, 1)
说明
- 辅助函数通过模拟生成MultiCell来计算高度,不会影响实际打印内容
page_break_trigger是FPDF内置的分页触发位置,确保内容不会超出页面底部边距- 此方法能保证每个题目(含所有选项)完整显示在同一页面,不会出现跨页拆分的情况
内容的提问来源于stack exchange,提问作者piccyno
相关产品推荐
相关产品推荐

