Prawn中如何实现bounding_box内所有内容的文本两端对齐
Prawn 实现 bounding_box 内文本两端对齐方案
你当前代码不生效有两个核心原因:一是错误使用table方法传递纯文本参数,二是没有显式给文本/单元格指定两端对齐属性,以下是可直接落地的实现方式:
方案1:纯文本场景(推荐,无多余结构)
如果只是渲染普通备注文本,不需要表格结构,直接用Prawn原生的text方法即可,原生支持align: :justify两端对齐属性,不需要套无意义的无框表格:
if customer_note.present? pdf.bounding_box [0, 50], width: 350 do pdf.text customer_note, align: :justify, # 核心参数:设置两端对齐 leading: 3, # 可选:设置行间距,按需调整 inline_format: true # 可选:支持<b>/<i>等简单富文本标签,不需要可删除 end end
方案2:必须保留table结构的场景
如果后续需要扩展成多列/多行表格,需要注意两个点:一是table入参必须是二维数组格式,二是对齐属性必须在单元格样式里显式声明(单元格不会继承外层bounding_box的文本属性):
if customer_note.present? pdf.bounding_box [0, 50], width: 350 do # 注意:纯文本要包装成 [[文本]] 的二维数组格式,直接传字符串会被按字符拆成多行 pdf.table([[customer_note]], cell_style: { borders: [], padding: 0, align: :justify # 核心参数:给单元格内文本设置两端对齐 }) end end
常见踩坑说明
- Prawn 默认对段落最后一行做左对齐处理,如果需要最后一行也强制两端对齐,可在text/cell_style里额外加参数
justify_last_line: true(Prawn 2.4及以上版本支持)- 渲染中文文本时请提前加载支持中文的字体,否则会因为字体宽度计算错误导致对齐效果异常
- 不要手动给文本设置过大的字间距、字符间距,会干扰两端对齐的自动空格计算逻辑
内容的提问来源于stack exchange,提问作者Samuel D.
相关产品推荐
相关产品推荐

