Static text cutting off while exporting reports to pdf in Linux Deployments using Jasper Reports - jasper-reports

We have static text cutting while exporting reports to pdf in Linux Deployments. The values seems to be displayed correctly only the static text is cut off. Below is the screenshot for report pdf in Windows and Linux Deployments.
Any help or input would be really appreciated.
Report on Linux region
Screenshot from Linux for report
Report in Windows
Screenshot from Windows for report
<style name="Base" isDefault="true" fontSize="8" pdfFontName="Helvetica" pdfEncoding="Cp1252" isPdfEmbedded="true"/>
Code for Status field
<staticText>
  <reportElement positionType="Float" x="0" y="11" width="29" height="11" forecolor="#000000" uuid="33ebd0e4-a138-4a26-943e-a7c1b23fd5ed"/>
  <textElement>
       <font isBold="true"/>
                </textElement>
                <text><![CDATA[Status: ]]></text>
            </staticText>
            <textField>
                <reportElement x="29" y="11" width="140" height="11" forecolor="#000000" uuid="465caf4d-66e7-412f-81f3-02349696cfc0"/>
                <textFieldExpression><![CDATA[$P{claimStatus}]]></textFieldExpression>
            </textField>
Loss Description
<frame>
                <reportElement positionType="Float" x="0" y="33" width="473" height="11" isRemoveLineWhenBlank="true" forecolor="#000000" uuid="2fc22d18-89c7-4b7c-a583-ca4f7acd2344">
                    <printWhenExpression><![CDATA[$P{lossDescription} != null && $P{lossDescription}.length() > 0]]></printWhenExpression>
                </reportElement>                
                <staticText>                
                    <reportElement positionType="Float" x="0" y="0" width="69" height="11" isRemoveLineWhenBlank="true" forecolor="#000000" uuid="70d296f8-0869-4ecf-bf57-a6bdc50366de" backcolor="blue">
                        <printWhenExpression><![CDATA[$P{lossDescription} != null && $P{lossDescription}.length() > 0]]></printWhenExpression>
                    </reportElement>
                    
                    <textElement>                        
                        <font isBold="true"/>
                    </textElement>
                    <text><![CDATA[Loss Description: ]]></text>
                </staticText>
                <textField isStretchWithOverflow="true" isBlankWhenNull="true">
                    <reportElement positionType="Float" x="69" y="0" width="368" height="11" isRemoveLineWhenBlank="true" forecolor="#000000" uuid="7318184a-2d1a-4c75-aaf7-e5c2609e7d92">
                        <printWhenExpression><![CDATA[$P{lossDescription} != null && $P{lossDescription}.length() > 0]]></printWhenExpression>
                    </reportElement>                   
                    <textFieldExpression><![CDATA[$P{lossDescription}]]></textFieldExpression>
                </textField>
            </frame>

In order to resolve it, we included the Arial font in jasper-font jar and changed the font from Helvetica to Arial in reports.
Once done, Reports started rendering fine in Linux and Windows region since Arial font TTF files were part of the war thru jasper-font jar.

Related

How to declare a parameter in jasper reports

I'm trying to pass a string parameter "title" and display it in jasper report.
var parameters = mutableMapOf<String, Any>()
parameters["title"] = "My Title"
val jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource)
I have declared parameter in jrxml as this.
<jasperReport name="transactions" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" >
...
<field name="txId" class="java.lang.Long"></field>
...
<parameter name = "title" class = "java.lang.String"></parameter>
...
<textField>
<reportElement x="238" y="0" width="100" height="20"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class="java.lang.String">
<![CDATA[$P{title}]]>
</textFieldExpression>
</textField>
...
</jasperReport>
But when I run the report generation it does not recognize parameter tag and gives this error.
net.sf.jasperreports.engine.JRException: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 58; cvc-complex-type.2.4.a: Invalid content was found starting with element 'parameter'. One of '{field, sortField, variable, filterExpression, group, background, title, pageHeader, columnHeader, detail, columnFooter, pageFooter, lastPageFooter, summary, noData}' is expected.
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:302)
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:285)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:274)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:219)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:194)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:185)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:288)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:575)
at hms.rincewind.merchantportal.service.ReportService.generateReport(ReportService.kt:26)
at hms.rincewind.merchantportal.service.TransactionService.getTransactions(TransactionService.kt:32)
at hms.rincewind.merchantportal.graphql.api.transaction.TransactionQuery$transactions$1.invokeSuspend(TransactionQuery.kt:23)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:561)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:727)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:667)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:655)
Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 58; cvc-complex-type.2.4.a: Invalid content was found starting with element 'parameter'. One of '{field, sortField, variable, filterExpression, group, background, title, pageHeader, columnHeader, detail, columnFooter, pageFooter, lastPageFooter, summary, noData}' is expected.
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
Can someone help me to fix this issue.

