Jfreechart, exportar a imagen

sal00m
16 de Mayo del 2005
Llevo algun tiempo programando con jfreechart y genero graficas de todo tipo y demas... mi duda viene cuando lo que me gustaria hacer es un servicio web para que genere una grafica y la devuelva, es decir, se le pasarian los parametros que fuesen al servicio web en cuestion y este devolveria una imagen.

Es posible esto??? como se podria hacer??? les estaria muy agradecido si me pudiesen ayudar que estoy un pelin perdio jejeje

nicokiki
16 de Mayo del 2005
Hola!!!!

Mira, la verdad es q hace menos de 10 dias use jfreechart para generar graficos en un ambiente web. Desde el Action de Struts invoco a un wrapper q genera tres graficos y los guardo en el servidor en un directorio temporal con un nombre hardcodeado a medias. Luego le paso al JSP los nombres de los graficos y esos mismos los pongo en el tag <IMG/> de HTML y les voy cambiando el src="..." para q apunten a los archivos generados.
El inconveniente es q los archivos no se borran pero bueno, tampoco son tantos o tan pesados.
Te paso la clase que genera los graficos:

package ar.com.tecosoft.svdweb.grafico;

import java.awt.Color;
import java.io.File;

import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.BarRenderer;
import org.jfree.data.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;

import ar.com.tecosoft.commonlib.logueo.TecoLogger;
import ar.com.tecosoft.commonlib.logueo.TecoLoggerException;

