在JFreeChart网站上,它表示图书馆可以以矢量格式输出图表。
来自JFreeChart网站:
- 支持许多输出类型,包括Swing组件,图像文件(包括PNG和JPEG)和矢量图形文件格式 (包括PDF,EPS和 SVG );
但是我怎样才能以SVG格式输出?
使用Apache Batik库有一种方法,但从上面的陈述我认为JFreeChart可以在没有Batik的情况下完成。
我可以在ChartUtilities类中找出PNG和JPG的输出,但似乎没有用于矢量图形输出的类。
答案 0 :(得分:11)
不,JFreeChart
支持SVG,因为它可以与Batik
或JFreeSVG
一起使用,这是必需的。相关资源包括:
JFreeSVG
,可以“使用标准Java2D
绘图API Graphics2D
生成SVG格式的内容。”可以找到演示程序here,包括此SVGBarChartDemo1
摘录:
JFreeChart chart = createChart(createDataset());
SVGGraphics2D g2 = new SVGGraphics2D(600, 400);
Rectangle r = new Rectangle(0, 0, 600, 400);
chart.draw(g2, r);
File f = new File("SVGBarChartDemo1.svg");
SVGUtils.writeToSVG(f, g2.getSVGElement());
† 免责声明:与Object Refinery Limited无关;只是一个满意的客户和非常小的贡献者。
答案 1 :(得分:1)
除了trashgod的回答
似乎JFreeSVG比Batik效率更高:http://www.object-refinery.com/blog/blog-20140423.html
答案 2 :(得分:0)
为了使其他读者更容易理解,以下代码通过使用jFreeSVG将jFreeChart转换为SVG:
import org.jfree.graphics2d.svg.SVGGraphics2D;
import org.jfree.chart.JFreeChart;
import java.awt.geom.Rectangle2D;
public String getSvgXML(){
final int widthOfSVG = 200;
final int heightOfSVG = 200;
final SVGGraphics2D svg2d = new SVGGraphics2D(widthOfSVG, heightOfSVG);
final JFreeChart chart = createYourChart();
chart.draw(svg2d,new Rectangle2D.Double(0, 0, widthOfSVG, heightOfSVG));
final String svgElement = svg2d.getSVGElement();
return svgElement;
}
要将SVG元素写入PDF文件,可以使用以下代码从SVG中生成byte [],然后将其写入文件。在这种情况下,我使用apache batic:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.fop.svg.PDFTranscoder;
public byte[] getSVGInPDF(){
final Transcoder transcoder = new PDFTranscoder();
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final TranscoderInput transcoderInput = new TranscoderInput(
new ByteArrayInputStream(getSvgXML().getBytes()));
final TranscoderOutput transcoderOutput = new TranscoderOutput(outputStream);
transcoder.transcode(transcoderInput, transcoderOutput);
return outputStream.toByteArray();
}