How to create multiple charts of same type but with different dataseries using JRBeanCollectionDatasource in Jasperreports

I have to create multiple XY-line charts with different dataset using same chart report template and I also have to use JRBeanCollectionDatasource for it.
Requirements:
1) Should be done using JRBeanCollectionDatasource.
2) Have to use the same chart report template to create multiple charts.
3) Number of charts are not fixed (Here I have problem giving names to Report Parameter in java). Because in ReportParametersMap, they can only have unique key name .
Java:
Coordinates.java
private Number series;
private Number xCoordinate;
private Number yCoordinate;
//Getters & Setters
GenerateReport.java
I am working with Report Book and each report template of the report book is considered as a sub-report. So I am passing XYChartDataSource(java.util.List) to master report book and I would map this parameter with the subreport by using
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{XYChartDataSource}) as a Datasource Expression.
and in Subreport, I have created a parameter XYChartDataSource(java.util.List) and created fields (series,xCoordinate,yCoordinate) in MainDataset ( used in chart)
List<List<Coordinates>> allchartData = new ArrayList<>();
List<Coordinates> chartData = new ArrayList<>();
chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
allchartData.add(chartData);
.
.
.
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
allchartData.add(chartData);
.
.
.
for (int i = 0; i < baselineChartData.size(); i++) {
parameters.put("XYChartDataSource", allchartData.get(i));
}
main_report_book.jrxml
<parameter name="XYChartDataSource" class="java.util.List"/>
<part uuid="5e668430-9acd-4835-be21-f4e2902ce33d">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{XYChartDataSource})]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_chart.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
sub_chart.jrxml
<parameter name="XYChartDataSource" class="java.util.List"/>
<field name="xCoordinate" class="java.lang.Double"/>
<field name="yCoordinate" class="java.lang.Double"/>
<field name="series" class="java.lang.Double"/>
<summary>
<band height="405">
<xyLineChart>
<chart evaluationTime="Report" bookmarkLevel="1">
<reportElement x="30" y="98" width="525" height="230" uuid="627d87d6-b675-409c-accb-b2bb3ffb9c80">
<property name="net.sf.jasperreports.chart.domain.axis.tick.interval" value="1"/>
</reportElement>
<chartTitle/>
<chartSubtitle/>
<chartLegend position="Right"/>
</chart>
<xyDataset>
<xySeries autoSort="true">
<seriesExpression><![CDATA[$F{series}]]></seriesExpression>
<xValueExpression><![CDATA[$F{xCoordinate}]]></xValueExpression>
<yValueExpression><![CDATA[$F{yCoordinate}]]></yValueExpression>
</xySeries>
</xyDataset>
<linePlot isShowShapes="false">
<plot/>
<categoryAxisFormat>
<axisFormat/>
</categoryAxisFormat>
<valueAxisFormat>
<axisFormat/>
</valueAxisFormat>
</linePlot>
</xyLineChart>
</textField>
</band>
</summary>
Current Output:
only one chart is being printed, using the regular method.
Expected Output:
Here I am showing two charts(could be more in actual output) , which needs to be generated from same report template in the SAME PDF REPORT:
chart1
chart2
You problem is here:
for (int i = 0; i < baselineChartData.size(); i++) {
parameters.put("XYChartDataSource", allchartData.get(i));
}
Your parameter "XYChartDataSource" will contain last entry in your List, you replace each time in loop see Map.put(K key,V value))
What we need instead is the whole list
parameters.put("XYChartDataSource", allchartData);
However now we can't access directly the List<Coordinates>
On solution to not change your current subreport is to insert another subreport in the middle which will iterate your List<List<Coordinates>> in detail band.
The structure will be
Pass List<List<Coordinates>> allchartData as datasource to this new subreport (sub_charts.jrxml)
Define the field _THIS which is List<Coordinates> in subreport (hence it's iterating your List<List<Coordinates>>)
In detail band include current sub_chart.jrxml and pass $F{_THIS} as datasource
sub_charts.jrxml
<?xml version="1.0" encoding="UTF-8"?>
<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="sub_charts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bc8c76ba-0b85-4522-bf67-4c62ae87202b">
<field name="_THIS" class="java.util.List">
<fieldDescription>_THIS</fieldDescription>
</field>
<detail>
<band height="63" splitType="Stretch">
<subreport>
<reportElement x="0" y="0" width="550" height="60" uuid="b0e761bf-fe02-4a0a-bafb-32d6831b7a13"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{_THIS})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_chart.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
Remember to call this new subreport in your main_report_book.jrxml.
<subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_charts.jasper"]]></subreportExpression>
The OP Dhruvil Thaker did this great graphical representation of this answer.

