java后端生成图片插入word,pdf中

文章讲述了如何使用Java和JFreeChart库在Word文档和PDF中插入自定义的柱状图和饼状图,包括数据处理、图表创建和iTextPDF库用于将图表以图片形式添加到PDF中的过程。
摘要由CSDN通过智能技术生成

粗略记录

1.生成图片插入word中

List titles = generalDetail.getTitles();//横坐标
                        List datas = generalDetail.getDatas();//纵坐标

                        List<String> titleList = titles;
                        List<Integer> longData = datas;
                        // 创建柱状图图表
                        JFreeChart chart = createBarChartData(commentMap.get(columnId), titleList, longData);
                        // 保存图表为临时文件
                        File chartFile = new File("chart.png");

                        JFreeChart pieChart = createPieChartData(commentMap.get(columnId), titleList, longData);
                        // 保存图表为临时文件
                        File pieChartFile = new File("pieChart.png");
                        try {
                            ChartUtilities.saveChartAsPNG(chartFile, chart, 800, 600);

                            // 插入图表到Word文档
                            XWPFParagraph chartParagraph = document.createParagraph();
                            XWPFRun chartRun = chartParagraph.createRun();
                            chartRun.addPicture(new FileInputStream(chartFile), XWPFDocument.PICTURE_TYPE_PNG, "chart", Units.toEMU(400), Units.toEMU(300));

                            ChartUtilities.saveChartAsPNG(pieChartFile, pieChart, 800, 600);

                            // 插入饼状图到Word文档
                            XWPFParagraph pieChartParagraph = document.createParagraph();
                            XWPFRun pieChartRun = pieChartParagraph.createRun();
                            pieChartRun.addPicture(new FileInputStream(pieChartFile), XWPFDocument.PICTURE_TYPE_PNG, "pie_chart", Units.toEMU(400), Units.toEMU(300));

                            // 删除临时文件
                            chartFile.delete();
                            pieChartFile.delete();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

2.对应方法

private JFreeChart createBarChartData(String name, List<String> titles, List<Integer> datas) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < titles.size(); i++) {
            dataset.addValue(datas.get(i), "Data", titles.get(i));
        }

        JFreeChart chart = ChartFactory.createBarChart(
                name + "数据统计",
                "",
                "",
                dataset
        );
        // 设置标题字体
        chart.getTitle().setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 18));
        CategoryPlot plot = chart.getCategoryPlot();

        // 设置 X 轴标题字体
        CategoryAxis domainAxis = plot.getDomainAxis();
        Font domainFont = new Font("SimSun", Font.BOLD, 14); // 使用宋体(SimSun)字体,加粗,大小为14
        domainAxis.setTickLabelFont(domainFont);

        // 设置 Y 轴标题字体
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        Font rangeFont = new Font("SimSun", Font.BOLD, 14); // 使用宋体(SimSun)字体,加粗,大小为14
        rangeAxis.setTickLabelFont(rangeFont);
        return chart;
    }
 /**
     * 饼状图图表
     *
     * @param s
     * @param titleList
     * @param longData
     * @return
     */
    private JFreeChart createPieChartData(String s, List<String> titleList, List<Integer> longData) {
        // 创建饼状图
        DefaultPieDataset dataset = new DefaultPieDataset();
        for (int i = 0; i < titleList.size(); i++) {
            dataset.setValue(titleList.get(i), longData.get(i));
        }
        JFreeChart pieChart = ChartFactory.createPieChart(
                s + "数据统计",
                dataset,
                true,
                true,
                false
        );
        // 设置标题字体
        pieChart.getTitle().setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 18));
        // 设置标签字体
        PiePlot plot = (PiePlot) pieChart.getPlot();
        Font labelFont = new Font("SimSun", Font.PLAIN, 12); // 使用宋体(SimSun)字体,普通样式,大小为12
        plot.setLabelFont(labelFont);
        return pieChart;
    }

2.插入到pdf中

for (Object preProcessParam : analysisResult.getPreProcessParams()) {
                    PreProcessParams params = (PreProcessParams) preProcessParam;
                    List<Integer> columnIds = params.getColumnIds();
                    for (Integer columnId : columnIds) {
                        params.setColumnId(columnId);
                        ChartsData generalDetail = measurePreProcessService.getGeneralDetail(params);
                        List titles = generalDetail.getTitles();//横坐标
                        List datas = generalDetail.getDatas();//纵坐标

                        List<String> titleList = titles;
                        List<Integer> longData = datas;
                        // 创建柱状图图表
                        DefaultCategoryDataset dataset = createDataset(titleList, longData);
                        JFreeChart barChart = createBarChartPDF(commentMap.get(columnId) + "数据统计", "", "", dataset);
                        barChart.getTitle().setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 18));

                        ByteArrayOutputStream chartOutputStream = new ByteArrayOutputStream();
                        ChartUtilities.writeChartAsPNG(chartOutputStream, barChart, 800, 600);
                        com.itextpdf.layout.element.Image chartImage = new com.itextpdf.layout.element.Image(ImageDataFactory.create(chartOutputStream.toByteArray()));
                        document.add(chartImage);

                        // 创建饼状图数据集
                        DefaultPieDataset datasetPie = createPieDataset(titleList, longData);
                        JFreeChart pieChart = createPieChartPDF(commentMap.get(columnId) + "数据统计", datasetPie);
                        pieChart.getTitle().setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 18));
                        CategoryPlot plot = barChart.getCategoryPlot();

                        // 设置 X 轴标题字体
                        CategoryAxis domainAxis = plot.getDomainAxis();
                        Font domainFont = new Font("SimSun", Font.BOLD, 14); // 使用宋体(SimSun)字体,加粗,大小为14
                        domainAxis.setTickLabelFont(domainFont);

                        // 设置 Y 轴标题字体
                        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
                        Font rangeFont = new Font("SimSun", Font.BOLD, 14); // 使用宋体(SimSun)字体,加粗,大小为14
                        rangeAxis.setTickLabelFont(rangeFont);
                        // 设置标签字体
                        PiePlot plot1 = (PiePlot) pieChart.getPlot();
                        Font labelFont = new Font("SimSun", Font.PLAIN, 12); // 使用宋体(SimSun)字体,普通样式,大小为12
                        plot1.setLabelFont(labelFont);
                        ByteArrayOutputStream chartOutputStream1 = new ByteArrayOutputStream();
                        ChartUtilities.writeChartAsPNG(chartOutputStream1, pieChart, 800, 600);
                        com.itextpdf.layout.element.Image chartImage1 = new com.itextpdf.layout.element.Image(ImageDataFactory.create(chartOutputStream1.toByteArray()));
                        document.add(chartImage1);
                    }

2.1具体方法

private DefaultCategoryDataset createDataset(List<String> titleList, List<Integer> longData) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < titleList.size(); i++) {
            dataset.addValue(longData.get(i), "Series 1", titleList.get(i));
        }
        return dataset;
    }


 private JFreeChart createBarChartPDF(String barChartTitle, String categoryAxisLabel, String valueAxisLabel, DefaultCategoryDataset dataset) {
        return ChartFactory.createBarChart(
                barChartTitle,
                categoryAxisLabel,
                valueAxisLabel,
                dataset
        );
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值