package com.leinovo.npi.datacenter.module.dashboard.helper;
import com.itextpdf.text.document;
import com.itextpdf.text.documentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.leinovo.npi.datacenter.report.core.model.ReportInstanceInfo;
import com.leinovo.npi.datacenter.report.core.model.ReportProfile;
import com.leinovo.npi.util.DateUtils;
import com.leinovo.platform.util.JwtUtil;
import org.apache.commons.collections.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
public class CustomerPdfHelper extends DownloadHelper {
public CustomerPdfHelper(ReportProfile reportProfile, ReportInstanceInfo recentlyReportInstanceInfo, HttpServletResponse response) {
super(reportProfile, recentlyReportInstanceInfo, response);
}
@Override
public void download() {
String dateString = DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
response.setHeader("content-disposition", "attachment;filename=" + fileName + "_" + dateString + ".pdf");
response.setContentType("application/octet-stream");
try (OutputStream out = response.getOutputStream()) {
// 1.新建document对象
document document = new document(PageSize.A4);// 建立一个document对象
// 2.文档写入输出流
PdfWriter.getInstance(document, out);
// 3.打开文档
document.open();
// 4.向文档中添加内容
appendDataTodocument(document);
// 5.关闭文档
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void appendDataTodocument(document document) {
adddocumentProperties(document);
for (int i = 0; i < elementKeys.size(); i++) {
String elementKey = elementKeys.get(i);
appendDataTodocumentByKey(document, elementKey);
}
}
private void adddocumentProperties(document document) {
document.addTitle(fileName);// 标题
String username = JwtUtil.getUsername();
document.addAuthor(username);// 作者
document.addSubject(fileName);// 主题
document.addKeywords(fileName);// 关键字
document.addCreator(username);// 创建者
}
private void addGraph(document document, String word) {
try {
document.add(new Paragraph(word));
} catch (documentException e) {
e.printStackTrace();
}
}
private void appendDataTodocumentByKey(document document, String excelKey) {
String elementTitle = getTitle(excelKey);
List elementHeader = getHeader(excelKey);
if (CollectionUtils.isEmpty(elementHeader)) {
return;
}
List> elementData = getData(excelKey);
documentHelper documentHelper = new documentHelper(elementTitle, elementHeader, elementData, document);
documentHelper.appendElementTodocument(excelKey,elementTitle);
}
}
2 pdf 中添加表格
package com.leinovo.npi.datacenter.module.dashboard.helper;
import com.itextpdf.text.baseColor;
import com.itextpdf.text.document;
import com.itextpdf.text.documentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.leinovo.npi.datacenter.report.core.component.ProductPictureElement;
import com.leinovo.npi.datacenter.report.core.component.SupplyProfileElement;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.CategoryDataset;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class documentHelper {
private String elementTitle;
private List elementHeader;
private List> elementData;
private document document;
private static int maxWidth = 520;
private static int titleSize = 6;
private static int fontSize = 5;
private static baseColor whiteColor = UiHelper.getWhiteColor();
private static baseColor blackColor = UiHelper.getBlackColor();
private static baseColor greyColor = UiHelper.getGreyColor();
private static baseColor blueColor = UiHelper.getBlueColor();
private static Font titlefont = FontFactory.getFont(FontFactory.TIMES_ROMAN, titleSize, Font.NORMAL, blackColor);
private static Font headfont = FontFactory.getFont(FontFactory.TIMES_ROMAN, fontSize, Font.BOLD, whiteColor);
private static Font bodyfont = FontFactory.getFont(FontFactory.TIMES_ROMAN, fontSize, Font.NORMAL, blackColor);
public documentHelper(String elementTitle, List elementHeader, List> elementData, document document) {
this.elementTitle = elementTitle;
this.elementHeader = elementHeader;
this.elementData = elementData;
this.document = document;
}
public void appendElementTodocument(String excelKey, String elementTitle) {
appendTableTodocument();
// 折线图+柱状图(同时出现;FG Demand Supply与 Material Demand Supply 动他选择)
if (excelKey.contains(SupplyProfileElement.getECode())) {
appendImageTodocument(excelKey, elementTitle);
// 图片列表 Product Picture(翻页功能)
} else if (excelKey.contains(ProductPictureElement.getECode())) {
appendImageTodocument(excelKey, elementTitle);
} else {
appendImageTodocument(excelKey, elementTitle);
}
}
private void appendImageTodocument(String excelKey, String elementTitle) {
String chartName = excelKey + ".jpg";
addGraph("");
CategoryDataset dataset = ChartHelper.getDataset();
JFreeChart chart = ChartHelper.getChart(dataset, elementTitle, "", "");
ChartHelper.generateChart(chartName, chart);
try {
Image image = Image.getInstance(chartName);
image.setAlignment(Image.ALIGN_CENTER);
image.scalePercent(40);
document.add(image);
} catch (IOException e) {
e.printStackTrace();
} catch (documentException e) {
e.printStackTrace();
}
File file = new File(chartName);
file.delete();
}
private void addGraph(String value) {
try {
document.add(new Paragraph(value));
} catch (documentException e) {
e.printStackTrace();
}
}
private void appendTableTodocument() {
PdfPTable table = createTable(elementHeader.size());
appendElementTitle(table);
appendElementHeader(table);
appendElementData(table);
addTable(table);
}
private void addTable(PdfPTable table) {
try {
document.add(table);
} catch (documentException e) {
e.printStackTrace();
}
}
private void appendElementTitle(PdfPTable table) {
table.addCell(createTitleCell(elementTitle, elementHeader.size()));
}
private void appendElementHeader(PdfPTable table) {
for (String fieldName : elementHeader) {
table.addCell(createHeadCell(fieldName));
}
}
private void appendElementData(PdfPTable table) {
for (List row : elementData) {
for (String cellData : row) {
table.addCell(createBodyCell(cellData));
}
}
}
public PdfPTable createTable(int headerSize) {
float[] fieldNums = new float[headerSize];
for (int i = 0; i < headerSize; i++) {
fieldNums[i] = 30f;
}
PdfPTable table = new PdfPTable(fieldNums);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
UiHelper.setDefaultCell(table.getDefaultCell());
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
public PdfPCell createTitleCell(String value, int colspan) {
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Phrase(value, titlefont));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setColspan(colspan);
cell.setBorder(0);
cell.setPadding(3.0f);
cell.setPaddingTop(15.0f);
cell.setPaddingBottom(8.0f);
return cell;
}
public PdfPCell createBodyCell(String value) {
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Phrase(value, bodyfont));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBorderColor(greyColor);
return cell;
}
public PdfPCell createHeadCell(String value) {
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Phrase(value, headfont));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBackgroundColor(blueColor);
cell.setBorderColor(greyColor);
return cell;
}
}
3. pdf 放入chart
其实,是通过 jfree生成一张图片,再将图片放入pdf
package com.leinovo.npi.datacenter.module.dashboard.helper;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import java.awt.*;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class ChartHelper {
public static void generateChart(String chartName,JFreeChart chart ) {
characterFix(chart);
saveCharToFile(chart, chartName);
}
public static void saveCharToFile(JFreeChart chart, String fileName) {
OutputStream out = null;
int width = 1023;
int height = 511;
try {
out = new BufferedOutputStream(new FileOutputStream(fileName));
if (fileName.endsWith("png")) {
ChartUtilities.writeChartAsPNG(out, chart, width, height);
} else {
ChartUtilities.writeChartAsJPEG(out, 1.0f, chart, width, height, null);
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static CategoryDataset getDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1310, "plan", "PEL Exit");
dataset.addValue(720.68, "plan", "POR Exit");
dataset.addValue(675.3, "plan", "TR");
dataset.addValue(560, "plan", "EVT Start");
dataset.addValue(680.88, "plan", "DVT1 Start");
dataset.addValue(780, "plan", "DVT2 Start");
dataset.addValue(13100, "actual", "PEL Exit");
dataset.addValue(720.680, "actual", "POR Exit");
dataset.addValue(6750.3, "actual", "TR");
dataset.addValue(5600, "actual", "EVT Start");
dataset.addValue(680.88, "actual", "DVT1 Start");
dataset.addValue(7800, "actual", "DVT2 Start");
return dataset;
}
public static JFreeChart getChart(CategoryDataset dataset, String title, String yAxisName, String xAxisName) {
JFreeChart chart = ChartFactory.createLineChart(
// JFreeChart chart = ChartFactory.createBarChart3D(
title,// 图形名称
xAxisName,// 分类名称,为横坐标名称
yAxisName,// 值名称,为纵坐标名称
dataset,// 数据集合
PlotOrientation.VERTICAL,// 垂直显示
true,// 是否显示图例
false,// 是否使用工具提示
false);// 是否使用url
return chart;
}
public static void characterFix(JFreeChart chart) {
// 配置字体
Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
Font titleFont = new Font("宋体", Font.BOLD, 15); // 图片标题
// 图形的绘制结构对象,对于饼图不适用
CategoryPlot plot = chart.getCategoryPlot();
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
// 底部
LegendTitle legendTitle = chart.getLegend();
if (legendTitle != null) {
legendTitle.setItemFont(kfont);
}
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
rangeAxis.setTickLabelFont(yfont);
}
}
4. 字体等样式
package com.leinovo.npi.datacenter.module.dashboard.helper;
import com.itextpdf.text.baseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
public final class UiHelper {
public static void setDefaultCell(PdfPCell cell) {
// 大小
cell.setFixedHeight(14);
// 边框
cell.setBorder(1);
cell.setBorderWidth(1);
cell.setBorderColor(getBorderColor());
// 字体,字体的样式、COLOR
cell.addElement(getPhrase("second content"));
// 背景
cell.setBackgroundColor(getBlueColor());
}
public static Phrase getPhrase(String content) {
Phrase phrase = new Phrase();
phrase.setFont(getDefaultFont());
phrase.setLeading(12);// 行距
phrase.add(content);
return phrase;
}
public static Font getFont(int size, baseColor color) {
return FontFactory.getFont(FontFactory.TIMES_ROMAN, size, Font.NORMAL, color);
}
public static Font getDefaultFont() {
return getFont(8, getBlackColor());
}
public static baseColor getBorderColor() {
return new baseColor(231, 237, 243);
}
public static baseColor getWhiteColor() {
return new baseColor(255, 255, 255);
}
public static baseColor getBlueColor() {
return new baseColor(88, 135, 227);
}
public static baseColor getBlackColor() {
return new baseColor(34, 34, 34);
}
public static baseColor getGreyColor() {
return new baseColor(217, 226, 243);
}
}



