1、公司要求生成pdf文件,内容中间需要一个表格,表格要根据数据列表的长度动态变长
直接上代码,需要的复制+百度
引入包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
代码
/**
* 生成最终版本的pdf
* @param newPath 已写入数据的pdf模板路径
* @param finalPath 最终版本的pdf生成路径
* @param listNum
* @param baselineData2
*/
public static byte[] generateFinalPdf(List<String[]> list, String[] titleArr,
float[] widths, List<String[]> listNum,Map<String, Object> params) throws Exception {
/** 实例化文档对象 */
Document document = new Document();
/** 创建 PdfWriter 对象 */
//创建临时文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//临时路径
String path = uuid+".pdf";
FileOutputStream outputStream = new FileOutputStream(path);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);// 文件的输出路径+文件的实际名称
document.open();
// document.newPage();//新创建一页来存放后面生成的表格
BaseFont bfCN = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
// 表格的字体
Font headFont = new Font(bfCN, 11f, Font.BOLD, BaseColor.BLACK);
Font textFont = new Font(bfCN, 9f, Font.NORMAL, BaseColor.BLACK);
//正文的字体
Font headTxtFont = new Font(bfCN, 16f, Font.BOLD, BaseColor.BLACK);//标题
Font TxtFont = new Font(bfCN, 11f, Font.NORMAL, BaseColor.BLACK);//正文
Font Fwhite = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Fwhite.setColor(BaseColor.WHITE);
/** 向文档中添加内容,创建段落对象 */
Paragraph titleParagraph = new Paragraph();
Chunk chunk = new Chunk("应收账款转让通知书",headTxtFont);
titleParagraph.setAlignment(Element.ALIGN_CENTER);
titleParagraph.add(chunk);
document.add(titleParagraph);
document.add(blankRow31);
// 建立一个titleArr长度列的表格
PdfPTable table = new PdfPTable(titleArr.length);
// 计算'合并列'的合并相关集合
List<Integer> indexs;
// 每个'合并列'的初始下标集合
List<Integer> spanStartIndex;
// 每个'合并列'的合并数量集合
List<Integer> spanNumList;
// 取出'合并列'的所有数据计算
List<String> ListIn = new ArrayList<>();
for (String[] aList : list) {
ListIn.add(aList[1]);
}
spanNumList = getSpanNumList(ListIn);
spanStartIndex = getStartIndexList(ListIn, spanNumList);
indexs = getIndexs(list, spanNumList, spanStartIndex);
addTitle(table, titleArr, headFont);
// 加表格内容
addContent(table, list, textFont, spanNumList, spanStartIndex, indexs, document);
PdfContentByte canvas = writer.getDirectContent();
table.setTotalWidth(1000f);
table.setWidths(widths);
/**
* rowStart 0 起始行 rowEnd -1 表示全部行 xPos 表格横坐标- 从左向右开始计算 yPos 表格纵坐标- 从下向上开始计算
* canvas 画布
*/
document.add(table);
//添加总计
PdfPTable tableNum = new PdfPTable(2);
addNum(tableNum, listNum, textFont);
tableNum.setTotalWidth(1000f);
tableNum.setWidths(new float[] {200,400});
document.add(tableNum);
document.add(blankRow31);
//添加表格之后内容
Paragraph bodyParagraph2 = new Paragraph();
Chunk chunk5 = new Chunk("你的文本",TxtFont);
bodyParagraph2.setIndentationLeft(50);
bodyParagraph2.setIndentationRight(50);
bodyParagraph2.setSpacingAfter(5);
bodyParagraph2.setFirstLineIndent(20);
bodyParagraph2.add(chunk5);
document.add(bodyParagraph2);
Paragraph conPerParagraph9 = new Paragraph();
Chunk Hchunk9 = new Chunk("conssignDate" ,TxtFont);
conPerParagraph9.setIndentationLeft(320);
conPerParagraph9.add(Hchunk9);
document.add(conPerParagraph9);
System.out.println("===============PDF导出成功=============");
document.close();
//临时文件转byte数组
byte[] file2Bytes = File2Byte.file2Bytes(path);
//删除临时文件
boolean deleteFile = File2Byte.deleteFile(path);
return file2Bytes;
}
//生成表格方法
private static void addContent(PdfPTable table, List<String[]> list, Font textFont, List<Integer> spanNumList,
List<Integer> spanStartIndex, List<Integer> indexs, Document document) throws DocumentException {
// 表格数据内容
for (int i = 0; i < list.size(); i++) {
String[] str = list.get(i);
// 第1列
Paragraph paragraph01 = new Paragraph(str[0], textFont);
paragraph01.setAlignment(1);
PdfPCell cell = new PdfPCell();
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
cell.setPaddingTop(-2f);// 把字垂直居中
cell.setPaddingBottom(8f);// 把字垂直居中
cell.addElement(paragraph01);
table.addCell(cell);
//以此类推进行下一列
}
}
/**
* 设置恰当位置的setRowSpan属性
*
* @param indexs 不加单元格的索引集合
* @param spanStartIndex 要加的单元格开始索引集合
* @param spanNumList 要加的单元格合并的值集合
* @param table table
* @param cell cell
* @param i 索引
*/
private static void setRowsSpan(List<Integer> indexs, List<Integer> spanStartIndex, List<Integer> spanNumList,
PdfPTable table, PdfPCell cell, int i) {
if (indexs != null) {
Boolean isAllNotEqual = true;
for (Integer index : indexs) {
if (i == index) {
isAllNotEqual = false;
}
}
// 没有不加的下标
if (isAllNotEqual) {
// 判断在哪里设置span值
if (spanStartIndex != null) {
Boolean isSpan = false;
int copyJ = 0;
for (int j = 0; j < spanStartIndex.size(); j++) {
if (i == spanStartIndex.get(j)) {
isSpan = true;
copyJ = j;
break;
}
}
if (isSpan) {
int spanNum = spanNumList.get(copyJ);
cell.setRowspan(spanNum);
}
}
table.addCell(cell);
}
} else {
table.addCell(cell);
}
}
private static void addTitle(PdfPTable table, String[] titleArr, Font headFont) {
for (String aTitleArr : titleArr) {
Paragraph p = new Paragraph(aTitleArr, headFont);
PdfPCell cell = new PdfPCell();
p.setAlignment(1);
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
cell.setPaddingTop(-2f);// 把字垂直居中
cell.setPaddingBottom(8f);// 把字垂直居中
cell.addElement(p);
table.addCell(cell);
}
}
private static void addNum(PdfPTable table,List<String[]> list, Font textFont) {
for (int i = 0; i < list.size(); i++) {
String[] str = list.get(i);
if(i == 1) {
// 第1列
Paragraph paragraph03 = new Paragraph(str[0], textFont);
paragraph03.setAlignment(1);
PdfPCell cell2 = new PdfPCell();
cell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
cell2.setPaddingTop(-2f);// 把字垂直居中
cell2.setPaddingBottom(5f);// 把字垂直居中
cell2.setFixedHeight(30);
cell2.addElement(paragraph03);
table.addCell(cell2);
// 第2列
Paragraph paragraph04 = new Paragraph(str[1], textFont);
paragraph04.setAlignment(1);
PdfPCell cell3 = new PdfPCell();
cell3.setPaddingTop(-2f);// 把字垂直居中
cell3.setPaddingBottom(5f);// 把字垂直居中
cell2.setFixedHeight(30);
cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
cell3.addElement(paragraph04);
table.addCell(cell3);
}else {
// 第1列
Paragraph paragraph01 = new Paragraph(str[0], textFont);
paragraph01.setAlignment(1);
PdfPCell cell = new PdfPCell();
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
cell.setPaddingTop(-2f);// 把字垂直居中
cell.setPaddingBottom(5f);// 把字垂直居中
cell.addElement(paragraph01);
table.addCell(cell);
// 第2列
Paragraph paragraph02 = new Paragraph(str[1], textFont);
paragraph02.setAlignment(1);
PdfPCell cell1 = new PdfPCell();
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell1.setPaddingTop(-2f);// 把字垂直居中
cell1.setPaddingBottom(5f);// 把字垂直居中
cell1.addElement(paragraph02);
table.addCell(cell1);
}
}
}
/**
* 获取某列要合并的单元格数量
*
* @param list
* @return
*/
private static List<Integer> getSpanNumList(List<String> list) {
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
if (list.size() > 0) {
for (int i = 0; i < list.size(); i = i + 1) {
map.put(list.get(i), i);
}
}
// 修改对应key值的value
Set<String> s = map.keySet();// 获取KEY集合
List<String> strings = new ArrayList<>(s);
int spanNum = 0;
for (String string : strings) {
int tmpSpanNum = map.get(string) - spanNum + 1;
map.put(string, tmpSpanNum);
spanNum += tmpSpanNum;
}
List<Integer> res = new ArrayList<>();
for (String string : strings) {
res.add(map.get(string));
}
return res;
}
/**
* 获取某列要合并的单元格初始下标
*
* @param list
* @param resSpanNumList
* @return
*/
private static List<Integer> getStartIndexList(List<String> list, List<Integer> resSpanNumList) {
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
if (list.size() > 0) {
for (int i = 0; i < list.size(); i = i + 1) {
map.put(list.get(i), i);
}
}
Set<String> keys = map.keySet();// 获取KEY集合
List<String> stringKeys = new ArrayList<>(keys);
List<Integer> res = new ArrayList<>();
if (stringKeys.size() == resSpanNumList.size()) {
for (int i = 0; i < stringKeys.size(); i++) {
res.add(map.get(stringKeys.get(i)) - resSpanNumList.get(i) + 1);
}
}
return res;
}
/**
* 不加某字段的索引集合
*
* @param list
* @param resSpanNumList
* @param resStartIndexList
* @return
*/
private static List<Integer> getIndexs(List<String[]> list, List<Integer> resSpanNumList,
List<Integer> resStartIndexList) {
List<Integer> indexs = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < resStartIndexList.size(); j++) {
if (i == resStartIndexList.get(j)) {
for (int k = i + 1; k < i + resSpanNumList.get(j); k++) {
indexs.add(k);
}
}
}
}
return indexs;
}
}
版权声明:本文为qq_38769513原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。