Convertir Gráficas JFreeChart a PDF

En este tutorial veremos como podemos convertir una gráfica generada con la biblioteca JFreeChart a un archivo PDF, para esta terea usaremos un librería llamada OrsonPDF que nos facilitará el trabajo, no solo para convertir gráficas, también nos servirá para crear archivos PDF usando Java2D drawing API (Graphics2D)  por lo que podremos convertir cualquier gráfico Java2D a formato PDF.

Debemos descargar las respectivas librerías, para nuestro ejemplo las ubicaremos en la carpeta lib dentro de nuestra carpeta de proyecto, para agregar estos archivos jar al proyecto hacemos lo siguiente:

Hacemos clic derecho sobre Libraries en nuestro proyecto y presionamos Add JAR/Folder.

Agregar libreria orsonpdf a netbeans

Seleccionamos la librerías Java que vamos a utilizar y presionamos abrir, tendremos lo siguiente:

Guardar JFreeChart en archivo PDF

Lo siguiente que haremos será crear la gráfica JFreeChart, asumimos que el lector tiene los conocimientos necesarios para crear gráficas con esta librería, primero veamos el código requerido para generar la fuente de datos.

private static PieDataset createDataset() {
    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue("OpenCV 3.x", new Double(40.0));
    dataset.setValue("Java", new Double(20.0));
    dataset.setValue("Python 3.x", new Double(20.0));
    dataset.setValue("OpengGL", new Double(10.5));
    dataset.setValue("Win32", new Double(5.25));
    dataset.setValue(".NET", new Double(5.25));
    return dataset;
}

Ahora creamos la gráfica, será de tipo PieChart y la usaremos para representar la cantidad de tutoriales que escribimos sobre una determinada tecnología de programación, estos datos no son reales.

private static JFreeChart createChart(PieDataset dataset) {

    JFreeChart chart = ChartFactory.createPieChart(
            "TUTOR DE PROGRAMACION", dataset, false, false, false);

    chart.setBackgroundPaint(new GradientPaint(new Point(0, 0),
            new Color(20, 20, 20), new Point(400, 200), Color.DARK_GRAY));

    TextTitle t = chart.getTitle();
    t.setHorizontalAlignment(HorizontalAlignment.CENTER);
    t.setPaint(new Color(240, 240, 240));
    t.setFont(new Font("Arial", Font.BOLD, 26));

    PiePlot plot = (PiePlot) chart.getPlot();

    plot.setBackgroundPaint(null);
    plot.setInteriorGap(0.04);
    plot.setOutlineVisible(false);
    plot.setShadowPaint(null);
    plot.setLabelShadowPaint(null);
    plot.setBaseSectionOutlinePaint(Color.WHITE);
    plot.setSectionOutlinesVisible(true);
    plot.setBaseSectionOutlineStroke(new BasicStroke(2.0f));
    plot.setLabelFont(new Font("Courier New", Font.BOLD, 20));
    plot.setLabelLinkPaint(Color.WHITE);
    plot.setLabelLinkStroke(new BasicStroke(2.0f));
    plot.setLabelOutlineStroke(null);
    plot.setLabelPaint(Color.WHITE);
    plot.setLabelBackgroundPaint(null);

    TextTitle url = new TextTitle(
            "Blog Oficial: http://acodigo.blospot.com",
            new Font("Courier New", Font.PLAIN, 12));
    url.setPaint(Color.WHITE);
    url.setPosition(RectangleEdge.BOTTOM);
    url.setHorizontalAlignment(HorizontalAlignment.RIGHT);

    TextTitle description = new TextTitle(
            "Los tutoriales mas frecuentes en nuestro blog",
            new Font("Arial", Font.PLAIN, 18));
    description.setPaint(Color.LIGHT_GRAY);
    description.setPosition(RectangleEdge.TOP);
    description.setHorizontalAlignment(HorizontalAlignment.LEFT);

    chart.addSubtitle(description);
    chart.addSubtitle(url);

    return chart;
}

Ahora que tenemos la gráfica preparada vamos a lo que nos interesa, como convertirla a formato PDF.

Guardar gráfica JFreeChart en formato PDF

Ya tenemos la biblioteca OrsonPDF en el classpath, para crear nuestro archivo PDF requerimos un objeto PDFDocument, este representa un documento PDF, lo usamos para establecer el titulo, autor, etc., por otra parte un objeto Page representa una página del documento, en esta colocaremos el contenido del archivo.

JFreeChart chart = createChart(createDataset());

PDFDocument pdfDoc = new PDFDocument();
pdfDoc.setTitle("Tutor de Programacion");
pdfDoc.setAuthor("carmelo");

Page page = pdfDoc.createPage(new Rectangle(612, 468));
PDFGraphics2D g2 = page.getGraphics2D();

chart.draw(g2, new Rectangle(0, 0, 612, 468));

pdfDoc.writeToFile(new File("E:\\JFreeChart-PDF.pdf"));

Para dibujar la gráfica en el Page primero debemos obtener el mismo, lo hacemos usando el método pdfDoc.createPage(...) luego debemos obtener el objeto PDFGraphics2D para ello usamos page.createGraphics2D() este objeto es similar al Graphics2D de la Java2D API solo que este genera la salida en formato PDF.

Page page = pdfDoc.createPage(new Rectangle(612, 468));
PDFGraphics2D g2 = page.getGraphics2D();

La gráfica JFreeChart se dibuja usando el método chart.draw(...) y para escribir el archivo PDF tenemos el método pdfDoc.writeFile(...).

chart.draw(g2, new Rectangle(0, 0, 612, 468));

pdfDoc.writeToFile(new File("E:\\JFreeChart-PDF.pdf"));

El resultado es el archivo JFreeChart-PDF.pdf guardado en el disco E:, cambia al ruta si es necesario, al abrir este archivo veremos lo siguiente:

Convertir grafica JFreeChart a PDF

Debemos saber que podemos dibujar directamente usando el objeto PDFGraphics2D esta clase extiende la funcionalidad de Graphics2D adaptándola para generar la salida en formato PDF, de modo que podemos dibujar usando los este objeto del mismo modo como los hacemos con la API Java2D.

PDFDocument pdfDoc = new PDFDocument();
pdfDoc.setTitle("Tutor de Programacion");
pdfDoc.setAuthor("carmelo");
 
Page page = pdfDoc.createPage(new Rectangle(612, 468));
 
PDFGraphics2D g2 = page.getGraphics2D();
g2.setFont(new Font("Arial", Font.BOLD, 26));
 
String text = "Convertir Graphics2D a formato PDF.";
Rectangle2D rect = g2.getFontMetrics().getStringBounds(text, g2);
 
g2.setColor(Color.red);
g2.drawRoundRect(10, 10, (int)rect.getWidth() + 10, (int)rect.getHeight() + 10, 10, 10);
g2.setColor(Color.blue);
g2.drawString(text, 15, 10 + (int)rect.getHeight());
 
pdfDoc.writeToFile(new File("E:\\Java2D-PDF.pdf"));

Convertir Graphics2D a PDF

El archivo generado contendrá la salida respectiva para los métodos drawString(...) y drawRoundRect() que utilizamos en este pequeño ejemplo, si comprendiste la idea puedes llegar a dibujar cualquier figura y guardarla como PDF.

Descargar: proyecto jfreechart-pdf.zip

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV

Acceso a la webcam con OpenCV