У меня есть 3 изображения в виде png в моих отчетах Jasper, которые генерируются во время вызова функции, которая каждый раз динамически передает все параметры. Это сработало. Теперь, когда я сделал все свои изображения в .svg, у меня возникают проблемы с памятью в Java. Вот журналы:
PDF Generation Started.
2020-03-16 05:11:31,791 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
at java.awt.geom.Path2D$Float.<init>(Path2D.java:233)
at java.awt.geom.GeneralPath.<init>(GeneralPath.java:73)
at org.apache.batik.ext.awt.geom.ExtendedGeneralPath.<init>(ExtendedGeneralPath.java:69)
at org.apache.batik.parser.AWTPathProducer.startPath(AWTPathProducer.java:116)
at org.apache.batik.dom.svg.SVGAnimatedPathDataSupport.handlePathSegList(SVGAnimatedPathDataSupport.java:59)
at org.apache.batik.bridge.SVGPathElementBridge.buildShape(SVGPathElementBridge.java:92)
at org.apache.batik.bridge.SVGShapeElementBridge.createGraphicsNode(SVGShapeElementBridge.java:60)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:213)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.getRootNode(AbstractSvgDataToGraphics2DRenderer.java:173)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.getDimension(AbstractSvgDataToGraphics2DRenderer.java:122)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processGraphics2D(JRPdfExporter.java:1912)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1592)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1542)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1482)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1100)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1063)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:927)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:547)
at net.sf.jasperreports.engine.JasperExportManager.exportToPdfStream(JasperExportManager.java:196)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfStream(JasperExportManager.java:533)
at com.cm.da.util.ReportProcessorUtil.pdfGenerator(ReportProcessorUtil.java:878)
at com.cm.da.controller.UIController.saveReport(UIController.java:607)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Я также добавил:
JRSwapFileVirtualizer virtualizer = null;
virtualizer = new JRSwapFileVirtualizer(2, new JRSwapFile("./", 2048, 1024));
virtualizer.setReadOnly(false);
Map<String, Object> reportTemplateOne = reportTemplates.getReportTemplateOne();
reportTemplateOne.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
reportTemplates.setReportTemplateOne(reportTemplateOne);
try
{
JasperPrint print = JasperFillManager.fillReport(jasperReport, reportTemplates.getReportTemplateOne(), DataSource());
virtualizer.cleanup();
return print;
}
catch(JRException | NullPointerException ex)
{
LOGGER.error("\nData could not be fetched!!!As an exception has occured due to compiling the report!!!");
ex.printStackTrace();
virtualizer.cleanup();
return null;
}
И снова проблема с памятью не решается. Изображения имеют размер 12 МБ, 14 КБ, 20 КБ. Внутри файла .jr xml все изображения используют batikRendered по следующей схеме: <imageExpression><![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]></imageExpression>