/** Clase que genera tres archivo JPEG. Uno es un grafico de barras y el otro de torta
* @author ngonzalez */
public class GeneradorGraficos {
private String[] textosArray;
private String[] valoresArray;
private String nombreArchivo;

private TecoLogger logger;


/** Constructor por default
* @param textos Textos separados por ;
* @param valores Valores separados por ;
* @param nombreArchivo Nombre del archivo con path incluido
* @param tituloGrafico Titulo a mostrar en el grafico */
public GeneradorGraficos( String textos,
String valores,
String nombreArchivo) {
this.textosArray = textos.split(";");
this.valoresArray = valores.split(";");
this.nombreArchivo = nombreArchivo;

try {
logger = TecoLogger.getLogger(this.getClass());
}
catch (TecoLoggerException e1) {
e1.printStackTrace();
}

}

/** Metodo que genera tres garficos. Uno de torta, de barras horizontal y vertical. Los nombres de los archivos seran formados
* en el Action invocador, pero los tres graficos seran lo obtenido + "_barras_horizontal.jpg" + "_barras_vertical.jpg" +
* "_torta.jpg".
* @param textos Textos de los valores recibidos separados por ;
* @param valores Valores recibidos separados por ;
* @param nombreArchivo Nombre del archivo con path incluido
* @throws Arroja uan java.lang.Exception */
public void generarGraficos() throws Exception{

try {
generarGraficoDeBarras();
generarGraficoDeTorta();
}
catch (Exception ex) {
logger.error("generarGraficos()", "Excepcion generando graficos");
throw new Exception(ex.getMessage());
}

}

/** Metodo que guarda en un archivo el grafico JPEG de tortas */
private void generarGraficoDeTorta() throws Exception {
final PieDataset data = createPieDataset(this.textosArray, this.valoresArray);
final JFreeChart chartTorta = ChartFactory.createPieChart( "Gráfico de Torta",
data,
true,
true,
true);

chartTorta.setBackgroundPaint(Color.GRAY);
PiePlot plot = (PiePlot) chartTorta.getPlot();
plot.setNoDataMessage("No hay datos disponibles");
plot.setCircular(false);
plot.setBackgroundPaint(Color.LIGHT_GRAY);

try {
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
logger.debug("generarGraficoDeTorta()", "Antes de guardar al archivo");
ChartUtilities.saveChartAsJPEG(new File(nombreArchivo + "_torta.jpg"), 1, chartTorta, 600, 400);
logger.info("generarGraficoDeTorta()", "Guardo el archivo a " + nombreArchivo + "_torta.jpg");
}
catch (Exception e) {
logger.error("generarGraficoDeTorta()", "Error al generar el archivo JPG de barras");
logger.error("generarGraficoDeTorta()", e.toString());
throw new Exception("Error al generar el archivo JPG");
}

}

/** Metodo que guarda los dos archivos JPEG de torta */
private void generarGraficoDeBarras() throws Exception {

DefaultCategoryDataset data = createBarChart3DDataSet();

JFreeChart chartHorizontal = ChartFactory.createBarChart3D( "Gráfico de Barras Horizontal",
"Categorías",
"Valores",
data,
PlotOrientation.HORIZONTAL,
true,
false,
false);

chartHorizontal.setBackgroundPaint(Color.GRAY);
CategoryPlot plot = chartHorizontal.getCategoryPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setDomainGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.white);

final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setDrawBarOutline(false);

JFreeChart chartVertical = ChartFactory.createBarChart3D( "Gráfico de Barras Vertical",
"Categorías",
"Valores",
data,
PlotOrientation.VERTICAL,
true,
false,
false);

chartVertical.setBackgroundPaint(Color.GRAY);
CategoryPlot plotVert = chartVertical.getCategoryPlot();
plotVert.setBackgroundPaint(Color.lightGray);
plotVert.setDomainGridlinePaint(Color.white);
plotVert.setDomainGridlinesVisible(true);
plotVert.setRangeGridlinePaint(Color.white);

// set the range axis to display integers only...
final NumberAxis rangeAxisVert = (NumberAxis)plotVert.getRangeAxis();
rangeAxisVert.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

// disable bar outlines...
BarRenderer rendererVert = (BarRenderer)plotVert.getRenderer();
rendererVert.setDrawBarOutline(false);

try {
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
logger.debug("generarGraficoDeBarras()", "Antes de guardar al archivo");
ChartUtilities.saveChartAsJPEG(new File(nombreArchivo + "_barras_horizontal.jpg"), 1, chartHorizontal, 600, 400);
ChartUtilities.saveChartAsJPEG(new File(nombreArchivo + "_barras_vertical.jpg"), 1, chartVertical, 600, 400);
logger.info("generarGraficoDeBarras()", "Guardo el archivo a " + nombreArchivo + "_barras_horizontal.jpg");
logger.info("generarGraficoDeBarras()", "Guardo el archivo a " + nombreArchivo + "_barras_vertical.jpg");
}
catch (Exception e) {
logger.error("generarGraficoDeBarras()", "Error al generar el archivo JPG de barras");
logger.error("generarGraficoDeBarras()", e.toString());
throw new Exception("Error al generar el archivo JPG");
}
}


/** Metodo que crea en si el grafico de torta
* <h1>Metodo copiado del applet</h1>
* @author Autor del metodo del applet */
private PieDataset createPieDataset(String[] textos,String[] valores){
final double[][] data = new double[valores.length][valores.length] ;

for (int i=0;i<valores.length;i++){
for (int j=0;j<valores.length;j++){
data[i][j] = new Double(valores[i]).doubleValue();
}
}

String[] args0 = textos;
String[] args1 = textos;

return DatasetUtilities.createPieDatasetForColumn(DatasetUtilities.createCategoryDataset(args0,args1, data),0);

}

/** Metodo que crea en si el grafico de barras 3D
* <h1>Metodo copiado del applet</h1>
* @author Autor del metodo del applet */
private DefaultCategoryDataset createBarChart3DDataSet() {

DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for (int i=0;i<this.valoresArray.length;i++){
dataset.addValue(new Double(this.valoresArray[i]).doubleValue(), "", this.textosArray[i]);
}

return dataset;
}

}

A esta la llamas desde el servlet o Action y despues le pasas los valores al JSP.

Salu2!!!!!!!!!! y espero q sirva

sal00m
16 de Mayo del 2005
A tus pies nicokiki...... muchisimas gracias en serio.... no me esperaba tanto asi que muchisimas gracias :)