在freemarker中拼接字符串的中间部分?

时间:2018-11-29 15:37:58

标签: pdf netsuite freemarker

我正在尝试使用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>

2 个答案:

答案 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中简单地使用?thentd来避免引起错误的情况。获取切片(具有预定义的大小)也可以概括为一个函数(或宏,但是一个函数更适合于此),但是如果仅调用它两次,则可能是一个过大的杀伤力:

<#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>