How to generate an XML report?

I have a requirement where I need to generate the XML reports and I need to populate the the XML with the values from Database.
I starting using Jasper Reports where I can generate the reports of PDF, xls and CSV but I couldn't able to generate the XML.
I have a jrxml file which I did compile and used the snippet below for generating PDF, CSV and XLS, but generating XML seems to be an issue:
if(contentType == 'text/csv'){
params.response.setHeader("Content-disposition", "attachment;filename=" + params.reportName + ".csv")
exporter = new net.sf.jasperreports.engine.export.JRCsvExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
if(params.feed){
exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER, "|");
}
fileName = reportTempDir + "/" + fileName + ".csv"
}else if(contentType== 'application/pdf'){
params.response.setHeader("Content-disposition", "attachment;filename=" + params.reportName + ".pdf")
exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
fileName = reportTempDir + "/" + fileName + ".pdf"
}else{
params.response.setHeader("Content-disposition", "attachment;filename=" + params.reportName + ".xls")
exporter = new net.sf.jasperreports.engine.export.JExcelApiExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE,true);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET ,false);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS ,true);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS ,true);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND ,false);
exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS ,false);
exporter.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN ,false);
exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_CELL_BORDER ,false);
exporter.setParameter(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED ,true);
exporter.setParameter(JRXlsExporterParameter.SHEET_NAMES ,[sheetName]as String[]);
fileName = reportTempDir + "/" + fileName + ".xls"
}
FileOutputStream osGenre = new FileOutputStream(fileName);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, osGenre);
exporter.exportReport();
There is the JRXmlExporter
JRXmlExporter exporter = new JRXmlExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleXmlExporterOutput(outputSteam));
exporter.exportReport();
This will generate an xml file of your JasperPrint, however its not a clean extraction of your data but only a xml representation of the the print
Example
<?xml version="1.0" encoding="UTF-8"?>
<jasperPrint xmlns="http://jasperreports.sourceforge.net/jasperreports/print" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/print http://jasperreports.sourceforge.net/xsd/jasperprint.xsd" name="ReportStat" pageWidth="595" pageHeight="842" topMargin="30" leftMargin="20" bottomMargin="30" rightMargin="20" locale="it_IT" timezone="Europe/Berlin">
<origin band="title"/>
<origin band="columnHeader"/>
<origin band="detail"/>
<origin band="summary"/>
<page>
<text verticalAlignment="Middle" textHeight="12.578125" lineSpacingFactor="1.2578125" leadingOffset="-2.1972656">
<reportElement uuid="dfe13f55-12a6-4c33-b5ba-00dd61f37c96" mode="Opaque" x="20" y="335" width="100" height="20" forecolor="#000000" backcolor="#CCCCCC" origin="1" srcId="2" printId="1"/>
<box leftPadding="2">
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textContent><![CDATA[TOTALE]]></textContent>
</text>
....
</page>
</jasperPrint>
If you need a more clean extraction of data you need to create your own CustomExporter, a good start can be to override the JRCsvExporter and implement your own logic.

Why not executed liquibase?

I execute changeset:
     <changeSet id = "1" author = "yu">
