itextpdf 添加折线图、饼图、柱状图

itextpdf 添加折线图、饼图、柱状图

时隔三年,又要对PDF一顿改版了,此次改版加入了饼图、折线图、柱状图等图形可视化。

依赖包

  • itextpdf 5.5.6
  • jfreechart 1.5.3

效果图

  • 折线图
    在这里插入图片描述
  • 柱状图
    在这里插入图片描述
  • 饼图
    在这里插入图片描述

步骤

  1. 生成图表
  2. 插入到PDF

生成折线图

主要代码 (完整代码文末贴出来):

public static JFreeChart lineChart(String title, String categoryAxisLabel, String valueAxisLabel, DefaultCategoryDataset dataset){
    ChartFactory.setChartTheme(initChartTheme());

    JFreeChart chart = ChartFactory.createLineChart(
            title,
            categoryAxisLabel,
            valueAxisLabel,
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
    );

    CategoryPlot plot = chart.getCategoryPlot();
    LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
    // 折现点显示数值
    renderer.setDefaultItemLabelsVisible(true);
    renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    // 更改线条颜色
    for (int i = 0; i < dataset.getRowKeys().size(); i++) {
        renderer.setSeriesPaint(i, LINE_COLORS[i]);
    }
    return chart;
}

生成柱状图

public static JFreeChart barChart(String title, String categoryAxisLabel, String valueAxisLabel, DefaultCategoryDataset dataset){
    ChartFactory.setChartTheme(initChartTheme());

    JFreeChart chart = ChartFactory.createBarChart(
            title,
            categoryAxisLabel,
            valueAxisLabel,
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
    );

    CategoryPlot plot = chart.getCategoryPlot();
    BarRenderer renderer = (BarRenderer) plot.getRenderer();
    // 纯色显示
    renderer.setBarPainter(new StandardBarPainter());
    // 柱子上显示小数字
    renderer.setDefaultItemLabelsVisible(true);
    renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    // 设置柱子间隔
    renderer.setItemMargin(0.0);
    for (int i = 0; i < dataset.getRowKeys().size(); i++) {
        renderer.setSeriesPaint(i, BAR_COLORS[i]);
    }
    return chart;
}

生成饼图

