jmikel Posted April 8, 2014 Share Posted April 8, 2014 Hi All,Because my report has some contents that be spread page out. hence, I tried to re-format report before export it into pdf.My code below:JRVirtualizer virtualizer = new AJVirtualizer(); JRVirtualizationHelper.setThreadVirtualizer(virtualizer); AJPersistenceManager pmgr = new AJPersistenceManager(); JasperPrint print = pmgr.readPrintFromFile(prtFileName, startPage, endPage); AJLayout ajLayout = new AJLayout(); if(exporter instanceof AJPdfExporter || exporter instanceof AJRtfExporter) { try { print = ajLayout.spreadPageOut(print); } catch (vqException e) { e.printStackTrace(); } } exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); if(this.outputFile != "") { exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, this.outputFile); } else { exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, this.ostream); } exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, contentEncoding); exporter.setParameter(AJExporterParameter.REPORT_FILE_NAME, dbFileName());[/code]AJLayout.javapublic class AJLayout { private static final Log log = LogFactory.getLog(AJLayout.class); private int pageWidth; private int pageHeight; private int leftPageMargin = 36; private JasperPrint jp; public AJLayout() {} public JasperPrint spreadPageOut(JasperPrint jasperPrint) throws vqException { jp = new JasperPrint(); pageWidth = jasperPrint.getPageWidth(); pageHeight = jasperPrint.getPageHeight(); jp.setPageHeight(pageHeight); jp.setPageWidth(pageWidth); try { log.info("AJLayout: spreadPageOut"); for (int i = 0; i < jasperPrint.getPages().size(); i++) { spreadPageOut(jasperPrint.getPages().get(i)); } } catch (Exception ex) { log.error(ex); } return jp; } public void spreadPageOut(JRPrintPage page) { boolean hasSpread = false; boolean isAdded2NewPage = false; List<JRPrintElement> elements = page.getElements(); int posSpreadX = 0; JRBasePrintPage curPage = new JRBasePrintPage(); JRBasePrintPage spreadPage = null; for (int i = 0; i < elements.size(); i++) { isAdded2NewPage = false; //JRPrintElement element = elements.get(i); int eWidth = elements.get(i).getWidth(); int eX = elements.get(i).getX(); if (eWidth < pageWidth && ((eX + eWidth) > pageWidth)) { JRPrintElement element = elements.get(i); if (!hasSpread) { hasSpread = true; posSpreadX = eX - leftPageMargin; if (spreadPage == null) { spreadPage = new JRBasePrintPage(); } } element.setX(eX - posSpreadX); spreadPage.addElement(element); isAdded2NewPage = true; } else { curPage.addElement(elements.get(i)); } if (isAdded2NewPage == false && (elements.get(i) instanceof JRTemplatePrintFrame)) { JRTemplatePrintFrame returnedFrame = spreadPageOut((JRTemplatePrintFrame) elements.get(i), eX); if (returnedFrame != null) { if (spreadPage == null) { spreadPage = new JRBasePrintPage(); } spreadPage.addElement(returnedFrame); } } } jp.addPage(curPage); if (spreadPage != null) { spreadPageOut(spreadPage); } } public JRTemplatePrintFrame spreadPageOut(JRTemplatePrintFrame frame, int posXOffset) { boolean hasSpread = false; boolean isAdded2NewFrame = false; List<JRPrintElement> elements = frame.getElements(); int posSpreadX = 0; JRTemplatePrintFrame spreadFrame = null; int pageWidthBound = pageWidth - posXOffset; for (int i = 0; i < elements.size(); i++) { isAdded2NewFrame = false; //JRPrintElement element = elements.get(i); int eWidth = frame.getElements().get(i).getWidth(); int eX = frame.getElements().get(i).getX(); if (eWidth < pageWidth && ((eX + eWidth) > pageWidthBound)) { JRPrintElement element = elements.get(i); if (!hasSpread) { hasSpread = true; posSpreadX = eX; if (spreadFrame == null) { spreadFrame = new JRTemplatePrintFrame(new JRTemplateFrame(frame.getOrigin(), frame.getDefaultStyleProvider())); spreadFrame.setY(frame.getY()); spreadFrame.setX(leftPageMargin); } } elements.remove(element); i--; element.setX(eX - posSpreadX); spreadFrame.addElement(element); isAdded2NewFrame = true; } if (isAdded2NewFrame == false && (elements.get(i) instanceof JRTemplatePrintFrame)) { JRTemplatePrintFrame returnedFrame; returnedFrame = spreadPageOut((JRTemplatePrintFrame) elements.get(i), posXOffset + eX); if (returnedFrame != null) { if (spreadFrame == null) { spreadFrame = new JRTemplatePrintFrame(new JRTemplateFrame(frame.getOrigin(), frame.getDefaultStyleProvider())); spreadFrame.setY(frame.getY()); spreadFrame.setX(leftPageMargin); } spreadFrame.addElement(returnedFrame); } } } return spreadFrame; } }[/code] My code run sucessfully with a small report. But when i execute with huge-report (size > 2G). I got an error below:[root@VSDEV-94-35 init.d]# Exception in thread "Thread-0" Exception in thread "pool-2-thread-2" Exception in thread "pool-2-thread-4" Exception in thread "RMI RenewClean-[192.168.94.35:57380]" java.lang.OutOfMemoryError: Java heap space at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readUTF(Unknown Source) at java.io.ObjectInputStream.readUTF(Unknown Source) at net.sf.jasperreports.engine.virtualization.StringSerializer.read(StringSerializer.java:61) at net.sf.jasperreports.engine.virtualization.StringSerializer.read(StringSerializer.java:32) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.fill.JRTemplatePrintText.readVirtualized(JRTemplatePrintText.java:1038) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.fill.JRTemplatePrintFrame.readVirtualized(JRTemplatePrintFrame.java:158) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.fill.JRTemplatePrintFrame.readVirtualized(JRTemplatePrintFrame.java:158) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.base.VirtualElementsData.readVirtualized(VirtualElementsData.java:179) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.util.VirtualizationSerializer.readData(VirtualizationSerializer.java:135) at net.sf.jasperreports.engine.util.SwapFileVirtualizerStore.retrieve(SwapFileVirtualizerStore.java:137) at net.sf.jasperreports.engine.fill.StoreVirtualizer.pageIn(StoreVirtualizer.java:58) at net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer.requestData(JRAbstractLRUVirtualizer.java:521) at net.sf.jasperreports.engine.base.ElementsBlock.ensureData(VirtualizableElementList.java:463)java.lang.OutOfMemoryError: Java heap space at java.lang.Class.privateGetDeclaredFields(Unknown Source) at java.lang.Class.getDeclaredField(Unknown Source) at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source) at java.io.ObjectStreamClass.access$700(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.<init>(Unknown Source) at java.io.ObjectStreamClass.lookup(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.writeObject(Unknown Source) at sun.rmi.transport.DGCImpl_Stub.dirty(Unknown Source) at sun.rmi.transport.DGCClient$EndpointEntry.makeDirtyCall(Unknown Source) at sun.rmi.transport.DGCClient$EndpointEntry.access$1600(Unknown Source) at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(Unknown Source) at java.lang.Thread.run(Unknown Source)java.lang.OutOfMemoryError: Java heap space at sun.nio.cs.ISO_8859_1.newEncoder(Unknown Source) at java.lang.StringCoding$StringEncoder.<init>(Unknown Source) at java.lang.StringCoding$StringEncoder.<init>(Unknown Source) at java.lang.StringCoding.encode(Unknown Source) at java.lang.String.getBytes(Unknown Source) at java.io.UnixFileSystem.getBooleanAttributes0(Native Method) at java.io.UnixFileSystem.getBooleanAttributes(Unknown Source) at java.io.File.exists(Unknown Source) at org.apache.log4j.helpers.FileWatchdog.checkAndConfigure(FileWatchdog.java:77) at org.apache.log4j.helpers.FileWatchdog.run(FileWatchdog.java:108)java.lang.OutOfMemoryError: Java heap space at sun.reflect.GeneratedConstructorAccessor14.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:111) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.fill.JRTemplatePrintFrame.readVirtualized(JRTemplatePrintFrame.java:158) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.fill.JRTemplatePrintFrame.readVirtualized(JRTemplatePrintFrame.java:158) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.base.VirtualElementsData.readVirtualized(VirtualElementsData.java:179) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:119) at net.sf.jasperreports.engine.virtualization.SerializableSerializer.read(SerializableSerializer.java:35) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:137) at net.sf.jasperreports.engine.virtualization.VirtualizationInput.readJRObject(VirtualizationInput.java:105) at net.sf.jasperreports.engine.util.VirtualizationSerializer.readData(VirtualizationSerializer.java:135) at net.sf.jasperreports.engine.util.SwapFileVirtualizerStore.retrieve(SwapFileVirtualizerStore.java:137) at net.sf.jasperreports.engine.fill.StoreVirtualizer.pageIn(StoreVirtualizer.java:58) at net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer.requestData(JRAbstractLRUVirtualizer.java:521) at net.sf.jasperreports.engine.base.ElementsBlock.ensureData(VirtualizableElementList.java:463) at net.sf.jasperreports.engine.base.ElementsBlock.ensureDataAndTouch(VirtualizableElementList.java:432) at net.sf.jasperreports.engine.base.ElementsBlock.get(VirtualizableElementList.java:283) at net.sf.jasperreports.engine.base.VirtualizableElementList.get(VirtualizableElementList.java:96) at net.sf.jasperreports.engine.base.VirtualizableElementList.get(VirtualizableElementList.java:54) at com.alu.vital.vq.jasper.exporter.AJLayout.spreadPageOut(AJLayout.java:66)[/code]Please take a look and give to me your idea to fix this issue? Thanks and best regards, Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now