JasperReports: странное поведение в текстовом поле при конвертации в PDF - PullRequest
0 голосов
/ 06 марта 2020

Мне нужно отобразить большое количество текста в отчете 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>

И результат ...

pdf from jasper reports

Итак, как вы можете видеть, в нижней части каждого текстового поля есть «случайное» поле. Я схожу с ума, пытаясь убрать этот запас, но я не знаю, как это сделать. Если я предварительно просмотрю это на JasperStudio, то выглядит хорошо, но проблема заключается в том, что я экспортирую в PDF.

Конечно, зеленые / синие линии просто для отладки текстовых полей.

И есть еще один странное поведение, когда текст достигает конца страницы, в какой-то момент строка разрывается, не доходя до конца строки, как вы можете видеть на этом изображении (вверху страница 1, нижняя страница 2):

pdf from jasper

Спасибо!

1 Ответ

1 голос
/ 08 марта 2020

Благодаря Alex K ответим в комментариях! Он дал мне ключ, и речь идет о шрифте. По любой причине, если я не определяю какой-либо шрифт для своего текстового поля, промежуток между ними является случайным. Итак, исправлено добавление этого:

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

Это только решило мою проблему с использованием Jaspersoft Studio, но мое приложение Spring Boot развернуло в Docker linux контейнер, throw и исключения, потому что не нашел Arial шрифт на JVM.

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

Я следую этому среднему посту, чтобы встроить шрифт Arial в мой проект Spring Boot: https://medium.com/@seymorethrottle / jasper-reports-add-custom-fonts-589b55a52e7 c Внимательно прочитайте, обратите особое внимание на этот абзац:

Обратите внимание, что CDATA для элементов font (ttf) и pdf - это путь к файлу шрифта относительно root из банки. Как этот путь туда попал? Мы ввели его в поле «Имя шрифта PDF», прежде чем экспортировать банку. Интуитивно понятно? Настолько интуитивно понятный, что я потерял час работы и потратил на вкладки браузера то, что напоминало пол гигабайта оперативной памяти, пытаясь выяснить, почему экспортированный jar-файл вызывал ошибки в Java.

Еще раз спасибо Alex K за ключ!

...