1.引入依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</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.controller层
@GetMapping(value = "/exportInventoryResultPDF")
@ApiOperation("碳盘查pdf导出")
public void getInventoryProjectResultPDF(@RequestParam("cycleId") String cycleId,
HttpServletRequest request,
HttpServletResponse res
){
cmpInventoryProjectCycleService.getInventoryProjectCycleResultPDF(cycleId,res);
}
3.service层
void getInventoryProjectCycleResultPDF(String cycleId, HttpServletResponse res);
4.serviceImpl层
@Override
public void getInventoryProjectCycleResultPDF(String cycleId, HttpServletResponse res) {
CmpInventoryProjectReportVo cmpInventoryProjectReportVo = this.getInventoryProjectCycleReport(cycleId);
try {
//新建document对象
Document document = new Document(PageSize.A4);
BufferedOutputStream outputStream = new BufferedOutputStream(res.getOutputStream());
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);
writer.setPageEvent(new MyHeaderFooter());// 页眉/页脚
//打开文件
document.open();
//生成pdf
this.generatePDF(document, cmpInventoryProjectReportVo);
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 生成PDF文件
public void generatePDF(Document document, CmpInventoryProjectReportVo cmpInventoryProjectReportVo) throws Exception {
CmpCarbonInventoryProject project = cmpInventoryProjectReportVo.getProject();
// Image image = Image.getInstance("https://sungrow-dev.oss-cn-beijing.aliyuncs.com/temp/d85fc9f16e415f1550a377dbec48093.jpg");
Image image = Image.getInstance("https://sungrow-dev.oss-cn-beijing.aliyuncs.com/temp/%E7%A2%B3%E6%8E%92%E6%9F%A5pdf%E6%8A%A5%E5%91%8A%E5%B0%81%E9%9D%A2");
image.setAlignment(Image.UNDERLYING);
image.setAbsolutePosition(0, 0);
image.scaleAbsolute(595, 842);
// image.setIndentationLeft(0);
// image.setBorderWidthLeft(0);
//依照比例缩放
image.scalePercent(48);
document.add(image);
Paragraph title = new Paragraph(project.getOrgName() + "温室气体排放报告", PdfUtils.titleFont);
//设置段落下空白
// title.setSpacingAfter(230f);
// title.setPaddingTop(250f);
// //设置段落上空白
title.setSpacingBefore(210f);
title.setAlignment(1);
CmpInventoryProjectCycle projectCycle = cmpInventoryProjectReportVo.getProjectCycle();
document.add(title);
// Image image = Image.getInstance("https://sungrow-dev.oss-cn-beijing.aliyuncs.com/temp/%E7%A2%B3%E6%8E%92%E6%9F%A5%E6%8A%A5%E5%91%8A%E5%B0%81%E9%9D%A2.png");
// image.setAlignment(Image.ALIGN_CENTER);
// //依照比例缩放
// image.scalePercent(40);
// document.add(image);
PdfUtils.getPDFDes(" 报告主体:" + project.getOrgName(),document,30f,10f);
PdfUtils.getPDFDes(" 报告周期:" + projectCycle.getInventoryCycle(),document,0f,10f);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
PdfUtils.getPDFDes(" 编制日期:" + simpleDateFormat.format(projectCycle.getCreateTime()),document,0f,0f);
document.newPage();
PdfUtils.setParagraphTitle("根据国家发展和改革委员会发布的《工业其他行业企业温室气体排放核算方法与报告指南(试行)》,本报告主体核算了2021年温" +
"室气体排放量,并填写了相关数据表格,现将有关情况报告如下:",document,PdfUtils.textfont,25);
PdfUtils.setParagraphTitle("一、企业基本信息",document,PdfUtils.headFont,0);
PdfUtils.setParagraphTitle(projectCycle.getReportDescription(),document,PdfUtils.textfont,25f);
// 工具类编辑表格
PdfUtils.setParagraphTitle("二、温室气体排放情况",document,PdfUtils.headFont,25f);
PdfPTable tableGas=PdfUtils.getTable(new float[]{150, 80, 80, 80, 80},new String[]{"单位:吨CO2当量","范围一","范围二","范围三","总计"});
List<GhgEmissionVo> ghgEmissionVoList = cmpInventoryProjectReportVo.getGhgEmissionVoList();
for (GhgEmissionVo ghgEmissionVo : ghgEmissionVoList) {
tableGas.addCell(PdfUtils.createSignCell(ghgEmissionVo.getEnergyActivity_dictText(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableGas.addCell(PdfUtils.createSignCell(String.valueOf(ghgEmissionVo.getDomain1().setScale(2,BigDecimal.ROUND_HALF_UP)), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableGas.addCell(PdfUtils.createSignCell(String.valueOf(ghgEmissionVo.getDomain2().setScale(2,BigDecimal.ROUND_HALF_UP)), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableGas.addCell(PdfUtils.createSignCell(String.valueOf(ghgEmissionVo.getDomain3().setScale(2,BigDecimal.ROUND_HALF_UP)), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableGas.addCell(PdfUtils.createSignCell(String.valueOf(ghgEmissionVo.getTotal().setScale(2,BigDecimal.ROUND_HALF_UP)), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
}
document.add(tableGas);
// 三、活动水平及来源说明
PdfUtils.setParagraphTitle("三、活动水平及来源说明",document,PdfUtils.headFont,25f);
PdfPTable tableAct=PdfUtils.getTable(new float[]{80, 80, 80, 80},new String[]{"活动类型","排放源","排放源规格","活动数据"});
List<CmpInventoryProjectCycleInfo> cycleInfoList = cmpInventoryProjectReportVo.getCycleInfoList();
for (CmpInventoryProjectCycleInfo cmpInventoryProjectCycleInfo : cycleInfoList) {
tableAct.addCell(PdfUtils.createSignCell(cmpInventoryProjectCycleInfo.getEnergyActivity_dictText(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableAct.addCell(PdfUtils.createSignCell(cmpInventoryProjectCycleInfo.getEmissionName_dictText(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableAct.addCell(PdfUtils.createSignCell(cmpInventoryProjectCycleInfo.getSpecCategory_dictText(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableAct.addCell(PdfUtils.createSignCell(cmpInventoryProjectCycleInfo.getEmissionData()+" "+cmpInventoryProjectCycleInfo.getUnit(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
}
document.add(tableAct);
// 三、活动水平及来源说明
PdfUtils.setParagraphTitle("四、排放因子数据及来源",document,PdfUtils.headFont,25f);
// 四、排放因子数据及来源
List<CmpFactorInfoVo> cmpFactorInfoVoList = cmpInventoryProjectReportVo.getCmpFactorInfoVoList();
for (CmpFactorInfoVo cmpFactorInfoVo : cmpFactorInfoVoList) {
PdfPTable tableFactor = PdfUtils.createTableFixHeight(new float[]{80, 80, 80, 80, 80, 80, 80},25f);
tableFactor.addCell(PdfUtils.createCell(cmpFactorInfoVo.getFactorName(), PdfUtils.factorTableTitleFont, Element.ALIGN_LEFT, 7, false));
String[] tableFactors= new String[]{"排放源","气体","地图/条件","值类型","值","单位","来源"};
for(String factor:tableFactors) {
tableFactor.addCell(PdfUtils.createSignCell(factor, PdfUtils.textfont, Element.ALIGN_CENTER,30f));
}
for (CmpFactorItem cmpFactorItem : cmpFactorInfoVo.getFactorItemList()) {
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getEmissionSource(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getGasCategory(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getAreaAndCondition(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getValueType(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getValue().stripTrailingZeros().toPlainString(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getUnit(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableFactor.addCell(PdfUtils.createSignCell(cmpFactorItem.getOrigin(), PdfUtils.textfont,Element.ALIGN_CENTER,30f));
}
tableFactor.setSpacingAfter(25f);
document.add(tableFactor);
}
// 其他未报告类型及排除原因
PdfUtils.setParagraphTitle("五、其他未报告类型及排除原因",document,PdfUtils.headFont,25f);
PdfUtils.setParagraphTitle("暂无",document,PdfUtils.textfont,25f);
// 其他未报告类型及排除原因
PdfUtils.setParagraphTitle("六、核算与报告依据",document,PdfUtils.headFont,25f);
Set<String> factorItemOriginSet = cmpInventoryProjectReportVo.getFactorItemOriginSet();
for (String string : factorItemOriginSet) {
document.add(new Paragraph(string,PdfUtils.textfont));
}
PdfPTable tableSign=PdfUtils.getTable(new float[]{80, 80, 80},new String[]{"角色","签名","日期"});
String[] stringTableSign = {"盘查组长","技术复核人", "批准人"};
for (int i = 0; i < stringTableSign.length; i++) {
tableSign.addCell(PdfUtils.createSignCell(stringTableSign[i], PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableSign.addCell(PdfUtils.createSignCell("", PdfUtils.textfont,Element.ALIGN_CENTER,30f));
tableSign.addCell(PdfUtils.createSignCell("", PdfUtils.textfont,Element.ALIGN_CENTER,30f));
}
tableSign.setSpacingBefore(25f);
document.add(tableSign);
}
PDFUtils
package org.jeecg.modules.cm.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cm.service.impl.CmpInventoryProjectCycleServiceImpl;
import org.jeecg.modules.cm.vo.CmpInventoryProjectReportVo;
/**
* @author chenkang
*/
public class PdfUtils {
// 定义全局的字体静态变量
public static Font titleFont;
public static Font headFont;
public static Font keyfont;
public static Font textfont;
public static Font factorTableTitleFont;
public static Font desfont;
// 最大宽度
public static int maxWidth = 520;
// 静态代码块
static {
try {
// 不同字体(这里定义为同一种字体:包含不同字号、不同style)
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
titleFont = new Font(bfChinese, 28, Font.BOLD);
headFont = new Font(bfChinese, 14, Font.BOLD);
keyfont = new Font(bfChinese, 6, Font.BOLD);
textfont = new Font(bfChinese, 10, Font.NORMAL);
desfont = new Font(bfChinese, 12, Font.NORMAL);
factorTableTitleFont = new Font(bfChinese, 12, Font.BOLD);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void setParagraphTitle(String paragraphTitle,Document document,Font font,float spacing) throws DocumentException {
//生成段落
Paragraph paragraph = new Paragraph(paragraphTitle, font);
//下留空格25f
paragraph.setSpacingAfter(spacing);
document.add(paragraph);
//设置文字居中 0靠左 1,居中 2,靠右
// paragraph.setAlignment(0);
}
/**------------------------创建表格单元格的方法start----------------------------*/
/**
* 创建单元格(指定字体)
*
* @param value
* @param font
* @return
*/
public static PdfPCell createCell(String value, Font font) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 创建单元格(指定字体、水平..)
*
* @param value
* @param font
* @param align
* @return
*/
public static PdfPCell createCell(String value, Font font, int align) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 创建单元格(指定字体、水平..)
*
* @param value
* @param font
* @param align
* @return
*/
public static PdfPCell createSignCell(String value, Font font, int align,float height) {
PdfPCell cell = new PdfPCell();
cell.setMinimumHeight(height);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 创建单元格(指定字体、水平居..、单元格跨x列合并)
*
* @param value
* @param font
* @param align
* @param colspan
* @return
*/
public static PdfPCell createCell(String value, Font font, int align, int colspan) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 创建单元格(指定字体、水平居..、单元格跨x列合并、设置单元格内边距)
*
* @param value
* @param font
* @param align
* @param colspan
* @param boderFlag
* @return
*/
public 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);
cell.setPhrase(new Phrase(value, font));
cell.setPadding(3.0f);
if (!boderFlag) {
cell.setBorder(0);
cell.setPaddingTop(15.0f);
cell.setPaddingBottom(8.0f);
} else if (boderFlag) {
cell.setBorder(0);
cell.setPaddingTop(0.0f);
cell.setPaddingBottom(15.0f);
}
return cell;
}
/**
* 创建单元格(指定字体、水平..、边框宽度:0表示无边框、内边距)
*
* @param value
* @param font
* @param align
* @param borderWidth
* @param paddingSize
* @param flag
* @return
*/
public static PdfPCell createCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value, font));
cell.setBorderWidthLeft(borderWidth[0]);
cell.setBorderWidthRight(borderWidth[1]);
cell.setBorderWidthTop(borderWidth[2]);
cell.setBorderWidthBottom(borderWidth[3]);
cell.setPaddingTop(paddingSize[0]);
cell.setPaddingBottom(paddingSize[1]);
if (flag) {
cell.setColspan(2);
}
return cell;
}
/**------------------------创建表格单元格的方法end----------------------------*/
/**--------------------------创建表格的方法start------------------- ---------*/
/**
* 创建默认列宽,指定列数、水平(居中、右、左)的表格
*
* @param colNumber
* @param align
* @return
*/
public static PdfPTable createTable(int colNumber, int align) {
PdfPTable table = new PdfPTable(colNumber);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(align);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* 创建指定列宽、列数的表格
*
* @param widths
* @return
*/
public static 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();
}
return table;
}
/**
* 创建指定列宽、列数的表格
*
* @param widths
* @return
*/
public static PdfPTable createTableFixHeight(float[] widths,float height) {
PdfPTable table = new PdfPTable(widths);
try {
table.setTotalWidth(maxWidth);
table.getDefaultCell().setMinimumHeight(height);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* 创建空白的表格
*
* @return
*/
public static PdfPTable createBlankTable() {
PdfPTable table = new PdfPTable(1);
table.getDefaultCell().setBorder(0);
table.addCell(createCell("", keyfont));
table.setSpacingAfter(20.0f);
table.setSpacingBefore(20.0f);
return table;
}
public static PdfPTable getTable(float[] floats, String[] gasList) throws DocumentException {
PdfPTable tableGas = PdfUtils.createTableFixHeight(floats,25f);
for(String gas:gasList) {
tableGas.addCell(PdfUtils.createSignCell(gas, PdfUtils.textfont, Element.ALIGN_CENTER,30f));
}
tableGas.setSpacingAfter(25);
return tableGas;
}
public static void getPDFDes(String des,Document document,float before,float after) throws DocumentException {
Paragraph paragraph = new Paragraph(des, PdfUtils.desfont);
paragraph.setAlignment(0);
paragraph.setSpacingBefore(before);
paragraph.setSpacingAfter(after);
document.add(paragraph);
}
/**--------------------------创建表格的方法end------------------- ---------*/
}
页眉页脚
package org.jeecg.modules.cm.utils;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.LineSeparator;
import lombok.SneakyThrows;
import java.io.IOException;
/**
* @author chenkang
*/
public class MyHeaderFooter extends PdfPageEventHelper {
/**
* 页眉
*/
public String header = "————————————————————————————————————————————————————————————————————————————————————————";
/**
* 文档字体大小,页脚页眉最好和文本大小一致
*/
public int presentFontSize = 12;
/**
* 文档页面大小,最好前面传入,否则默认为A4纸张
*/
public Rectangle pageSize = PageSize.A4;
/**
* logo 页眉
*/
public Image image;
// 模板
public PdfTemplate total;
// 基础字体对象
public BaseFont bf = null;
// 利用基础字体生成的字体对象,一般用于生成中文文字
public Font fontDetail = null;
// /**
// *
// * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
// *
// */
// public PDFBuilder() {
//
// }
//
// /**
// *
// * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
// *
// * @param yeMei
// * 页眉字符串
// * @param presentFontSize
// * 数据体字体大小
// * @param pageSize
// * 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
// */
//
// public PDFBuilder(String yeMei, int presentFontSize, Rectangle pageSize) {
// this.header = yeMei;
// this.presentFontSize = presentFontSize;
// this.pageSize = pageSize;
// }
//
// public void setHeader(String header) {
// this.header = header;
// }
//
// public void setPresentFontSize(int presentFontSize) {
// this.presentFontSize = presentFontSize;
// }
/**
*
* TODO 文档打开时创建模板
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
}
/**
*
* TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
@SneakyThrows
@Override
public void onEndPage(PdfWriter writer, Document document) {
this.addPage(writer, document);
//this.addWatermark(writer);
}
//加分页
public void addPage(PdfWriter writer, Document document) throws BadElementException, IOException {
//设置分页页眉页脚字体
try {
if (bf == null) {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
}
if (fontDetail == null) {
fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int pageS = writer.getPageNumber();
if (pageS != 1) {
// 页眉logo图片实例
image = Image.getInstance("\n" +
"https://sungrow-dev.oss-cn-beijing.aliyuncs.com/temp/%E7%A2%B3%E6%8E%92%E6%9F%A5pdf%E9%A1%B5%E7%9C%89");
image.scalePercent(40);
// !!!! 最重要的是这个, 如果页眉需要设置图片的话,需要在Phrase对象中添加一个Chunk对象,在Chunk对象中添加图片信息即可
Phrase p1 = new Phrase("", fontDetail);
p1.add(new Chunk(image, 0, -30));
// 1、写入左侧页眉logo
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_LEFT, p1,
document.left()-17, document.top(-35), 0);
// //1.写入页眉文字
// ColumnText.showTextAligned(writer.getDirectContent(),
// Element.ALIGN_LEFT, new Phrase(header, fontDetail),
// document.left()-10, document.top() + 40, 0);
// 1.写入页眉
// // 直线
Paragraph p2 = new Paragraph();
LineSeparator lineSeparator = new LineSeparator();
lineSeparator.setLineColor(new BaseColor(180,180,180));
lineSeparator.setLineWidth(0.3f);
p2.add(new Chunk(lineSeparator));
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_LEFT, p2,
document.left()-38, document.top() + 3, 0);
// 2.写入前半部分的 第 X页/共
String foot1 = "第 " + (pageS-1) + " 页 /共";
Phrase footer = new Phrase(foot1, fontDetail);
// 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
float len = bf.getWidthPoint(foot1, presentFontSize);
// 4.拿到当前的PdfContentByte
PdfContentByte cb = writer.getDirectContent();
// 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
// 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
// ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
ColumnText
.showTextAligned(
cb,
Element.ALIGN_CENTER,
footer,
(document.rightMargin() + document.right()
+ document.leftMargin() - document.left() - len) / 2.0F + 20F,
document.bottom() - 20, 0);
// 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F +
// len , y 轴和之前的保持一致,底边界-20 // 调节模版显示的位置
cb.addTemplate(total, (document.rightMargin() + document.right()
+ document.leftMargin() - document.left()) / 2.0F + 20F,
document.bottom() - 20);
}
}
//加水印
public void addWatermark(PdfWriter writer){
// 水印图片
Image image;
try {
image = Image.getInstance("./web/images/001.jpg");
PdfContentByte content = writer.getDirectContentUnder();
content.beginText();
// 开始写入水印
for(int k=0;k<5;k++){
for (int j = 0; j <4; j++) {
image.setAbsolutePosition(150*j,170*k);
content.addImage(image);
}
}
content.endText();
} catch (IOException | DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* TODO 关闭文档时,替换模板,完成整个页眉页脚组件
*
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
* com.itextpdf.text.Document)
*/
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
// 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
total.beginText();
total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
String foot2 = " " + (writer.getPageNumber()-1) + " 页"; //页脚内容拼接 如 第1页/共2页
total.showText(foot2);// 模版显示的内容
total.endText();
total.closePath();
}
}
最终生成pdf部分样式