<preConditions onFail = "MARK_RAN">
<not>
<indexExists schemaName = "myschema" indexName = "my_table_idx" />
</ not>
</ preConditions>
      <createIndex tableName = "my_table" indexName = "my_table_idx">
             <column name = "id_1c"> </ column>
             <column name = "program_id"> </ column>
         </ createIndex>
     </ changeSet>
I get the error: ERROR: relation "my_table_idx" already exists
It turns out that does not work preConditions. Why?

jasper reports barcode using style-Barcode

I am trying to use barcode in JasperReports for which I am using the barcode4j jar.
The jars that i am using are:
barcode4j-2.0.jar
commons-beanutils.jar
commons-codec-1.6.jar
commons-collections.jar
commons-digester-2.0.jar
commons-lang-2.0.jar
commons-logging.jar
commons-net-1.2.2.jar
commons-validator.jar
db2jcc.jar
db2jcc_license_cu.jar
itext-2.1.7.jar
jasperreports-4.5.0.jar
log4j-1.2.8.jar
poi-3.8-20120326.jar
The jrxml file content where I am using barcode is as given below:
<title>
<band height="125">
<frame>
<reportElement x="0" y="0" width="555" height="40" />
<componentElement>
<reportElement style="Barcode" x="5" y="5" width="400" height="30"/>
<c:Code39 xmlns:c="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<c:codeExpression>$F{OPA_ACK_NO_PK}</c:codeExpression>
</c:Code39>
</componentElement>
</frame>
</band>
</title>
But I am getting the following error:
net.sf.jasperreports.engine.JRRuntimeException: Could not resolve style(s): Barcode4j
at net.sf.jasperreports.engine.fill.JRFillObjectFactory.checkUnresolvedReferences(JRFillObjectFactory.java:1577)
at net.sf.jasperreports.engine.fill.JRFillObjectFactory.setStyles(JRFillObjectFactory.java:1504)
at net.sf.jasperreports.engine.fill.JRBaseFiller.loadStyles(JRBaseFiller.java:912)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:804)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:746)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
at Report.Test.main(Test.java:162)
Please guide me as to what am I doing wrong?
After removing the comment for Barcode style tag, i got rid of that error and got another exception:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/batik/bridge/UserAgent
at net.sf.jasperreports.components.barcode4j.BarcodeSVGImageProducer.createImage(BarcodeSVGImageProducer.java:69)
at net.sf.jasperreports.components.barcode4j.BarcodeFillComponent.setBarcodeImage(BarcodeFillComponent.java:149)
at net.sf.jasperreports.components.barcode4j.BarcodeFillComponent.fill(BarcodeFillComponent.java:113)
at net.sf.jasperreports.engine.fill.JRFillComponentElement.fill(JRFillComponentElement.java:148)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.fillElements(JRFillElementContainer.java:570)
at net.sf.jasperreports.engine.fill.JRFillFrame.fill(JRFillFrame.java:276)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.fillElements(JRFillElementContainer.java:570)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:406)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:352)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:323)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:257)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:746)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
at Report.Test.main(Test.java:169)
I added the required batik, crimson, xerces and xercesImpl jars. But I am getting the following error:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.apache.batik.bridge.ViewBox.getPreserveAspectRatioTransform([FSZFF)Ljava/awt/geom/AffineTransform; from class net.sf.jasperreports.renderers.BatikRenderer
at net.sf.jasperreports.renderers.BatikRenderer.render(BatikRenderer.java:123)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1405)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:757)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportFrame(JRPdfExporter.java:2554)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:765)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:721)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:635)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:383)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:122)
at Report.Test.main(Test.java:172)
You should add library batik-bridge:
<dependency>
<groupId>batik</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.6-1</version>
</dependency>
Yesterday i had exactly the same problem, i succeded to resolve it by using:
<componentElement>
<reportElement x="311" y="166" width="180" height="10"/>
<jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="Code39 (Extended)" drawText="false" checksumRequired="false">
<jr:codeExpression><![CDATA[$P{barcode}]]></jr:codeExpression>
</jr:barbecue>
</componentElement>
For me adding batik-bridge with below dependency to project pom.xml worked:
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.9.1</version>
</dependency>