一、引入依赖
<!-- 引入ITEXT-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.9</version>
<type>pom</type>
</dependency>
二、官方文档
iText Javadoc Home,不同版本差距很大,这里引入的是7.1.9,选择该版本进去查看。
三、起步练习:创建一个Pdf文件,包含一个空白页
//桌面路径,
private static final String des="C:\\Users\\yl\\Desktop\\";
//创建一个空白PDF
@Test
public void addEmptyPDF() throws FileNotFoundException {
//创建一个空白pdf思路
//Document<-PdfDocument<-PdfWriter
//PdfWriter<-path
//PdfDocument<-addNewPage()
// 1、创建一个 PdfWriter ,参数为创建的路径
String dest = des+"sample.pdf";
PdfWriter writer = new PdfWriter(dest);
// 2、创建一个 PdfDocument,参数为PdfWriter
PdfDocument pdfDoc = new PdfDocument(writer);
// 3、用PdfDocument创建一个空白 page
pdfDoc.addNewPage();
// 4、创建一个 Document,参数为PdfDocument
Document document = new Document(pdfDoc);
// 5、关闭 document,PdfDocument
document.close();
pdfDoc.close();
}
四、起步练习:创建分页
//创建区域中断对象AreaBreak,分页功能
@Test
public void newAreaBreak() throws FileNotFoundException {
//创建区域中断对象AreaBreak,结果是两页的空白页
//Document<-PdfDocument<-PdfWriter
//PdfWriter<-path
//Document.add(new AreaBreak())
String dest = des+"addingAreaBreak.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// 创建一个 Area Break
AreaBreak aB = new AreaBreak();
// 添加到 PDF
document.add(aB);
document.close();
pdf.clost();
}
五、起步练习:创建一个段落
//创建一个段落
@Test
public void addingParagraph() throws FileNotFoundException {
// Creating a PdfWriter
String dest = des+"addingParagraph.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
String para1 = "段落1的内容";
String para2 = "段落2的内容";
// 创建段落 Paragraphs
Paragraph paragraph1 = new Paragraph(para1);
Paragraph paragraph2 = new Paragraph(para2);
// 把段落添加到 document
document.add(paragraph1);
document.add(paragraph2);
// 关闭
document.close();
pdf.close;
}
六、起步练习:创建一个表格
//创建一个 Table 对象
@Test
public void addingTable() throws FileNotFoundException {
String dest = des+"addingTable.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document doc = new Document(pdf);
// 创建表格 table
//三个参数代表这个表格有三列,每列的宽度是150
float [] pointColumnWidths = {150F, 150F, 150F};
Table table = new Table(pointColumnWidths);
// 逐个单元格添加内容到表格 table
table.addCell("表头1内容");
table.addCell("表头2内容");
table.addCell("表头3内容");
table.addCell("单元格1内容");
table.addCell("单元格2内容");
table.addCell("单元格3内容");
//把表格添加到document
doc.add(table);
// 关闭
doc.close();
pdf.close();
}
七、开始使用:设置页面大小和边距
//设置页面大小A4 页边距40
//Document
Document document = new Document(pdfDocument,PageSize.A4);
document.setBottomMargin(40);
document.setLeftMargin(40);
document.setRightMargin(40);
document.setTopMargin(50);
八、开始使用:中文输出和字体解决
宋体细体,ITEXT本身有,可以直接使用。使用它就能输出中文。
这里添加了华文琥珀和黑体两个字体,将字体拷贝的项目的资源目录下,不拷贝也行,定义的路径直接指向系统字体库。
//字体设置,解决中文输出问题 宋体细体,ITEXT集成的。
PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
// 创建字体 STHUPO.TTF 华文琥珀,simhei.ttf黑体
//定义字体存放路径
String fontsPath=this.getClass().getResource("/").getPath()+"static/fonts/";
PdfFont boldFont = PdfFontFactory.createFont(fontsPath+"STHUPO.TTF", PdfEncodings.IDENTITY_H,true);
PdfFont heitiFont = PdfFontFactory.createFont(fontsPath+"simhei.ttf", PdfEncodings.IDENTITY_H,true);
//添加首页标题,字体大小30
Text titleText=new Text("健康体检报告").setFont(boldFont).setFontSize(30);
Paragraph titelPara=new Paragraph(titleText);
//设置对齐方式,上边距30,下边距30,文本居中
document.add(titelPara.setMarginTop(30).setMarginBottom(30).setTextAlignment(TextAlignment.CENTER));
九、开始使用:添加图片
//添加图片
//获取图片路径
String imagePath=this.getClass().getResource("/").getPath()+"static/img/wanguan.jpg";
//创图片
ImageData logoImageData= ImageDataFactory.create(imagePath);
Image logoImg = new Image(logoImageData);
//添加图片,设置宽度、高度,在页面中的坐标(left,bottom)
logoImg.setWidth(400).setHeight(315).setFixedPosition(100,240);
document.add(logoImg);
十、特殊需求:体检表格中如果结果列是异常的,让该单元格显示红色
//五列,EResultDetail对象是体检结果对象,
float [] pointColumnWidths = {230F, 90F,70F,60F, 85F};
Table table = new Table(pointColumnWidths);
table.addCell("项目");
table.addCell("结果");
table.addCell("异常指标");
table.addCell("单位");
table.addCell("正常值范围");
List<EResultDetail> resultDetailList = eExamResults.getResultDetailList();
for (EResultDetail eResultDetail : resultDetailList) {
table.addCell(eResultDetail.getItemName()+"");
table.addCell(eResultDetail.getResult()+"");
//异常指标设置红色
//从对象中取值,如果空就写空串
String abnor=eResultDetail.getAbnormalResult()==null?"":eResultDetail.getAbnormalResult()+"";
//创建一个单元格
Cell cell = new Cell();
cell.add((IBlockElement) new Paragraph(abnor));
//如果单元格内容不为空,设置该单元格的字体颜色为红色
if(!abnor.equals("")){
cell.setFontColor(new DeviceRgb(255,0,0));
}
table.addCell(cell);
table.addCell(eResultDetail.getUnit()+"");
table.addCell(eResultDetail.getNormalValueRange()+"");
}
table.setFont(sysFont);
document.add(table);
十一、特殊需求:设置页面页脚,并且在页眉上显示体检客户的基本信息和第几页
实现需要分成两个步骤,
1、自定义一个ITEXT事件处理器,这个类需要实现IEvenHandler,在这个类里面写实现页眉页脚的逻辑;
2、在创建PdfDocument对象后调用该事件处理类即可。
处理器代码:
import com.hjt.point.model.mysql.EPatientInfo;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import java.io.IOException;
public class PdfHandler implements IEventHandler {
//定义一个变量对页面进行计数,第一页不加页眉页脚
private int pageNumber = 0;
private PdfDocument document;
private EPatientInfo ePatientInfo;
//定义这个构造器,为了能够在使用时给其传入要显示的信息数据
public PdfHandler(EPatientInfo ePatientInfo) throws IOException {
this.ePatientInfo = ePatientInfo;
}
//设置字体
PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
//自己创建一个处理器,实现IEventHandler事件方法
@Override
public void handleEvent(Event event) {
//如果传入的事件参数符合PdfDocumentEvent,执行相关逻辑
if (event instanceof PdfDocumentEvent) {
//强转一下参数
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
//获取到PdfDocument
if (document == null) {
document = docEvent.getDocument();
}
//获取到PdfPage
PdfPage page = docEvent.getPage();
//构建一个画布
PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), document);
if (docEvent.getType() == PdfDocumentEvent.START_PAGE) {
pageNumber++;
if (pageNumber > 1) {
// 设置页眉
//构建一个矩形,坐标为(0,页面高度-30),宽度:页面的宽度,高度:20
Rectangle startPageRec = new Rectangle(0, page.getPageSize().getHeight() - 30, page.getPageSize().getWidth(), 25);
//把构建的矩形在页面上画出来
Canvas headerCanvas = new Canvas(canvas, document, startPageRec);
//设置段落的内容
Paragraph headerParagraph = new Paragraph("姓名:"+ePatientInfo.getName()+" 性别:"
+ePatientInfo.getGender()+" 年龄:"+ePatientInfo.getAge()
+" 体检编号:"+ePatientInfo.getVisitSerialNumber()+ " 第"+pageNumber+"页")
.setTextAlignment(TextAlignment.CENTER).setFont(sysFont);
headerCanvas.add(headerParagraph);
// 在页眉下方添加横线
canvas.setLineWidth(1);
//横线的起点
canvas.moveTo(50, page.getPageSize().getHeight() - 32);
//横线的终点
canvas.lineTo(page.getPageSize().getWidth()-50, page.getPageSize().getHeight() - 32);
canvas.stroke();
}
// } else if (docEvent.getType() == PdfDocumentEvent.END_PAGE) {
if (pageNumber > 1) {
// 设置页脚
Rectangle endPageRec = new Rectangle(page.getPageSize().getWidth(), 30);
Canvas footerCanvas = new Canvas(canvas, document, endPageRec);
Paragraph footerParagraph = new Paragraph("页脚广告语")
.setTextAlignment(TextAlignment.CENTER).setFont(sysFont);
footerCanvas.add(footerParagraph);
// 在页脚上方添加横线
canvas.setLineWidth(1);
canvas.moveTo(50, 32);
canvas.lineTo(page.getPageSize().getWidth()-50, 32);
canvas.stroke();
}
}
}
}
}
调用代码:
//PdfWriter
String desc="C:/Users/yl/Desktop/"+epi.getName()+epi.getVisitSerialNumber()+".pdf";
PdfWriter pdfWriter = new PdfWriter(desc);
//PdfDocument
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
//调用设置页眉页脚的处理器
PdfHandler pdfHandler = new PdfHandler(epi);
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE,pdfHandler);
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,pdfHandler);