public static JFreeChart pieChart(String title, DefaultPieDataset dataset){
    ChartFactory.setChartTheme(initChartTheme());

    JFreeChart chart = ChartFactory.createPieChart(
            title,
            dataset,
            true,
            true,
            false
    );
    PiePlot plot = (PiePlot) chart.getPlot();
    for (int i = 0; i < dataset.getKeys().size(); i++) {
        plot.setSectionPaint(dataset.getKey(i), PIE_COLORS[i]);
    }
    // 设置扇区的线条颜色
    plot.setDefaultSectionOutlinePaint(new Color(255, 255, 255));
    // 设置扇区的线条大小
    plot.setDefaultSectionOutlineStroke(new BasicStroke(3));
    // 设置标签颜色
    plot.setLabelLinkPaint(new Color(255,255,255, 0));
    // 设置标签背景色
    plot.setLabelBackgroundPaint(new Color(255, 255, 255,0));
    // 设置标签线条颜色
    plot.setLabelOutlinePaint(new Color(255, 255, 255, 0));
    // 设置标签阴影颜色
    plot.setLabelShadowPaint(new Color(255, 255, 255, 0));
    // 设置饼图阴影颜色
    plot.setShadowPaint(new Color(255, 255, 255, 0));
    // 添加标签数字百分比显示
    plot.setLabelGenerator(new StandardPieSectionLabelGenerator(("{0}{2}"), NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
    return chart;
}

添加到PDF中

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ChartUtils.writeChartAsJPEG(bos, ChartUtil.lineChart("月度应税销售收入对比图", "", "", dataset), 850, 440);

Image image=Image.getInstance(bos.toByteArray());
image.scalePercent(60);
doc.add(image);

生成图表工具类

static class ChartUtil{
    private static final Color[] BAR_COLORS = new Color[]{
            new Color(79,129,189),
            new Color(192, 80, 77),
            new Color(155, 187, 89),
    };

    private static final Color[] LINE_COLORS = new Color[]{
            new Color(237, 123, 46),
            new Color(90, 154, 213),
            new Color(164, 164, 164),
    };

    private static final Color[] PIE_COLORS = new Color[]{
            new Color(75, 172, 198),
            new Color(128, 100, 162),
            new Color(155, 187, 89),
            new Color(192, 80, 77),
            new Color(79, 129, 189),
            new Color(44, 77, 117),
            new Color(247, 150, 70),
            new Color(165, 165, 165),
    };


    private static StandardChartTheme initChartTheme(){
        StandardChartTheme currentTheme = new StandardChartTheme("JFree");
        // 横轴纵轴标题文字大小
        currentTheme.setLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 15));
        // 横轴纵轴数值文字大小
        currentTheme.setRegularFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 13));
        currentTheme.setExtraLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 20));
        // 背景颜色
        currentTheme.setPlotBackgroundPaint(new Color(255, 255, 204, 0));
        // 边框线条
        currentTheme.setPlotOutlinePaint(new Color(0, 0, 0, 0));
        // 网格线条
        currentTheme.setRangeGridlinePaint(new Color(78, 74, 74));
        return currentTheme;
    }

    /**
        * 线图
        *
        * @param title 标题
        * @param categoryAxisLabel 分类标签
        * @param valueAxisLabel 数值标签
        * @param dataset 数据集
        * @return org.jfree.chart.JFreeChart
        * @author Hou_fx
        * @date 2021.8.4 10:39
        */
    public static JFreeChart lineChart(String title, String categoryAxisLabel, String valueAxisLabel, DefaultCategoryDataset dataset){
        ChartFactory.setChartTheme(initChartTheme());

        JFreeChart chart = ChartFactory.createLineChart(
                title,
                categoryAxisLabel,
                valueAxisLabel,
                dataset,
                PlotOrientation.VERTICAL,
                true,
                true,
                false
        );

        CategoryPlot plot = chart.getCategoryPlot();
        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        // 折现点显示数值
        renderer.setDefaultItemLabelsVisible(true);
        renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        // 更改线条颜色
        for (int i = 0; i < dataset.getRowKeys().size(); i++) {
            renderer.setSeriesPaint(i, LINE_COLORS[i]);
        }
        return chart;
    }

    /**
        * 柱状图
        *
        * @param title
        * @param categoryAxisLabel
        * @param valueAxisLabel
        * @param dataset           数据集
        * @return org.jfree.chart.JFreeChart
        * @author Hou_fx
        * @date 2021.8.4 14:03
        */
    public static JFreeChart barChart(String title, String categoryAxisLabel, String valueAxisLabel, DefaultCategoryDataset dataset){
        ChartFactory.setChartTheme(initChartTheme());

        JFreeChart chart = ChartFactory.createBarChart(
                title,
                categoryAxisLabel,
                valueAxisLabel,
                dataset,
                PlotOrientation.VERTICAL,
                true,
                true,
                false
        );

        CategoryPlot plot = chart.getCategoryPlot();
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        // 纯色显示
        renderer.setBarPainter(new StandardBarPainter());
        // 柱子上显示小数字
        renderer.setDefaultItemLabelsVisible(true);
        renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        // 设置柱子间隔
        renderer.setItemMargin(0.0);
        // 设置柱子颜色
        for (int i = 0; i < dataset.getRowKeys().size(); i++) {
            renderer.setSeriesPaint(i, BAR_COLORS[i]);
        }
        return chart;
    }

    /**
        * 饼图
        *
        * @param title
        * @param dataset
        * @return org.jfree.chart.JFreeChart
        * @author Hou_fx
        * @date 2021.8.4 14:04
        */
    public static JFreeChart pieChart(String title, DefaultPieDataset dataset){
        ChartFactory.setChartTheme(initChartTheme());

        JFreeChart chart = ChartFactory.createPieChart(
                title,
                dataset,
                true,
                true,
                false
        );
        PiePlot plot = (PiePlot) chart.getPlot();
        // 设置扇区颜色
        for (int i = 0; i < dataset.getKeys().size(); i++) {
            plot.setSectionPaint(dataset.getKey(i), PIE_COLORS[i]);
        }
        // 设置扇区的线条颜色
        plot.setDefaultSectionOutlinePaint(new Color(255, 255, 255));
        // 设置扇区的线条大小
        plot.setDefaultSectionOutlineStroke(new BasicStroke(3));
        // 设置标签颜色
        plot.setLabelLinkPaint(new Color(255,255,255, 0));
        // 设置标签背景色
        plot.setLabelBackgroundPaint(new Color(255, 255, 255,0));
        // 设置标签线条颜色
        plot.setLabelOutlinePaint(new Color(255, 255, 255, 0));
        // 设置标签阴影颜色
        plot.setLabelShadowPaint(new Color(255, 255, 255, 0));
        // 设置饼图阴影颜色
        plot.setShadowPaint(new Color(255, 255, 255, 0));
        // 添加标签数字百分比显示
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(("{0}{2}"), NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
        return chart;
    }
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值