Java 使用i Text 生成 pdf
iText 是一个非常著名的能够快速产生 PDF 文件的 Java 类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。
pom.xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
Test
快速创建一个pdf
// 创建一个Document对象(pdf文档) A4纸张大小
Document document = new Document(PageSize.A4);
// 建立一个书写器(Writer)与document对象关联
PdfWriter.getInstance(document, new FileOutputStream("D:\\Test.pdf"));
// 打开文档
document.open();
// 向文档中输入一个内容
document.add(new Paragraph("Hello World"));
// 关闭文档
document.close();

image.png
pdf文档中添加内容
全局字体设置
/**
* 定义全局的字体静态变量
*/
private static Font titlefont;
private static Font headfont;
private static Font keyfont;
private static Font textfont;
/**
* 最大宽度
*/
private static int maxWidth = 520;
/* 静态代码块*/
static {
try {
// 不同字体(这里定义为同一种字体:包含不同字号、不同style)
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
titlefont = new Font(bfChinese, 16, Font.BOLD);
headfont = new Font(bfChinese, 14, Font.BOLD);
keyfont = new Font(bfChinese, 10, Font.BOLD);
textfont = new Font(bfChinese, 10, Font.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
}
段落
// 段落
Paragraph paragraph = new Paragraph("Hello I Text 5", titlefont);
//设置文字居中 0靠左 1,居中 2,靠右
paragraph.setAlignment(1);
//设置左缩进
paragraph.setIndentationLeft(12);
//设置右缩进
paragraph.setIndentationRight(12);
//设置首行缩进
paragraph.setFirstLineIndent(24);
//行间距
paragraph.setLeading(20f);
//设置段落上空白
paragraph.setSpacingBefore(5f);
//设置段落下空白
paragraph.setSpacingAfter(10f);
直线/点线
// 直线
Paragraph p1 = new Paragraph();
p1.add(new Chunk(new LineSeparator()));
// 点线
Paragraph p2 = new Paragraph();
p2.add(new Chunk(new DottedLineSeparator()));
超链接
// 超链接
Anchor anchor = new Anchor(new Paragraph("超链接", titlefont));
anchor.setReference("www.baidu.com");
图片
// 添加图片
Image image = Image.getInstance("http://devb2b.hosjoy.com/img/hosjoy_logo48@2x.595a425a.png");
// 位置
image.setAlignment(Image.ALIGN_CENTER);
// 依照比例 缩放
image.scalePercent(20);
表格PdfPTable
// 创建一个包含5列的表格
PdfPTable table = new PdfPTable(5);
// 创建一个宽度比例表格
PdfPTable table = new PdfPTable(new float[]{10, 12, 12, 10, 10});
// 表格最大像素
table.setTotalWidth(maxWidth);
// 锁定宽度
table.setLockedWidth(true);
// 水平居中
table.setHorizontalAlignment(Element.ALIGN_CENTER);
// 表格边框 配合 单元格设置
table.getDefaultCell().setBorder(1);
// 创建单元格
PdfPCell cell = new PdfPCell();
// 垂直对齐设置
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
// 水平对齐设置
cell.setHorizontalAlignment();
// 合并单元格
cell.setColspan(1);
// 合并单元格
cell.setRowspan(1);
// 内容
cell.setPhrase(new Phrase(value, font));
// 边框设置
cell.setBorder(Rectangle.NO_BORDER);
// 背景颜色设置
cell.setBackgroundColor(baseColor);
// 将单元格加入表格
table.addCell(cell)
// 表格添加图片
Image image = Image.getInstance("http://devb2b.hosjoy.com/img/hosjoy_logo48@2x.595a425a.png");
image.setAlignment(Image.ALIGN_LEFT);
Phrase listOfDots = new Phrase();
// 位置设置
listOfDots.add(new Chunk(image, 0, 0));
// 表格添加图片
table.addCell(listOfDots);
页眉页脚 和 水印
继承 PdfPageEventHelper
/**
* 打开文档时,创建一个总页数的模版
*/
@Overridepublic void onOpenDocument(PdfWriter writer, Document document) { PdfContentByte cb = writer.getDirectContent();
totalPage = cb.createTemplate(30, 12);
}
/**
* 一页加载完成触发,写入页眉和页脚
* 添加水印
*/
@Override
public void onEndPage(PdfWriter writer, Document document) {
// 水印
for(int i=0 ; i<4; i++) {
for(int j=0; j<7; j++) {
ColumnText.showTextAligned(writer.getDirectContentUnder(),
Element.ALIGN_CENTER,
new Phrase("好享家", watermarkFont),
(50.5f+i*150),
(40.0f+j*150),
writer.getPageNumber() % 2 == 1 ? 45 : -45);
}
}
// 页眉和页脚
PdfPTable table = new PdfPTable(3);
try {
// 总宽
table.setTotalWidth(PageSize.A4.getWidth()-80);
// 设置表格宽3列
table.setWidths(new int[]{24, 24, 3});
table.setLockedWidth(true);
table.getDefaultCell().setFixedHeight(0);
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
// 可以直接使用addCell(str),不过不能指定字体,中文无法显示
table.addCell(new Paragraph("hosjoy", Font));
// 水平对齐
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));
// 总页数
PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
// 去掉表格边框
cell.setBorder(Rectangle.BOTTOM);
table.