org.jfree.chart.util.ExportUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jfreechart Show documentation
Show all versions of jfreechart Show documentation
JFreeChart is a class library, written in Java, for generating charts.
Utilising the Java2D APIs, it currently supports bar charts, pie charts,
line charts, XY-plots and time series plots.
/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2014, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jfreechart/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.]
*
* ----------------
* ExportUtils.java
* ----------------
* (C) Copyright 2014, by Object Refinery Limited and Contributors.
*
* Original Author: David Gilbert (for Object Refinery Limited);
* Contributor(s): -;
*
* Changes:
* --------
* 27-Jun-2014 : Version 1 (DG);
*
*/
package org.jfree.chart.util;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.imageio.ImageIO;
import org.jfree.ui.Drawable;
/**
* Utility functions for exporting charts to SVG and PDF format.
*
* @since 1.0.18
*/
public class ExportUtils {
/**
* Returns true
if JFreeSVG is on the classpath, and
* false
otherwise. The JFreeSVG library can be found at
* http://www.jfree.org/jfreesvg/
*
* @return A boolean.
*/
public static boolean isJFreeSVGAvailable() {
Class> svgClass = null;
try {
svgClass = Class.forName("org.jfree.graphics2d.svg.SVGGraphics2D");
} catch (ClassNotFoundException e) {
// svgClass will be null so the function will return false
}
return (svgClass != null);
}
/**
* Returns true
if OrsonPDF is on the classpath, and
* false
otherwise. The OrsonPDF library can be found at
* http://www.object-refinery.com/pdf/
*
* @return A boolean.
*/
public static boolean isOrsonPDFAvailable() {
Class> pdfDocumentClass = null;
try {
pdfDocumentClass = Class.forName("com.orsonpdf.PDFDocument");
} catch (ClassNotFoundException e) {
// pdfDocument class will be null so the function will return false
}
return (pdfDocumentClass != null);
}
/**
* Writes the current content to the specified file in SVG format. This
* will only work when the JFreeSVG library is found on the classpath.
* Reflection is used to ensure there is no compile-time dependency on
* JFreeSVG.
*
* @param drawable the drawable (null
not permitted).
* @param w the chart width.
* @param h the chart height.
* @param file the output file (null
not permitted).
*/
public static void writeAsSVG(Drawable drawable, int w, int h,
File file) {
if (!ExportUtils.isJFreeSVGAvailable()) {
throw new IllegalStateException(
"JFreeSVG is not present on the classpath.");
}
ParamChecks.nullNotPermitted(drawable, "drawable");
ParamChecks.nullNotPermitted(file, "file");
try {
Class> svg2Class = Class.forName(
"org.jfree.graphics2d.svg.SVGGraphics2D");
Constructor> c1 = svg2Class.getConstructor(int.class, int.class);
Graphics2D svg2 = (Graphics2D) c1.newInstance(w, h);
Rectangle2D drawArea = new Rectangle2D.Double(0, 0, w, h);
drawable.draw(svg2, drawArea);
Class> svgUtilsClass = Class.forName(
"org.jfree.graphics2d.svg.SVGUtils");
Method m1 = svg2Class.getMethod("getSVGElement", (Class[]) null);
String element = (String) m1.invoke(svg2, (Object[]) null);
Method m2 = svgUtilsClass.getMethod("writeToSVG", File.class,
String.class);
m2.invoke(svgUtilsClass, file, element);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
} catch (InstantiationException ex) {
throw new RuntimeException(ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
} catch (SecurityException ex) {
throw new RuntimeException(ex);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException(ex);
}
}
/**
* Writes a {@link Drawable} to the specified file in PDF format. This
* will only work when the OrsonPDF library is found on the classpath.
* Reflection is used to ensure there is no compile-time dependency on
* OrsonPDF.
*
* @param drawable the drawable (null
not permitted).
* @param w the chart width.
* @param h the chart height.
* @param file the output file (null
not permitted).
*/
public static final void writeAsPDF(Drawable drawable,
int w, int h, File file) {
if (!ExportUtils.isOrsonPDFAvailable()) {
throw new IllegalStateException(
"OrsonPDF is not present on the classpath.");
}
ParamChecks.nullNotPermitted(drawable, "drawable");
ParamChecks.nullNotPermitted(file, "file");
try {
Class> pdfDocClass = Class.forName("com.orsonpdf.PDFDocument");
Object pdfDoc = pdfDocClass.newInstance();
Method m = pdfDocClass.getMethod("createPage", Rectangle2D.class);
Rectangle2D rect = new Rectangle(w, h);
Object page = m.invoke(pdfDoc, rect);
Method m2 = page.getClass().getMethod("getGraphics2D");
Graphics2D g2 = (Graphics2D) m2.invoke(page);
Rectangle2D drawArea = new Rectangle2D.Double(0, 0, w, h);
drawable.draw(g2, drawArea);
Method m3 = pdfDocClass.getMethod("writeToFile", File.class);
m3.invoke(pdfDoc, file);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
} catch (InstantiationException ex) {
throw new RuntimeException(ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
} catch (SecurityException ex) {
throw new RuntimeException(ex);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException(ex);
}
}
/**
* Writes the current content to the specified file in PNG format.
*
* @param drawable the drawable (null
not permitted).
* @param w the chart width.
* @param h the chart height.
* @param file the output file (null
not permitted).
*
* @throws FileNotFoundException if the file is not found.
* @throws IOException if there is an I/O problem.
*/
public static void writeAsPNG(Drawable drawable, int w, int h,
File file) throws FileNotFoundException, IOException {
BufferedImage image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
drawable.draw(g2, new Rectangle(w, h));
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
try {
ImageIO.write(image, "png", out);
}
finally {
out.close();
}
}
/**
* Writes the current content to the specified file in JPEG format.
*
* @param drawable the drawable (null
not permitted).
* @param w the chart width.
* @param h the chart height.
* @param file the output file (null
not permitted).
*
* @throws FileNotFoundException if the file is not found.
* @throws IOException if there is an I/O problem.
*/
public static void writeAsJPEG(Drawable drawable, int w, int h,
File file) throws FileNotFoundException, IOException {
BufferedImage image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
drawable.draw(g2, new Rectangle(w, h));
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
try {
ImageIO.write(image, "jpg", out);
}
finally {
out.close();
}
}
}