Jasper文本字段被截断

17
我在Jasper报表中遇到了字体问题,其中一个比较冗长的文本域(位于详细区段的最后一个)在PDF和PDF预览中被截断了,但在内部预览中没有被截断。

例如:

内部预览:

Here is a fake description. It fits
perfectly, fitting just in the lines.

PDF预览

Here is a fake description. It 
fits perfectly, fitting just in the
Jasper似乎使用某种算法来确定字段的高度,我的文本几乎放不下,然后在生成PDF时,文本换行并消失在下一行。
我没有使用自定义字体(只是默认/隐式的“SansSerif”),也没有使用除粗体/斜体之外的任何自定义样式。这种行为在iReport的PDF预览和我的代码在Windows和MacOS上生成的PDF中都可以演示(Linux可能仍然存在此问题,但我的示例文本在Ubuntu上没有显示该行为)。
我尝试过拉伸类型、位置类型和带溢出的拉伸,以及将此文本字段移到其自己的band中,但没有修复此错误(其中一些会导致其他错误)。
我曾经成功地更改过字体到其他内置字体,但这只是告诉我我的示例对于特定的字体不起作用,而不是我已经解决了这个bug。
非常感谢任何提示。
更新1:
我尝试将Jasper Reports 5.2.0升级到6.2.0和Jasper Fonts 4.0.0升级到6.0.0...没有变化。
更新2:
尝试编辑我的`src/main/resources/jasperreports_extension.properties`并添加
net.sf.jasperreports.export.pdf.force.linebreak.policy=true

...没有变化。

(值得注意的是,在我的使用情况下,我不能使用isStretchWithOverflow="true",所以这可能是为什么它没起作用的原因。)

更新3

我尝试通过编辑src/main/resources/jasperreports_extension.xml并添加以下内容来嵌入字体:

net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.arialFontFamily=fonts/customFontFamilies.xml

自定义字体族名(customFontFamilies.xml):

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
 <fontFamily name="ArialEM">
   <normal><![CDATA[fonts/Arial/Arial.ttf]]></normal>
   <bold><![CDATA[fonts/Arial/Arial Bold.ttf]]></bold>
   <italic><![CDATA[fonts/Arial/Arial Italic.ttf]]></italic>
   <boldItalic><![CDATA[fonts/Arial/Arial Bold Italic.ttf]]>/boldItalic>
   <pdfEncoding><![CDATA[Cp1252]]></pdfEncoding>
   <pdfEmbedded><![CDATA[true]]></pdfEmbedded>
 </fontFamily>
</fontFamilies>

......没有任何效果。(不过这确实有助于解决Firefox的PDF渲染器无法呈现粗体字的问题。)

更新4

我注意到在我能够创建的所有测试用例中,第一行都是空白的,所以我将特定单元格更改为vertical-align top,这个方法有效,但当文本内容很少时会使单元格错位。

抛弃了这个解决方案,但对其他人可能有用。

更新5

此时,希望已经清楚,我尝试了“真正”的解决方案,并看着它们全部死亡。因此,我们进入了黑客解决方案的领域。首先,我尝试了@wmmci的解决方案,但他的答案改变了我的框的高度(因为它是由Dynamic Jasper动态计算的)。我注意到,我能够创建的所有示例都涉及字符串中的句内点号,例如,“foo...bar”。那可能不是你的情况,但是对我来说是这样的。所以我在句内空格后注入了“hair space” (&#8202;)。

这显然不是真正的解决方案,只是一个临时的解决办法,直到我能够找到更多的bug示例。

更新6

我检查过了,我没有@KarolisŠarapnickis的printOrder问题。啊,好吧。我会继续努力的。;-)


1
你找到这个问题的解决方案了吗?我也遇到了同样的问题,真的很烦人...似乎jasper无法计算加粗输入数据的最大字符数,然后在导出为PDF时截断剩余部分。 - Jesus Peralta
将来参考,遇到此问题的用户应检查字体扩展是否正确使用。 - Petter Friberg
5个回答

18

我曾遇到同样的问题,尝试了所有可能的配置 - 但都不起作用。最后,我找到了一个解决方法:在字段末尾添加一个新行字符,这样就能正常工作了。 类似这样:$F{description} + "\n"


1
任何可扩展的文本区域都会出现这个问题,因此您需要将回车符添加到所有内容中。此外,它还会影响字段高度。尽管如此... 对于绝望的人来说,这是一个可行的解决方法(可以说我就是其中之一)。 - inanutshellus
对我也起作用了。在我们的情况下,jasperprint 是在 Linux 服务器上生成并在 Windows 客户端上显示的。我猜它使用稍小一点的 Linux 字体来计算所需的空间,然后在 Windows 上显示时,Windows 字体无法适应。 - tobi42
点赞 - 在我发现这个解决方案之前,我花了很多时间尝试和搜索。 - Plamen
这个解决方法对我们起作用了。但是我们在一些字段底部得到了不想要的换行符。我认为这可能与我们的pdf字体是Helvetica和jasper字体是arial有关。显然,pdf字体已经被弃用,因此我们将调查更好的修复方法。可能使用字体扩展。 - Chris
这在某些情况下对我有用,但在另一些情况下则不行……我使用的是Tibco Jaspersoft 6.3.0 - undefined

1

我遇到了文本被截断的问题,尝试了很多方法都无效。幸运的是,我发现我的根XML元素具有以下属性:

printOrder="Horizontal"

去掉它解决了我的问题。


在我的情况下,我仍然遇到了这个问题,但是在我的JRXML文件的根节点中没有printOrder="Horizontal"。希望这能帮助到其他人。 - inanutshellus

1

嗯,我不确定你是否遇到了我曾经遇到的确切问题。 但是我的解决方案是将字段的属性"net.sf.jasperreports.print.keep.full.text"设置为"true"。


0
在我的情况下,我有一个非常长的文本在单个文本字段中。添加换行符可以解决一些单元格的问题,但对于跨越页面的非常长的单元格则无效。最终解决方案是将文本字段设置为拉伸到RELATIVE_TO_BAND_HEIGHT。之前,它被设置为RELATIVE_TO_TALLEST_OBJECT。我猜测,RELATIVE_TO_TALLEST_OBJECT的计算不正确(比实际需要的低)。
这样做就可以了:
textField.setStretchType( StretchTypeEnum.RELATIVE_TO_BAND_HEIGHT );

0

看起来唯一可行的解决方案是像@wmmcii所说的那样放置一些文本格式化标记。然后使用另一个文本渲染器(在这里讨论)。但是换行符\n并不理想,因为会对输出文档产生不必要的影响。更好的解决方案似乎是在行末放置制表符\t。为了避免在使用水平对齐=两端对齐时出现额外问题,在制表符之前也要加上一个空格。例如:

$F{my_text} + " \t"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接