Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package de.chott.jfreechartsample.service; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; import de.chott.jfreechartsample.boundary.PieChartDataService; import de.chott.jfreechartsample.boundary.RingChartDataService; import de.chott.jfreechartsample.model.PieChartData; import de.chott.jfreechartsample.model.RingChartData; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.Stateless; import javax.inject.Inject; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.data.general.DefaultPieDataset; /** * * Stateless EJB, welche die Daten fr die Charts aus der Datenbank anfordert und daraus die Charts in ein PDF-File rendert. * * @author CHOTT */ @Stateless public class ChartService { @Inject private RingChartDataService ringChartDataService; @Inject private PieChartDataService pieChartDataService; /** * Hauptmethode dieses Services, welche alle Aktionen veranlasst. * * @return Das fertige PDF-File als ByteArray */ public byte[] getChartPDF() { return writeChartsToDocument(createPieChart(), createRingChart()); } /** * Diese Methode erstellt ein PieChart aus den PieChart-Daten. Die Daten werden dabei nicht bergeben, sondern direkt vm Service angefragt. * Fr sptere Ausbaufhigkeit knnte man die zu verarbeitenden Daten als bergabeparameter mitgeben, statt sie direkt auslesen zu lassen. * * @return das fertige PieChart. */ private JFreeChart createPieChart() { DefaultPieDataset dataSet = new DefaultPieDataset(); for (PieChartData data : pieChartDataService.loadAll()) { dataSet.setValue(data.getCountry(), data.getWeight()); } JFreeChart chart = ChartFactory.createPieChart("Anteil am Fondsvermgen", dataSet, true, false, Locale.GERMANY); return chart; } /** * Diese Methode erstellt ein RingChart aus den RingChartDaten. * * @return Das fertige RingChart. */ private JFreeChart createRingChart() { DefaultPieDataset dataSet = new DefaultPieDataset(); for (RingChartData data : ringChartDataService.loadAll()) { dataSet.setValue(data.getSecurity(), data.getWeighting()); } JFreeChart chart = ChartFactory.createRingChart("", dataSet, true, false, Locale.GERMANY); return chart; } /** * Schreibt mehrere JFreeCharts in ein PDF. Fr jedes Chart wird hierbei eine halbe PDF-Seite verwendet. * * @param charts * @return Das PDF als ByteArray */ private byte[] writeChartsToDocument(JFreeChart... charts) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); float width = PageSize.A4.getWidth(); float height = PageSize.A4.getHeight() / 2; int index = 0; Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, baos); document.open(); PdfContentByte contentByte = writer.getDirectContent(); for (JFreeChart chart : charts) { PdfTemplate template = contentByte.createTemplate(width, height); Graphics2D graphics2D = template.createGraphics(width, height); Rectangle2D rectangle2D = new Rectangle2D.Double(0, 0, width, height); chart.draw(graphics2D, rectangle2D); graphics2D.dispose(); contentByte.addTemplate(template, 0, height - (height * index)); index++; } writer.flush(); document.close(); return baos.toByteArray(); } catch (Exception ex) { Logger.getLogger(ChartService.class.getName()).log(Level.SEVERE, null, ex); } return null; } }