【问题标题】:JasperReports: weird behaviour on textfield when convert to PDFJasperReports:转换为 PDF 时文本字段的奇怪行为
【发布时间】:2020-03-06 19:14:28
【问题描述】:

我需要在 Jasper 报告中显示大量来自 JSON 数组的文本。 这是我的 json 数组:

{
"data": {
    "contractualConditions": [
        {
            "text": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam feugiat neque nec felis fringilla, sed eleifend odio dictum. Suspendisse arcu ligula, gravida condimentum fringilla ac, tincidunt nec orci. Suspendisse et ullamcorper magna. Aliquam suscipit posuere dolor at sagittis. In sed nisl sit amet lorem elementum tempor a in justo. Nam facilisis tellus ut semper lacinia. Cras eu nibh nisl. Maecenas egestas posuere dignissim.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam feugiat neque nec felis fringilla, sed eleifend odio dictum. Suspendisse arcu ligula, gravida condimentum fringilla ac, tincidunt nec orci. Suspendisse et ullamcorper magna. Aliquam suscipit posuere dolor at sagittis. In sed nisl sit amet lorem elementum tempor a in justo. Nam facilisis tellus ut semper lacinia. Cras eu nibh nisl. Maecenas egestas posuere dignissim.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam feugiat neque nec felis fringilla, sed eleifend odio dictum. Suspendisse arcu ligula, gravida condimentum fringilla ac, tincidunt nec orci. Suspendisse et ullamcorper magna. Aliquam suscipit posuere dolor at sagittis. In sed nisl sit amet lorem elementum tempor a in justo. Nam facilisis tellus ut semper lacinia. Cras eu nibh nisl. Maecenas egestas posuere dignissim.</p>"
        },
        {
            "text": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam feugiat neque nec felis fringilla, sed eleifend odio dictum. Suspendisse arcu ligula, gravida condimentum fringilla ac, tincidunt nec orci. Suspendisse et ullamcorper magna. Aliquam suscipit posuere dolor at sagittis. In sed nisl sit amet lorem elementum tempor a in justo. Nam facilisis tellus ut semper lacinia. Cras eu nibh nisl. Maecenas egestas posuere dignissim.</p>"
        },
        {
            "text": "<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi nibh diam, tincidunt nec condimentum quis, pulvinar nec sem. Curabitur nec vehicula purus. Pellentesque ac metus in sem aliquet pretium vitae non tellus. Aenean quis mi euismod orci euismod facilisis. Aliquam quis velit nisi. Ut hendrerit malesuada ligula id venenatis. Sed sagittis dolor mauris, nec elementum dui ornare nec. Fusce vel elementum dui. Donec tempor scelerisque sagittis. Nulla facilisi. Nam ac sagittis justo. Maecenas felis sapien, mollis quis feugiat at, mollis at justo. Proin leo dui, consequat eu pretium quis, eleifend sed sapien. Integer tellus eros, interdum ut molestie id, elementum et justo.</p>"
        }
    ]
}}

这是我的 Jasper 文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.11.0.final using JasperReports Library version 6.11.0-0c4056ccaa4d25a5a8c45672d2f764ea3498bebb  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ClauseSubReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="c75e022d-0c3e-47e1-b8fb-bbe084875130">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="sectionFive.xml"/>
    <queryString language="json">
        <![CDATA[data.contractualConditions]]>
    </queryString>
    <field name="text" class="java.lang.String">
        <property name="net.sf.jasperreports.jsonql.field.expression" value="text"/>
    </field>
    <detail>
        <band height="10">
            <property name="com.jaspersoft.studio.layout"/>
            <frame borderSplitType="DrawBorders">
                <reportElement stretchType="ElementGroupHeight" x="0" y="0" width="555" height="10" uuid="0048bcd5-74f4-44e8-8aae-cb4fb6b9a5ec"/>
                <box>
                    <pen lineColor="#98FC26"/>
                    <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#98FC26"/>
                    <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#98FC26"/>
                    <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#98FC26"/>
                    <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#98FC26"/>
                </box>
                <textField textAdjust="StretchHeight">
                    <reportElement x="60" y="1" width="490" height="9" forecolor="#1F497D" uuid="6448707a-6f36-4bef-96a1-6bc7634e72c3">
                        <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="34deaa54-ac6e-42dd-8c82-c125d6810c22"/>
                    </reportElement>
                    <box>
                        <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#1F497D"/>
                        <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#1F497D"/>
                        <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#1F497D"/>
                        <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#1F497D"/>
                    </box>
                    <textElement textAlignment="Justified" markup="html">
                        <font size="7"/>
                    </textElement>
                    <textFieldExpression><![CDATA[$F{text}]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </detail>
</jasperReport>

结果……

因此,正如您所见,每个文本字段的底部都有一个“随机”边距。我正在疯狂地试图删除这个边距,但我不知道该怎么做。如果我在 JasperStudio 上预览,看起来不错,但问题是当我导出为 PDF 时。

当然,绿/蓝线只是为了调试文本边距。

还有另一种奇怪的行为,当文本到达页面末尾时,会在某个点换行,而不是像您在此图像上看到的那样到达行尾(顶部是第 1 页,底部是第 2 页):

谢谢!

【问题讨论】:

  • 您是否尝试在输入数据中不使用 html 标记和不使用

    的情况下检查报告?

  • 是的,结果相同... :(
  • 我试用了您的模板,它在我的 JSS 6.12.0 上运行良好。在我的情况下,生成的 pdf 使用 Arial 字体(我不认为这是字体问题,但谁知道)
  • 你太棒了!我将字体设置为 Arial,现在 PDF 看起来很棒!我删除了文本中的 Arial 字体,因为我遇到了 Linux 和字体问题(JVM 无法使用字体 Arial)。非常感谢!

标签: jasper-reports export-to-pdf


【解决方案1】:

感谢Alex K 在 cmets 中的回答! 他给了我钥匙,是关于字体的。出于任何原因,如果我没有为我的文本字段定义任何字体,它们之间的空间是随机的。 所以,固定添加这个:

<textElement textAlignment="Justified" markup="html">
    <font fontName="Arial" size="7"/>
</textElement>

这仅解决了我使用 Jaspersoft Studio 的问题,但我的 Spring Boot 应用程序部署到 Docker linux 容器中,由于在 JVM 上没有找到 Arial 字体,因此抛出异常。

net.sf.jasperreports.engine.util.JRFontNotFoundException: Font 'Arial' is not available to the JVM.

为了在我的 Spring Boot 项目中嵌入 Arial 字体,我关注了这个中型帖子:https://medium.com/@seymorethrottle/jasper-reports-adding-custom-fonts-589b55a52e7c 仔细阅读,特别注意这一段:

请注意,字体 (ttf) 和 pdf 元素的 CDATA 是指向 相对于 jar 根的字体文件。那条路是怎么来的 那里?我们在导出之前将它输入到 PDF 字体名称字段中 罐子。直觉对吧?如此直观以至于我失去了一个小时的工作, 并用尽了浏览器选项卡上感觉像是半 GB 的 RAM 试图找出为什么导出的 jar 文件会引发错误 Java。

再次感谢Alex K 提供密钥!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多