这篇文章将为大家详细讲解有关spring-boot中怎么实现一个PDF打印功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.导入jar(一定要注意版本,踩过很多坑)
<!--pdf依赖-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
2.工具类
package com.sungrow.sgframe.api.isolarapi.machineconfigservice.util;
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 lombok.extern.log4j.Log4j2;
import org.sg.tools.config.SungwsConfig;
import org.sg.tools.util.UUIDUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author shihaifeng
* @date 2019-09-29 11:03
* @desc (PDF工具类)
**/
@Log4j2
public class PDFUtil {
private static Document document = null;// 建立一个Document对象
private static int maxWidth = 520;
private static Font headfont;// 设置字体大小
private static Font keyfont;// 设置字体大小
private static Font textfont;// 设置字体大小
static {
BaseFont bfChinese;
try {
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
headfont = new Font(bfChinese, 10, Font.BOLD);// 设置字体大小
keyfont = new Font(bfChinese, 8, Font.BOLD);// 设置字体大小
textfont = new Font(bfChinese, 8, Font.NORMAL);// 设置字体大小
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
}
/**
* 初始化文档
*/
private static void initDocument(File file) {
document = new Document();//每一次初始化一个document 不然会有问题 open()方法有问题
document.setPageSize(PageSize.A4);// 设置页面大小
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
PdfWriter.getInstance(document, fileOutputStream)
.setViewerPreferences(PdfWriter.PageModeUseThumbs);
document.open();
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
}
/**
* 创建table
*
* @param colNumber
* @return
*/
private static PdfPTable createTable(int colNumber) {
PdfPTable table = new PdfPTable(colNumber);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
return table;
}
/**
* 创建table
*
* @param widths
* @return
*/
private PdfPTable createTable(float[] widths) {
PdfPTable table = new PdfPTable(widths);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
return table;
}
/**
* 创建 空table
*
* @return
*/
private static PdfPCell createBlankTable() {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
Paragraph paragraph = new Paragraph("", getPdfChineseFont());
cell.setPhrase(paragraph);
return cell;
}
/**
* 创建列
*
* @param value
* @param font
* @param align
* @return
*/
private PdfPCell createCell(String value, Font font, int align) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont());
cell.setPhrase(paragraph);
return cell;
}
/**
* 创建列
*
* @param value
* @param font
* @return
*/
private static PdfPCell createHeadCell(String value, Font font) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBackgroundColor(new BaseColor(22022022));
cell.setFixedHeight(25.0f);
Font headFont = getPdfChineseFont();
headFont.setColor(new BaseColor(0xff0000));
headFont.setSize(14);
headFont.setStyle("bold");
Paragraph paragraph = new Paragraph(String.valueOf(value), headFont);
cell.setPhrase(paragraph);
return cell;
}
/**
* 创建列
*
* @param value
* @param font
* @param rowSpan 占多列
* @param colspan 占多行
* @return
*/
private static PdfPCell createCell(String value, Font font, int rowSpan, int colspan) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setRowspan(rowSpan);
cell.setColspan(colspan);
Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont());
cell.setPhrase(paragraph);
return cell;
}
/**
* 创建列
*
* @param value
* @param font
* @param align
* @param colspan
* @param boderFlag
* @return
*/
private static PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan);
Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont());
cell.setPhrase(paragraph);
cell.setPadding(3.0f);
if (!boderFlag) {
cell.setBorder(0);
cell.setPaddingTop(15.0f);
cell.setPaddingBottom(8.0f);
}
return cell;
}
/**
* 增加中文显示
*
* @return
*/
private static Font getPdfChineseFont() {
BaseFont bfChinese = null;
try {
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);
return fontChinese;
}
/**
* 创建pdf
*/
public static String createPDF(Map<String, Object> tittle, List<Object> listObj, Map<String, Object> pojectMap, String language) throws IOException, DocumentException {
File file = null;
try {
String tmpDir = SungwsConfig.INSTANCE.getConfig().get("tmp.dir");//临时文件夹
File tmpDirFile = new File(tmpDir);
if (!tmpDirFile.exists()) {
tmpDirFile.mkdir();
}
String fileName = UUIDUtil.getRandomStringByLength(6).toUpperCase();
String fileUrl = tmpDir + File.separator + fileName + ".pdf";
file = new File(fileUrl);
// file.createNewFile();
initDocument(file);
PdfPTable table = createTable(tittle, listObj, pojectMap, language);
document.add(table);
System.out.println("文件创建成功: " + fileUrl);
return fileUrl;
} finally {
if (document != null) {
document.close();
}
}
}
/**
* 组装table
*
* @param tittle
* @param listObj
* @param pojectMap
* @param language
* @return
*/
private static PdfPTable createTable(Map<String, Object> tittle, List<Object> listObj, Map<String, Object> pojectMap, String language) {
System.out.println("tittle" + tittle);
System.out.println("listObj" + listObj);
AtomicInteger index = new AtomicInteger(1);//记录下表数
AtomicInteger allColsSize = new AtomicInteger(0);//记录总列数
float width = 100;
float height = 40;
int tittleSize = tittle.size();
PdfPTable table = createTable(tittleSize);
//1 设置标题
tittle.forEach((key, value) -> {
PdfPCell cell = null; //表格的单元格
if ("zh".equals(language)) {
cell = createHeadCell(String.valueOf(value), textfont);
} else {
cell = createHeadCell(key, textfont);
}
table.addCell(cell);
allColsSize.getAndIncrement();
});
//2 设置 内容
listObj.forEach(obj -> {
if (obj instanceof List) {
List<Map> comptents = (List<Map>) obj;
comptents.forEach(comptent -> {
Object obj1 = comptent.get("parts");
AtomicInteger rowSpan1 = new AtomicInteger(0);
List<Map> parts = null;
if (obj1 instanceof List && ((List) obj1).size() > 0) {
//rowSpan1 需要嵌套多层
parts = (List<Map>) obj1;
parts.forEach(part -> {
Object obj2 = part.get("items");
if (obj2 instanceof List && ((List) obj2).size() > 0) {
rowSpan1.addAndGet(((List) obj2).size());
} else {
rowSpan1.addAndGet(1);
}
});
} else {
rowSpan1.addAndGet(1);
}
//添加编号
PdfPCell cellNo = createCell(String.valueOf(index.getAndIncrement()), textfont, rowSpan1.get(), 1);
table.addCell(cellNo);
//组件
String component_name = String.valueOf(comptent.get("component_name"));
PdfPCell cell1 = createCell(component_name, textfont, rowSpan1.get(), 1);
table.addCell(cell1);
if (parts != null) {
//部件
parts.forEach(part -> {
Object obj2 = part.get("items");
List<Map> items = null;
int rowSpan2 = 1;
if (obj2 instanceof List && ((List) obj2).size() > 0) {
items = (List<Map>) obj2;
rowSpan2 = items.size();
}
//部件Custmization
String part_name = String.valueOf(part.get("part_name"));
PdfPCell cell2 = createCell(part_name, textfont, rowSpan2, 1);
table.addCell(cell2);
if (items != null) {
//item
items.forEach(item -> {
//从标题的第三个key开始遍历titile,获取数据
Set<String> keys = tittle.keySet();
Iterator<String> iterator = keys.iterator();
iterator.next();//排除第一个NO
iterator.next();//排除第二个Components
iterator.next();//排除第三个Items
while (iterator.hasNext()) {
String key = iterator.next();
Object o = item.get(key);
if (o != null) {
PdfPCell cell3 = createCell(String.valueOf(o), textfont, 1, 1);
table.addCell(cell3);
} else {
table.addCell(createBlankTable());
}
}
});
} else {
//剩下的列没有数据填空
for (int i = 0; i < allColsSize.get() - 3; i++) {
table.addCell(createBlankTable());
}
}
});
} else {
//剩下的列没有数据填空
for (int i = 0; i < allColsSize.get() - 2; i++) {
table.addCell(createBlankTable());
}
}
});
}
});
//3 设置消费者信息
// table.addCell(createCell("", textfont, 1, allColsSize.get()));//中间空一行
//添加编号
PdfPCell cellNo = createCell(String.valueOf(index.getAndIncrement()), textfont, 10, 1);
table.addCell(cellNo);
Map<String, Object> projectTitle = (Map<String, Object>) pojectMap.get("projectTitle");//标题
Map<String, Object> projectValue = (Map<String, Object>) pojectMap.get("projectValue");//值
//项目概述
table.addCell(createCell(String.valueOf(pojectMap.get("component_name")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectTitle.get("components_name")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("components_name")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(pojectMap.get("customer_inputs")), textfont, 9, 1));
table.addCell(createCell(String.valueOf(projectTitle.get("components_location")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("components_location")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("plant_capacity")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("plant_capacity")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("site_conditions")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("site_conditions")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("altitude")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("altitude")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("dc_ac_ratio")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("dc_ac_ratio")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("inverter_dc_input_cable")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("inverter_dc_input_cable")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("mv_switchgear_output_cable")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("mv_switchgear_output_cable")), textfont, 1, allColsSize.get() - 3));
table.addCell(createCell(String.valueOf(projectTitle.get("grid_voltage")), textfont, 1, 1));
table.addCell(createCell(String.valueOf(projectValue.get("grid_voltage")), textfont, 1, allColsSize.get() - 3));
return table;
}
}
关于spring-boot中怎么实现一个PDF打印功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/3677987/blog/3113987