Jasper Report Java:在换行时避免断行



我有一个Java项目,它动态地编译Jasper XML,然后导出为PDF。

在其中一个文本字段中,我需要JasperReports不剪切单词,而是调整字体大小。字体大小的改变工作得很好,当文本很大时,Jasper会减少字体并包裹文本,但是"不剪字"。部分不工作,很多时候,PDF将结束的文本超过几行,但包装会切断单词非常不合逻辑的部分,甚至有时只是留下一个字母的一个单词在下一行。你能告诉我我哪里做错了吗?

我已经添加并测试了我在Jasper文档中找到的所有参数,并与谷歌有关断字,但没有一个,或者它们的任何组合都会改变结果。

文本字段的罪魁祸首在这里:

<textField textAdjust="ScaleFont" isBlankWhenNull="true">
<reportElement stretchType="ElementGroupBottom" x="10" y="124" width="771"
height="396" isPrintInFirstWholeBand="true" isPrintWhenDetailOverflows="true"
uuid="bb2d4ab6-fc46-4edd-87ad-18dc4d32d461">
<property name="net.sf.jasperreports.print.keep.full.text" value="Boolean.TRUE"/>
<property name="net.sf.jasperreports.print.html.wrap.break.word" value="Boolean.FALSE"/>
<property name="net.sf.jasperreports.text.save.line.breaks" value="Boolean.FALSE"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle" markup="html">
<font size="140" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{letrero}]]></textFieldExpression>
</textField>

生成报告的Java部分在这里:

try {
parameters.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, entityManager);
JasperReport report = JasperCompileManager.compileReport(Util.getFileInClassPathAsInputStream("/web/report/name-sign.jrxml"));

JasperPrint print = JasperFillManager.fillReport(report, parameters, new JREmptyDataSource());

return JasperExportManager.exportReportToPdf(print);
} catch (JRException ex) {
ex.printStackTrace();
logger.error( ex.getMessage());
}
return null;

我发现了这个Jasper Reports规范:

https://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/fill/TextMeasurer.html

讨论了大多数可用于换行文本的参数,并添加了属性:

<property name="net.sf.jasperreports.text.truncate.at.char" value="false"/>

根据我所能理解的规格,这告诉jasper不要破坏字符,但只有一个单词…问题就解决了!

全文字段现在是这样的:

<textField textAdjust="ScaleFont" isBlankWhenNull="true">
<reportElement stretchType="ElementGroupBottom" x="10" y="124" width="771" height="396" isPrintInFirstWholeBand="true" isPrintWhenDetailOverflows="true" uuid="bb2d4ab6-fc46-4edd-87ad-18dc4d32d461">
<property name="net.sf.jasperreports.print.keep.full.text" value="false"/>
<property name="net.sf.jasperreports.text.save.line.breaks" value="true"/>
<property name="net.sf.jasperreports.export.pdf.force.linebreak.policy" value="true"/>
<property name="net.sf.jasperreports.text.truncate.at.char" value="false"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle" markup="html">
<font pdfFontName="Helvetica" size="136" isBold="true" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{letrero}]]></textFieldExpression>
</textField>

希望这对有类似问题的人有所帮助!

编辑:这种配置解决这个问题在一些但不是所有情况下,如果文本符合2线包装一克拉的第一个词碧玉仍然宁愿这样做稍微减少字体,但是现在,至少,如果一个caracter包装是发生在第二或第三行现在的行为是,碧玉会slighlty减少字体大小比包装一个数字一个新行……我猜是ScaleFont"算法和"截断";政策制定者在一起工作时遇到了困难。因此,如果有人发现一个更好的解决方案总是有效的,我仍然对一个比我找到的更好的答案感兴趣。

编辑2:最终解决方案发现,问题是字体问题,添加:pdfFontName="Helvetica"在文本元素中工作到目前为止。我认为,在没有指定字体的情况下,Jasper会根据其默认字体设置所需的缩放,然后如果pdf可以自由选择稍微不同的字体,Jasper定义的缩放可能不会产生预期的效果。好吧,假设这部分…

最新更新