一、添加需要的maven依赖

<!--用于生成pdf-->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<!--用于jfreechart生成图片  -->
<dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.0</version>
</dependency>

二、工具类生成pdf

import com.alibaba.fastjson.JSONArray;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.manager.util.echarts.dto.VehicleIndex;
import com.manager.util.echarts.dto.VehicleIndex1;
import com.manager.util.echarts.dto.VehicleIndex2;
import com.manager.util.echarts.dto.VehicleIndex3;
import org.apache.commons.lang3.ObjectUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/*** @author yanjj* @ClassName CreateTable* @date 2022/7/12*/
public class CreateEchartsPdfUtils {public static void createTable(ByteArrayOutputStream outputStream, List<VehicleIndex> tableContentList, List<VehicleIndex> tableContentList2, Map<String,Map<String, BigDecimal>> linePort, List<VehicleIndex> tableContentList3, Map<String, BigDecimal> piePort,List<VehicleIndex> tableContentList4) throws DocumentException, IOException {// 创建一个文档(默认大小A4,边距36, 36, 36, 36)Document document = new Document();// 设置文档大小document.setPageSize(PageSize.A4);// 设置边距,单位都是像素,换算大约1厘米=28.33像素document.setMargins(50, 50, 50, 50);// 创建writer,通过writer将文档写入磁盘PdfWriter writer = PdfWriter.getInstance(document, outputStream);//标题String title = "XXXX投资基金周度报告";//设置标题时间String createHeadTime = "报告截止日期:2022-07-08";// 打开文档,只有打开后才能往里面加东西document.open();// 设置作者document.addAuthor("XX");// 设置创建者document.addCreator("XX");// 设置主题document.addSubject(title);// 设置标题document.addTitle(title);// 设置标题Paragraph paragraphHead1 = createHead1(title);document.add(paragraphHead1);// 设置标题时间Paragraph paragraphHeadTime = createHeadTime(createHeadTime);document.add(paragraphHeadTime);//产品净值表格buildProductNetValue(document,tableContentList);//收益率指标buildYield(document,tableContentList2);//净值走势折线图JFreeChartUtils.createLinePortImage(document,"净值走势", linePort, "日期", "净值");//风险指标buildRiskIndicator(document,tableContentList3);//创建饼状图JFreeChartUtils.createPiePortImage(document,"组合配置", piePort);//产品信息buildProductDetail(document,tableContentList4);// 关闭文档,才能输出document.close();writer.close();}/*** 根据传入的参数生成PDF文档使用的字体** @param fontSize  字体大小* @param fontMode  字体正常、加粗、下划线等* @param fontColor 字体颜色* @return 返回生成的字体*/private static Font createFont(int fontSize, int fontMode, BaseColor fontColor) throws DocumentException, IOException {BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);return new Font(bfChinese, fontSize, fontMode, fontColor);}/*** 设置一级标题** @param title 标题内容* @return 标题段落*/private static Paragraph createHead1(String title) throws DocumentException, IOException {Font font = createFont(22, Font.BOLD, BaseColor.BLACK);Paragraph paragraph = new Paragraph(title, font);paragraph.setAlignment(Element.ALIGN_CENTER);return paragraph;}/*** 设置标题下的时间字段** @param time 时间* @return 时间的段落*/private static Paragraph createHeadTime(String time) throws DocumentException, IOException {Font font = createFont(14, Font.BOLD, BaseColor.BLACK);Paragraph paragraph = new Paragraph(time, font);paragraph.setAlignment(Element.ALIGN_CENTER);return paragraph;}/*** 设置一级标题** @param title 标题内容* @return 标题段落*/public static Paragraph createHead2(String title) throws DocumentException, IOException {Font font = createFont(12, Font.BOLD, BaseColor.BLACK);Paragraph paragraph = new Paragraph(title, font);paragraph.setAlignment(Element.ALIGN_CENTER);return paragraph;}/*** 根据传入的标题名称:批量设置标题值** @param table        创建的表格对象* @param tableHeadStr 每个标题值按顺序来*/private static void createTableHead(PdfPTable table, String[] tableHeadStr) throws DocumentException, IOException {if (ObjectUtils.isEmpty(tableHeadStr)) {return;}//获取设置表格标题的字体Font font = createFont(10, Font.NORMAL, BaseColor.BLACK);for (String tableHead : tableHeadStr) {PdfPCell cell = new PdfPCell(new Phrase(tableHead, font));cell.setBackgroundColor(new BaseColor(221, 221, 221));cell.setMinimumHeight(20);cell.setUseAscender(true);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setVerticalAlignment(Element.ALIGN_MIDDLE);table.addCell(cell);}}/*** 创建表格内容** @param table            表格对象* @param tableContentList 表格内容对象*/private static void createTableContent(PdfPTable table, List<VehicleIndex> tableContentList) throws DocumentException, IOException {if (ObjectUtils.isEmpty(tableContentList)) {return;}//判断类型是VehicleIndex2还是VehicleIndexVehicleIndex index = tableContentList.get(0);if (index instanceof VehicleIndex2){List<VehicleIndex2> vehicleIndex2s = JSONArray.parseArray(JSONArray.toJSONString(tableContentList), VehicleIndex2.class);for (VehicleIndex2 vehicleIndex : vehicleIndex2s) {//获取设置表格内容的字体与内容table.addCell(createTableContent(vehicleIndex.getIndexName()));table.addCell(createTableContent(vehicleIndex.getIndexValue()));table.addCell(createTableContent(vehicleIndex.getChainValue()));}}else if (index instanceof VehicleIndex3){List<VehicleIndex3> vehicleIndex3s = JSONArray.parseArray(JSONArray.toJSONString(tableContentList), VehicleIndex3.class);for (VehicleIndex3 vehicleIndex : vehicleIndex3s) {//获取设置表格内容的字体与内容table.addCell(createTableContent(vehicleIndex.getIndexName()));table.addCell(createTableContent(vehicleIndex.getIndexValue()));}} else {List<VehicleIndex1> vehicleIndex1s = JSONArray.parseArray(JSONArray.toJSONString(tableContentList), VehicleIndex1.class);for (VehicleIndex1 vehicleIndex : vehicleIndex1s) {//获取设置表格内容的字体与内容table.addCell(createTableContent(vehicleIndex.getIndexValue()));table.addCell(createTableContent(vehicleIndex.getChainValue()));}}}/*** 设置表格内容** @param title 标题内容* @return 表格标题内容*/private static PdfPCell createTableContent(String title) throws DocumentException, IOException {Font font = createFont(10, Font.NORMAL, BaseColor.BLACK);PdfPCell cell = new PdfPCell(new Phrase(title, font));cell.setMinimumHeight(20);cell.setUseAscender(true);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setVerticalAlignment(Element.ALIGN_MIDDLE);return cell;}/*** 创建产品净值表格* @param document* @param tableContentList* @throws DocumentException* @throws IOException*/public static void buildProductNetValue(Document document,List<VehicleIndex> tableContentList) throws DocumentException, IOException {//二级标题String title = "产品净值";Paragraph paragraphHead = createHead2(title);//设置段落前后间距paragraphHead.setSpacingAfter(10);paragraphHead.setSpacingBefore(10);document.add(paragraphHead);//创建表格(2列的表格)PdfPTable table = new PdfPTable(2);table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setLockedWidth(true);// 创建头String[] tableHeadStr = {"单位净值", "累计净值"};createTableHead(table, tableHeadStr);// 添加表格内容createTableContent(table, tableContentList);document.add(table);}/*** 收益率指标表格* @param document* @param tableContentList* @throws DocumentException* @throws IOException*/public static void buildYield(Document document,List<VehicleIndex> tableContentList) throws DocumentException, IOException {//二级标题String title = "收益率指标";Paragraph paragraphHead = createHead2(title);//设置段落前后间距paragraphHead.setSpacingAfter(10);paragraphHead.setSpacingBefore(10);document.add(paragraphHead);//创建表格(3列的表格)PdfPTable table = new PdfPTable(3);table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setLockedWidth(true);// 创建头String[] tableHeadStr2 = {"", "本产品", "沪深300"};createTableHead(table, tableHeadStr2);createTableContent(table, tableContentList);document.add(table);}/*** 风险指标* @param document* @param tableContentList* @throws DocumentException* @throws IOException*/public static void buildRiskIndicator(Document document,List<VehicleIndex> tableContentList) throws DocumentException, IOException {//二级标题String title = "风险指标";Paragraph paragraphHead = createHead2(title);//设置段落前后间距paragraphHead.setSpacingAfter(10);paragraphHead.setSpacingBefore(10);document.add(paragraphHead);//创建表格(3列的表格)PdfPTable table = new PdfPTable(2);table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setLockedWidth(true);createTableContent(table, tableContentList);document.add(table);}/*** 产品信息* @param document* @param tableContentList* @throws DocumentException* @throws IOException*/public static void buildProductDetail(Document document,List<VehicleIndex> tableContentList) throws DocumentException, IOException {//二级标题String title = "产品信息";Paragraph paragraphHead5 = createHead2(title);//设置段落前后间距paragraphHead5.setSpacingAfter(10);paragraphHead5.setSpacingBefore(10);document.add(paragraphHead5);PdfPTable table = new PdfPTable(2);table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setLockedWidth(true);createTableContent(table, tableContentList);document.add(table);}
}

三、生成折线图饼图工具类

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.chart.renderer.xy.StandardXYBarPainter;
import org.jfree.chart.ui.RectangleInsets;
import org.jfree.chart.ui.TextAnchor;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Map;/*** @author yanjj* @ClassName JFreeChartUtils* @date 2022/7/12*/
public class JFreeChartUtils {private static final String NO_DATA_MSG = "暂无数据";private static final Font FONT = new Font("STSongStd-Light", Font.BOLD, 12);public static Color[] CHART_COLORS = {new Color(146, 29, 34),new Color(126, 126, 126),new Color(31, 129, 188),new Color(92, 92, 97),new Color(144, 237, 125),new Color(255, 188, 117),new Color(153, 158, 255),new Color(255, 117, 153),new Color(253, 236, 109),new Color(128, 133, 232),new Color(158, 90, 102),new Color(255, 204, 102)};static {setChartTheme();}/*** 中文主题样式 解决乱码*/public static void setChartTheme() {// 设置中文主题样式 解决乱码StandardChartTheme chartTheme = new StandardChartTheme("CN");// 设置标题字体chartTheme.setExtraLargeFont(FONT);// 设置图例的字体chartTheme.setRegularFont(FONT);// 设置轴向的字体chartTheme.setLargeFont(FONT);chartTheme.setSmallFont(FONT);chartTheme.setTitlePaint(new Color(51, 51, 51));chartTheme.setSubtitlePaint(new Color(85, 85, 85));// 设置标注chartTheme.setLegendBackgroundPaint(Color.WHITE);chartTheme.setLegendItemPaint(Color.BLACK);chartTheme.setChartBackgroundPaint(Color.WHITE);// 绘制颜色绘制颜色.轮廓供应商// paintSequence,outlinePaintSequence,strokeSequence,outlineStrokeSequence,shapeSequencePaint[] OUTLINE_PAINT_SEQUENCE = new Paint[]{Color.WHITE};// 绘制器颜色源DefaultDrawingSupplier drawingSupplier = new DefaultDrawingSupplier(CHART_COLORS, CHART_COLORS, OUTLINE_PAINT_SEQUENCE,DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE, DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE);chartTheme.setDrawingSupplier(drawingSupplier);// 绘制区域chartTheme.setPlotBackgroundPaint(Color.WHITE);// 绘制区域外边框chartTheme.setPlotOutlinePaint(Color.WHITE);// 链接标签颜色chartTheme.setLabelLinkPaint(new Color(8, 55, 114));chartTheme.setLabelLinkStyle(PieLabelLinkStyle.CUBIC_CURVE);chartTheme.setAxisOffset(new RectangleInsets(5, 12, 5, 12));// X坐标轴垂直网格颜色chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));// Y坐标轴水平网格颜色chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));chartTheme.setBaselinePaint(Color.WHITE);chartTheme.setCrosshairPaint(Color.BLUE);// 坐标轴标题文字颜色chartTheme.setAxisLabelPaint(new Color(51, 51, 51));// 刻度数字chartTheme.setTickLabelPaint(new Color(67, 67, 72));// 设置柱状图渲染chartTheme.setBarPainter(new StandardBarPainter());// XYBar 渲染chartTheme.setXYBarPainter(new StandardXYBarPainter());chartTheme.setItemLabelPaint(Color.black);chartTheme.setThermometerPaint(Color.white);ChartFactory.setChartTheme(chartTheme);}/*** 设置折线图样式* @param plot 折线图对象* @param isShowDataLabels 是否显示数据标题* @param isShapesVisible 是否显示数据点*/public static void setLineRender(CategoryPlot plot, boolean isShowDataLabels, boolean isShapesVisible) {plot.setNoDataMessage(NO_DATA_MSG);plot.setInsets(new RectangleInsets(10, 10, 0, 10), false);LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();renderer.setDefaultStroke(new BasicStroke(1.5F));if (isShowDataLabels) {renderer.setDefaultItemLabelsVisible(true);renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator(StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING,NumberFormat.getInstance()));renderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE1, TextAnchor.BOTTOM_CENTER));}// 数据点绘制形状renderer.setDefaultShapesVisible(isShapesVisible);setXAixs(plot);setYAixs(plot);}/*** 设置类别图表(CategoryPlot) X坐标轴线条颜色和样式* @param plot 类别图表对象*/public static void setXAixs(CategoryPlot plot) {Color lineColor = new Color(51, 51, 51);plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);// X坐标轴颜色plot.getDomainAxis().setAxisLinePaint(lineColor);// X坐标轴标记|竖线颜色plot.getDomainAxis().setTickMarkPaint(lineColor);plot.getDomainAxis().setTickLabelFont(new Font("STSongStd-Light",Font.BOLD,12));}/*** 设置类别图表(CategoryPlot) Y坐标轴线条颜色和样式 同时防止数据无法显示* @param plot 类别图表对象*/public static void setYAixs(CategoryPlot plot) {Color axisColor = new Color(51, 51, 51);Color tickColor = new Color(219, 218, 218);ValueAxis axis = plot.getRangeAxis();// Y坐标轴颜色axis.setAxisLinePaint(axisColor);// Y坐标轴标记|竖线颜色axis.setTickMarkPaint(tickColor);// false隐藏Y刻度axis.setAxisLineVisible(true);axis.setTickMarksVisible(true);// Y轴网格线条plot.setRangeGridlinePaint(new Color(229, 229, 229));plot.setRangeGridlineStroke(new BasicStroke(1));// 设置顶部Y坐标轴间距,防止数据无法显示plot.getRangeAxis().setUpperMargin(0.1);// 设置底部Y坐标轴间距plot.getRangeAxis().setLowerMargin(0.1);plot.getRangeAxis().setTickLabelFont(new Font("STSongStd-Light",Font.BOLD,12));}/*** 生成折线图并返回Image数组** @param title 标题* @param datas 数据* @param xName X轴* @param yName Y轴* @return 生成的折线图byte数组*/public static void createLinePortImage(Document document, String title, Map<String,Map<String, BigDecimal>> datas, String xName, String yName) throws DocumentException, IOException {//二级标题Paragraph paragraphHead = CreateEchartsPdfUtils.createHead2(title);//设置段落前后间距paragraphHead.setSpacingAfter(5);paragraphHead.setSpacingBefore(5);document.add(paragraphHead);try {//种类数据集DefaultCategoryDataset dataset = new DefaultCategoryDataset();//遍历mapfor (Map.Entry<String,Map<String, BigDecimal>> entry : datas.entrySet()) {String key = entry.getKey();Map<String, BigDecimal> value = entry.getValue();for (Map.Entry<String, BigDecimal> decimalEntry : value.entrySet()) {dataset.setValue(decimalEntry.getValue(),key,decimalEntry.getKey());}}//创建2D折线图,折线图分水平显示和垂直显示两种//legend:是否显示图例(对于简单的柱状图必须是false)//tooltips:是否生成工具//urls:是否生成URL链接JFreeChart chart = ChartFactory.createLineChart("", xName, yName, dataset,PlotOrientation.VERTICAL,true,true,true);//得到绘图区setLineRender((CategoryPlot) chart.getPlot(), true, true);ByteArrayOutputStream bas = new ByteArrayOutputStream();ChartUtils.writeChartAsJPEG(bas, 1.0f, chart, 800, 500, null);com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bas.toByteArray());image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER);image.scaleAbsolute(500, 300);document.add(image);} catch (Exception e) {e.printStackTrace();}}/*** 生成饼图,并返回byte数组** @param title 标题* @param datas 数据* @return 返回生成的byte数组*/public static void createPiePortImage(Document document,String title, Map<String, BigDecimal> datas) throws DocumentException, IOException {//二级标题Paragraph paragraphHead = CreateEchartsPdfUtils.createHead2(title);//设置段落前后间距paragraphHead.setSpacingAfter(5);paragraphHead.setSpacingBefore(5);document.add(paragraphHead);try {// 如果不使用Font,中文将显示不出来DefaultPieDataset pds = new DefaultPieDataset();//遍历mapfor (Map.Entry<String, BigDecimal> entry : datas.entrySet()) {pds.setValue(entry.getKey(),entry.getValue());}/*** 生成一个饼图的图表* 分别是:显示图表的标题、需要提供对应图表的DateSet对象、是否显示图例、是否生成贴士以及是否生成URL链接*/JFreeChart chart = ChartFactory.createPieChart("", pds, true, true, true);setPieRender(chart.getPlot());ByteArrayOutputStream bas = new ByteArrayOutputStream();ChartUtils.writeChartAsJPEG(bas, 1.0f, chart, 800, 500, null);com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bas.toByteArray());image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER);image.scaleAbsolute(500, 300);document.add(image);} catch (Exception e) {e.printStackTrace();}}/*** 设置饼状图渲染* @param plot 饼图对象*/public static void setPieRender(Plot plot) {plot.setNoDataMessage(NO_DATA_MSG);plot.setInsets(new RectangleInsets(10, 10, 5, 10));PiePlot piePlot = (PiePlot) plot;piePlot.setInsets(new RectangleInsets(0, 0, 0, 0));// 圆形piePlot.setCircular(true);piePlot.setLabelGap(0.01);piePlot.setInteriorGap(0.05D);// 图例形状piePlot.setLegendItemShape(new Rectangle(10, 10));piePlot.setIgnoreNullValues(true);// 去掉背景色piePlot.setLabelBackgroundPaint(null);// 去掉阴影piePlot.setLabelShadowPaint(null);// 去掉边框piePlot.setLabelOutlinePaint(null);piePlot.setShadowPaint(null);// 0:category 1:value:2 :percentage// 显示标签数据piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}:{2}"));}}

四、测试数据

import com.itextpdf.text.DocumentException;
import com.manager.util.echarts.dto.VehicleIndex;
import com.manager.util.echarts.dto.VehicleIndex1;
import com.manager.util.echarts.dto.VehicleIndex2;
import com.manager.util.echarts.dto.VehicleIndex3;
import org.apache.commons.io.FileUtils;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;/*** @author yanjj* @ClassName test* @date 2022/7/12*/
public class test {public static void main(String[] args) throws DocumentException, IOException {ArrayList<VehicleIndex> tableContentList = new ArrayList<>(10);VehicleIndex1 vehicleIndex = new VehicleIndex1();vehicleIndex.setIndexValue("1.2950");vehicleIndex.setChainValue("1.9350");tableContentList.add(vehicleIndex);ArrayList<VehicleIndex> tableContentList2 = new ArrayList<>(10);VehicleIndex2 vehicle = new VehicleIndex2();vehicle.setIndexName("周增长率");vehicle.setIndexValue("-1.82%");vehicle.setChainValue("-0.85%");tableContentList2.add(vehicle);VehicleIndex2 vehicle2 = new VehicleIndex2();vehicle2.setIndexName("月增长率");vehicle2.setIndexValue("-2.19%");vehicle2.setChainValue("-1.25%");tableContentList2.add(vehicle2);VehicleIndex2 vehicle3 = new VehicleIndex2();vehicle3.setIndexName("今年以来增长率");vehicle3.setIndexValue("-11.12%");vehicle3.setChainValue("-10.36%");tableContentList2.add(vehicle3);VehicleIndex2 vehicle4 = new VehicleIndex2();vehicle4.setIndexName("自成立以来增长率");vehicle4.setIndexValue("115.57%");vehicle4.setChainValue("115.57%");tableContentList2.add(vehicle4);ArrayList<VehicleIndex> tableContentList3 = new ArrayList<>(10);VehicleIndex3 index = new VehicleIndex3();index.setIndexName("夏普比率");index.setIndexValue("0.93");tableContentList3.add(index);VehicleIndex3 index2 = new VehicleIndex3();index2.setIndexName("索提诺比率");index2.setIndexValue("0.96");tableContentList3.add(index2);VehicleIndex3 index3 = new VehicleIndex3();index3.setIndexName("年化波动率");index3.setIndexValue("16.87%");tableContentList3.add(index3);VehicleIndex3 index4 = new VehicleIndex3();index4.setIndexName("近3年最大回撤");index4.setIndexValue("28.29%");tableContentList3.add(index4);VehicleIndex3 index5 = new VehicleIndex3();index5.setIndexName("年化收益率");index5.setIndexValue("13.91%");tableContentList3.add(index5);ArrayList<VehicleIndex> tableContentList4 = new ArrayList<>(10);VehicleIndex3 vehicleIndex1 = new VehicleIndex3();vehicleIndex1.setIndexName("管理人");vehicleIndex1.setIndexValue("观富(北京)资产管理有限公司");tableContentList4.add(vehicleIndex1);VehicleIndex3 vehicleIndex2 = new VehicleIndex3();vehicleIndex2.setIndexName("托管人");vehicleIndex2.setIndexValue("兴业证券");tableContentList4.add(vehicleIndex2);VehicleIndex3 vehicleIndex3 = new VehicleIndex3();vehicleIndex3.setIndexName("成立日期");vehicleIndex3.setIndexValue("2017-06-13");tableContentList4.add(vehicleIndex3);VehicleIndex3 vehicleIndex4 = new VehicleIndex3();vehicleIndex4.setIndexName("开放日");vehicleIndex4.setIndexValue("每月15日,连续2日开放");tableContentList4.add(vehicleIndex4);VehicleIndex3 vehicleIndex5 = new VehicleIndex3();vehicleIndex5.setIndexName("申购费");vehicleIndex5.setIndexValue("0%");tableContentList4.add(vehicleIndex5);VehicleIndex3 vehicleIndex6 = new VehicleIndex3();vehicleIndex6.setIndexName("赎回费");vehicleIndex6.setIndexValue("持有不足1年(360个自然日)1%");tableContentList4.add(vehicleIndex6);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();CreateEchartsPdfUtils.createTable(outputStream,tableContentList,tableContentList2,createLinePort(), tableContentList3,createPiePort(),tableContentList4);FileUtils.copyInputStreamToFile(new ByteArrayInputStream(outputStream.toByteArray()),new File("D:\\折线图/demo.pdf"));}/*** 折线图数据* @return*/private static Map<String,Map<String, BigDecimal>> createLinePort(){Map<String,Map<String, BigDecimal>> resultmap = new HashMap<>(16);Map<String, BigDecimal> map = new HashMap<>(16);map.put("2021-06-22",  new BigDecimal("3.1"));map.put("2021-06-25",  new BigDecimal("5.1"));map.put("2021-06-30",  new BigDecimal("7.1"));map.put("2021-07-22",  new BigDecimal("10.1"));map.put("2021-07-23",  new BigDecimal("4.2"));map.put("2021-07-24",  new BigDecimal("12.8"));map.put("2021-07-25",  new BigDecimal("18.91"));map.put("2021-07-26",  new BigDecimal("20.3"));map.put("2021-07-27",  new BigDecimal("30.1"));resultmap.put("本产品",map);Map<String, BigDecimal> map2 = new HashMap<>(16);map2.put("2021-06-22",  new BigDecimal("4.1"));map2.put("2021-06-25",  new BigDecimal("7.1"));map2.put("2021-06-30",  new BigDecimal("2.1"));map2.put("2021-07-22",  new BigDecimal("10.1"));map2.put("2021-07-23",  new BigDecimal("14.2"));map2.put("2021-07-24",  new BigDecimal("17.8"));map2.put("2021-07-25",  new BigDecimal("12.91"));map2.put("2021-07-26",  new BigDecimal("27.3"));map2.put("2021-07-27",  new BigDecimal("37.1"));resultmap.put("沪深线",map2);return resultmap;}/*** 饼图数据* @return*/private static Map<String, BigDecimal> createPiePort(){Map<String, BigDecimal> map = new HashMap<>(16);map.put("其他",  new BigDecimal("26.72"));map.put("固定收益",  new BigDecimal("0"));map.put("权益类",  new BigDecimal("73.28"));return map;}
}

五、使用到的dto

public class VehicleIndex {}
@Data
public class VehicleIndex1 extends VehicleIndex{private String indexValue;private String chainValue;
}
@Data
public class VehicleIndex2 extends VehicleIndex1{private String indexName;}
@Data
public class VehicleIndex3 extends VehicleIndex{private String indexName;private String indexValue;
}

六、成品

参考:

https://blog.csdn.net/weixin_43618209/article/details/119216777

https://blog.51cto.com/u_15363394/3841748

https://www.pudn.com/news/62a93d88a11cf7345f9dd670.html

java + jfreechart + itextpdf创建折线图饼图并导出为pdf相关推荐

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

