You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:05:03