我正在尝试使用Freemarker在Netsuite Advanced PDF中拼接一个字符串。我已经阅读了有关字符串内置函数的文档,但不确定如何实现。
我有一个应该包含自由文本变量的表。如果文本太长,我希望文本溢出到下一个td,但是我不知道这是否可行。我以为如果有一定数量的字符,我可以尝试拼接一半的字符串,然后将其第二部分放入下一个td中。生成范围超出范围的PDF时,这样做会产生错误。
是我正在尝试做的可能还是我做错了方法?相关代码如下。
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>${record.custbody387[0..*50]}</td>
</tr>
<tr>
<td colspan="4">${record.custbody387[51..*100]}</td>
</tr>
<tr>
<td colspan="4" style="background-color:#dce6f1">This is Note 3</td>
</tr>
<tr>
答案 0 :(得分:1)
您可以使用子字符串功能,但仍然需要检查限制。
我使用一个宏,例如:
<#macro lim val len><#if val?length < len>${val}<#else>${val?substring(0,len)}</#if></#macro>
然后将其用作:
<@lim val="${orderAddress.addressee}" len=35 />
因此,您可以创建自己的宏,以确保至少有51个字符开始。它可能看起来像:
<#macro lim val><#if val?length gte 51>${val[51..*100]}</#if></#macro>
注意:Freemarker宏位于文件顶部(与<macrolist>
元素中的BFO宏不同)
答案 1 :(得分:1)
您可以在第二个#if
中简单地使用?then
或td
来避免引起错误的情况。获取切片(具有预定义的大小)也可以概括为一个函数(或宏,但是一个函数更适合于此),但是如果仅调用它两次,则可能是一个过大的杀伤力:
<#function getSlice(s, partNo)>
<#local start = 50 * (partNo - 1)>
<#return (s?length <= start)?then("", s[start..*50])>
</#function>
<tr>
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>
${getSlice(record.custbody387, 1)}
</td>
</tr>
<tr>
<td colspan="4">
${getSlice(record.custbody387, 2)}
</td>
</tr>