如何将JFreeChart生成的矢量图形插入PPTX演示文稿?
如何将JFreeChart矢量图表插入PPT
当前实现将JFreeChart转为PNG插入PPT,放大后画质损失严重。要实现类似PDF的矢量图效果,可通过将图表转为SVG格式插入PPT(PPT原生支持SVG矢量图),具体实现如下:
修改后的完整代码
import java.awt.Dimension; import java.awt.Rectangle; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.apache.batik.svggen.SVGGraphics2D; import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.xslf.usermodel.XSLFPictureData; import org.apache.poi.xslf.usermodel.XSLFPictureShape; import org.apache.poi.xslf.usermodel.XSLFSlide; import org.w3c.dom.Document; import org.apache.batik.dom.GenericDOMImplementation; /** * @author vsolotyc */ public class JFreeChartToPpt { public void createPpt() throws Exception{ // 创建PPT文档 XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); // 生成JFreeChart图表 JFreeChart chart = ChartFactory.createLineChart( "图表标题", "X轴", "Y轴", null, PlotOrientation.VERTICAL, true, true, false ); // 将JFreeChart转为SVG矢量图 org.w3c.dom.DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); Document document = domImpl.createDocument(null, "svg", null); SVGGraphics2D svgGenerator = new SVGGraphics2D(document); // 设置图表尺寸并绘制到SVG Dimension chartSize = new Dimension(500, 300); chart.draw(svgGenerator, chartSize); // 将SVG转为字节数组 ByteArrayOutputStream baos = new ByteArrayOutputStream(); Writer writer = new OutputStreamWriter(baos, "UTF-8"); svgGenerator.stream(writer, true); writer.close(); byte[] svgData = baos.toByteArray(); // 将SVG插入PPT XSLFPictureData pd = ppt.addPicture(svgData, PictureType.SVG); XSLFPictureShape pic = slide.createPicture(pd); pic.setAnchor(new Rectangle(50, 50, 500, 300)); // 保存PPT FileOutputStream out = new FileOutputStream("example.pptx"); ppt.write(out); out.close(); ppt.close(); } public static void main(String[] args) throws Exception { new JFreeChartToPpt().createPpt(); } }
关键改动说明
- 使用Batik库将JFreeChart渲染为SVG矢量图,替代原有的BufferedImage转PNG流程
- 利用Apache POI支持的
PictureType.SVG类型,直接将SVG数据插入PPT - SVG作为矢量格式,放大后不会出现锯齿或模糊,完美保留图表清晰度
内容的提问来源于stack exchange,提问作者valenzio
相关产品推荐
相关产品推荐

