使用Freemarker生成PDF时如何在列表项中插入制表符?
解决Freemarker生成PDF时列表项对齐的问题
嘿,我来帮你搞定这个Freemarker生成PDF时的对齐问题!你提到right_pad函数没起作用,大概率是因为非等宽字体在搞鬼——像Arial、宋体这类常用字体,每个字符的宽度不一样,哪怕你用right_pad补了一堆空格,PDF渲染出来视觉上还是没法对齐。下面给你几个靠谱的解决方案:
方案1:用等宽字体配合right_pad(简单直接)
如果坚持要用空格对齐,把文本切换成等宽字体(比如Courier New),这类字体里每个字符的宽度完全一致,right_pad补的空格就能精准对齐。另外你之前设置的125长度太夸张了,调整成合适的数值就行:
<#list data.house as house> <p style="font-family: 'Courier New', monospace; margin: 4px 0;">${"House name:"?right_pad(25)} ${house.name!}</p> </#list> <#list data.properties as properties> <p style="font-family: 'Courier New', monospace; margin: 4px 0;">${"Value:"?right_pad(25)} ${properties.value!} HUF</p> <p style="font-family: 'Courier New', monospace; margin: 4px 0;">${"Bank account number:"?right_pad(25)} ${properties.bankAccountNumber!}</p> </#list>
方案2:用表格布局(最推荐,稳定可靠)
PDF里的表格是实现对齐最稳妥的方式,不管用什么字体,只要给列设置好宽度,标签和值就能完美对齐,还能让整体排版更规整:
<table style="width: 100%; border-collapse: collapse; margin: 8px 0;"> <#list data.house as house> <tr> <td style="width: 35%; text-align: left; padding: 4px 8px;">House name:</td> <td style="width: 65%; text-align: left; padding: 4px 8px;">${house.name!}</td> </tr> </#list> <#list data.properties as properties> <tr> <td style="width: 35%; text-align: left; padding: 4px 8px;">Value:</td> <td style="width: 65%; text-align: left; padding: 4px 8px;">${properties.value!} HUF</td> </tr> <tr> <td style="width: 35%; text-align: left; padding: 4px 8px;">Bank account number:</td> <td style="width: 65%; text-align: left; padding: 4px 8px;">${properties.bankAccountNumber!}</td> </tr> </#list> </table>
方案3:插入制表符\t(备选,需依赖渲染器支持)
你也可以直接在标签和值之间插入制表符\t,但要注意:不同的PDF生成工具(比如iText、Flying Saucer)对制表位的处理可能不同,对齐效果没那么稳定,所以只作为备选方案:
<#list data.house as house> <p style="margin: 4px 0;">${"House name:"}\t${house.name!}</p> </#list> <#list data.properties as properties> <p style="margin: 4px 0;">${"Value:"}\t${properties.value!} HUF</p> <p style="margin: 4px 0;">${"Bank account number:"}\t${properties.bankAccountNumber!}</p> </#list>
个人最推荐用表格方案,不仅对齐稳定,后续维护样式也更方便~
内容的提问来源于stack exchange,提问作者Benke95
相关产品推荐
相关产品推荐