    itextpdf 添加折线图.饼图.柱状图 时隔三年,又要对PDF一顿改版了,此次改版加入了饼图.折线图.柱状图等图形可视化. 文章目录 itextpdf 添加折线图.饼图.柱状图 依赖包 效果图 步 ...

  2. java使用poi绘制折线图和饼图(用数据绘制和使用excel生成的表格数据)

    完整代码在码云地址: https://gitee.com/Min-Duck/line_chart.git 多线折线图 单线折线图 饼图 工具类 import com.gideon.entity.Cha ...

  3. excel分析图表制作,如何轻松创建折线图、柱状图、饼图

    ​在Excel中通过数据间的关系选择合适的图表,轻松创建折线图.柱状图.饼图使其表达的主题和内容更加简单清晰. 下面我们通过Smartbi大数据分析工具介绍excel分析图表制作方法,如何制作常用的图 ...

  4. java_excel导出带折线图饼图之类

    根据数据生成对应图片 再将图片插入到excel之中 package com.sunwe.emview.util;/*** @author tqf* @Description* @Version 1.0 ...

  5. JFreeChart应用实例-折线图

    http://www.tuicool.com/articles/Nr2Yna JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line;import java.awt.C ...

  6. Java使用POI生成折线图导出到word文档(折线图)

    本篇文章主要介绍,如何使用Apache POI组件生成折线图导出到word文档中,具体步骤看下文. 一.实现效果 Java使用POI技术生成折线图导出到word文档中,最终生成的折线图如下所示: 二. ...

  7. lmbs PHP,PHP的GD2函数创建折线图源码示例

    PHP的GD2函数创建折线图源码示例 代码来自 codego.net/tags/4/1/ if(!is_numeric($data[$i])) die("error id:1"); ...

  8. d3.js折线图_学习使用D3.js创建折线图

    d3.js折线图 by Sohaib Nehal 通过Sohaib Nehal 学习使用D3.js创建折线图 (Learn to create a line chart using D3.js) 使用 ...

  9. JAVA 使用iTextPDF将网络图片(非JPG)转换为PDF

    JAVA 使用iTextPDF将网络图片(非JPG)转换为PDF 场景 代码 注意 场景 开发中遇到将网络图片转换为PDF的需求, 特此记录 代码 public class PDFRendererUt ...

最新文章

  1. 中式古建筑su模型大全
  2. 数组-移除元素(交换移除)
  3. Angular-搜索框及价格上下限
  4. 神经网络和反向传播算法——反向传播算法本质上是随机梯度下降,链式求导法则而来的...
  5. wiki多个文件一起导入_wiki.js 使用 postgres 支持中文全文检索
  6. Apache-DBCP数据库连接池解读
  7. 子之错父之过什么意思_胎教是什么意思?胎教有何意义?
  8. 深度学习-Tensorflow2.2-图像处理{10}-图像语义分割-23
  9. 22为什么有些人更愿意帮助别人
  10. ES6展开运算符(...)
  11. 计算机研究生进中国银行,听说中行笔试把研究生学姐都难哭了…
  12. 专用集装箱行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  13. linux学习笔记(11)df命令
  14. python多进程用不了_python 多进程,实际上都没有运行,sleep
  15. python爬虫开发 urlparse、parse_qs、urlencode、quote、unquote、urljoin 用法总结
  16. python查询12306余票_Python之12306余票查询
  17. 数据库实体之间的关联关系:一对一、一对多、多对多
  18. android 跑马灯出现重复跳动、不滚动问题
  19. 那些年,我们用过的地图下载器
  20. OSPF的DR和BDR

热门文章

  1. hive LZO压缩
  2. 乌龙钻白玉 白虎卧沙滩
  3. OCR文字识别软件FineReader系列产品双十一特惠!
  4. Android 开源组件和第三方库汇总
  5. 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
  6. 栈和队列的相同点和不同点
  7. SQL UNION运算符
  8. 【联机对战】一张图看懂联机对战服务
  9. win7安装网络打印机显示windows无法连接到打印机,出现错误0x00000bcb
  10. java 全角_java 全角半角字符转换的方法实例