Jasper reports JasperReports:防止在空格或连字符上拆分文本字段

Jasper reports JasperReports:防止在空格或连字符上拆分文本字段,jasper-reports,Jasper Reports,我有一个JasperReports模板,它包含一个textField元素,该元素将包含可变长度的字符串。如果字符串太长而无法适应宽度,则会将其拆分,这很好,除非字符串包含连字符或空格字符。在本例中,字符串从该字符中拆分。下面是一些输入、观察到的结果和想要的结果+总结的例子,以使我的观点更容易理解 input observed wanted summary _____________________________________ overflow -> overfl -

我有一个JasperReports模板,它包含一个textField元素,该元素将包含可变长度的字符串。如果字符串太长而无法适应宽度,则会将其拆分,这很好,除非字符串包含连字符或空格字符。在本例中,字符串从该字符中拆分。下面是一些输入、观察到的结果和想要的结果+总结的例子,以使我的观点更容易理解

input      observed   wanted   summary
_____________________________________
overflow  -> overfl -> overfl : OK
over flow -> over   -> over f : NOT OK
over-flow -> over-  -> over-f : NOT OK
将reportElement设置为具有isStretchWithOverflow=“true”属性会将文本分成两行,但这不是所需的行为

有没有办法解决这个问题

谢谢

编辑:输入数据来自外部源,因此我无法直接更改。我运行了一些测试,并注意到使用不间断的空格将适用于空格。另一方面,完全不打印非中断连字符,即文本“溢出”变为“溢出”。不完全是想要的

尽管输入源不在我的控制范围内,但我可以通过编写一个Scriptlet来解决这个问题,该Scriptlet将空格更改为不间断空格,并将连字符更改为不间断连字符,前提是这些该死的不间断连字符将被打印


顺便说一下,打印成PDF格式,以防出现问题。

这是字体问题。如果字体支持,不间断连字符(\u2011)可以正常工作。请参阅字体示例,了解如何加载默认字体以外的字体(例如DejaVu SAN)

如果有人有比Scriptlet更好的输入源修改选项,请告诉我

(将我自己的答案标记为正确,以便结束此主题。)

编辑:必须等待两天才能将此答案标记为正确。

在文本字段“表达式”中键入如下内容:

String.join("\uFEFF", $F{field1}.split("(?!^)"))

您的问题与@Alex K相同,但不完全相同,我不希望文本拆分为多行。我只想结束这一切。查看来源是我的下一个选择,另一篇文章给出了一个很好的提示,告诉我应该在哪里寻找。你的解决方案听起来不错。我可能会通过将计算直接放入TextField来避免scriptlet。使用commons lang utility()replaceChars或只使用java.lang.String.replaceAll()几次。谢谢@mdahlman,我将检查将计算直接放在文本字段中的选项。您使用了什么计算?@Maxrunner我在7年前就做了这个回答,所以很遗憾,我记不起任何细节。我想我所说的“计算”是指“转换”,即将连字符转换为非中断连字符。我不记得Jasper Reports是如何工作的,但我想我一定已经编写了一些代码,可以遍历所有输入数据并用不间断连字符替换连字符。这是怎么做的?它会在字符串的每个字符之间插入“零宽度不间断空格”。这在bundle locale属性文件中有效吗?test.message=..enviar\uFEFF-\uFEFFnos