Сращивание середины строки в freemarker?

Я пытаюсь соединить строку в Netsuite Advanced PDF с помощью Freemarker. Я читал документацию по встроенным строковым командам и не был уверен, как это возможно.

У меня есть таблица, которая должна включать переменную произвольного текста. Я хочу, чтобы текст переходил к следующему 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>
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
0
0
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать функцию подстроки, но вам все равно нужно проверить пределы.

Я использую такой макрос:

<#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 располагаются вверху файла (в отличие от макросов BFO, которые входят в элемент <macrolist>).

Ответ принят как подходящий

Вы можете просто использовать #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>

Спасибо, в итоге я использовал #if для выполнения этой задачи.

Jdg50 06.12.2018 16:02

Другие вопросы по теме