给pfd文档填写数据,并生成一组表格,添加到最后一页
之前的pdf填写数据,签名的,又填新需求,要求在最后一页生成一个表格(数据是数据库的数据,查询出来之后生成一个表格并添加到pdf之后)。
模板添加数据,签名的的东西上一篇已说过,再此不再多说,有需要请看上一篇内容。此篇文章主要说如何生成表格。
上网搜了一圈,看到一个说是在pdf填好数据后,在新的pdf上,再获取,添加表格,生成最终的pdf。实验一番,此法可行。
我是业务需求,将已写好的数据的pdf转为byte[],你们看自己需要,可换为文件地址。可获取到,就行。
/**
* 生成最终版本的pdf
* @param a 已写入数据的pdf 的byte[],(可为路径)
* @param finalPath 最终版本的pdf生成路径
* @param paramRequest
* @throws Exception
*/
private static String generateFinalPdf2(byte[] a, String finalPath , ParamRequest paramRequest) throws Exception {
String base64SPdf = "";
FileOutputStream fos = new FileOutputStream(finalPath);
//fos.write(fos);
PdfReader reader = new PdfReader(a);// 读取pdf模板
Rectangle pageSize = reader.getPageSize(1);
Document document = new Document(pageSize);
PdfWriter writer = PdfWriter.getInstance(document, fos);
document.open();
PdfContentByte cbUnder = writer.getDirectContentUnder();
//pdf共4页,获取第一页,添加到document
PdfImportedPage pageTemplate = writer.getImportedPage(reader,1);
cbUnder.addTemplate(pageTemplate, 0, 0);
document.newPage();
//获取第二页,添加到document
PdfImportedPage pageTemplate1 = writer.getImportedPage(reader,2);
cbUnder.addTemplate(pageTemplate1, 0, 0);
document.newPage();
//获取第三页,添加到document
PdfImportedPage pageTemplate2 = writer.getImportedPage(reader,3);
cbUnder.addTemplate(pageTemplate2, 0, 0);
document.newPage();
//获取第四页,添加到document
PdfImportedPage pageTemplate3 = writer.getImportedPage(reader,4);
cbUnder.addTemplate(pageTemplate3, 0, 0);
//新创建一页来存放后面生成的表格
document.newPage();
Paragraph paragraph = generatePdfATATable(paramRequest);//此处为生成的表格及内容方法
document.add(paragraph);
document.close();
reader.close();
//以下是将最终的pdf转为 base64
File pdfFile = new File(finalPath);
InputStream is;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
is = new FileInputStream(pdfFile);
byte[] b = new byte[is.available()];
is.read(b);
base64SPdf=Base64.encodeBase64String(b);
is.close();
bout.close();
return base64SPdf;
}
/**
* 生成pdf表格
* @return
* @see
*/
private static Paragraph generatePdfATATable(ParamRequest paramRequest ) throws Exception {
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 10.5F, Font.NORMAL);// 五号
Paragraph ret = new Paragraph("附表1: 还款计划表(元)", fontChinese);
PdfPTable tableBox = new PdfPTable(3);
tableBox.setWidths(new float[] { 0.3f, 0.4f, 0.3f });// 每个单元格占多宽
tableBox.setWidthPercentage(80f);
// 获取ATA分类的结果集
List<ParamRequest > ataList = paramRequest .getRepaylist();
// 创建表格格式及内容
tableBox.addCell(getCell(new Phrase("还款计划表(元)", fontChinese), false, 3, 1));
tableBox.addCell(getCell(new Phrase("期数", fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase("划款时间", fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase("划款金额", fontChinese), false, 1, 1));
// 遍历查询出的结果
for (int i=0;i<ataList.size();i++) {
tableBox.addCell(getCell(new Phrase("第"+(i+1)+"期", fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(String.valueOf(ataList.get(i).getRepayDate()), fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(String.valueOf(ataList.get(i).getRepayNum()), fontChinese), false, 1, 1));
}
ret.add(tableBox);
return ret;
}
/*每个cell的格式,合并单元格情况*/
private static PdfPCell getCell(Phrase phrase, boolean yellowFlag, int colSpan, int rowSpan) {
PdfPCell cells = new PdfPCell(phrase);
cells.setUseAscender(true);
cells.setMinimumHeight(20f);
cells.setHorizontalAlignment(1);
cells.setVerticalAlignment(5);
cells.setColspan(colSpan);
cells.setRowspan(rowSpan);
cells.setNoWrap(false);
return cells;
}
最终效果图: