一、 jar包依赖
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
项目要使用iText,必须引入jar包。才能使用,maven依赖如下:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
输出中文,还要引入下面itext-asian.jar包:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
设置pdf文件密码,还要引入下面bcprov-jdk15on.jar包:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
二、简单创建PDF的demo
public static void main(String[] args) {
Document document = null;
PdfWriter writer = null;
try {
OutputStream os = new FileOutputStream(new File("E://test.pdf"));
// 1.新建document对象
document = new Document(PageSize.A4);
// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
writer = PdfWriter.getInstance(document, os);
// 3.打开文档
document.open();
// 4.添加内容
Paragraph graph = new Paragraph("Hello Itext pdf!");
document.add(graph);
writer.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
// 5.关闭文档
if(document != null) document.close();
//关闭书写器
if(writer != null) writer.close();
}catch (Exception e){
}
}
}
三、常用组件
1、段落
Paragraph graph = new Paragraph()
2、表格
Font font = new Font();
font.setSize(10f);
PdfPTable pdfPTable = new PdfPTable(4);//列数
java.util.List<PdfPRow> listRow = pdfPTable.getRows();
PdfPCell cells[]= new PdfPCell[4];
PdfPRow row = new PdfPRow(cells);
String[] titles = {"text1", "", "text2", ""};
for(int j = 0; j < titles.length; j++){
cells[j] = new PdfPCell(new Paragraph(titles[j], font));//单元格内容
cells[j].setHorizontalAlignment(Element.ALIGN_LEFT);//水平居中
cells[j].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
cells[j].setBorder(PdfPCell.NO_BORDER);//无边框
cells[j].setColspan(2);//合并单元格
cells[j].setMinimumHeight(30f);//单元格最小高度
}
listRow.add(row);
document.add(pdfPTable);
3、有序队列
com.itextpdf.text.List orderedList = new com.itextpdf.text.List(com.itextpdf.text.List.ORDERED);
orderedList.add(new ListItem(leading, text, font)); // leading:行距, text:文本, font:字体
四、加载自定义字体
public static Font createFont(float fontSize) throws Exception{
// 加载自定义字体
ClassPathResource cpr = new ClassPathResource("arial.ttf");
BaseFont bf = BaseFont.createFont(cpr.getPath(),BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bf, fontSize);
return font;
}
注:windows系统下的字体路径:
C:\Windows\Fonts
控制面板\外观和个性化\字体
五、中文支持
输出中文,引入下面itext-asian.jar包:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
代码如下:
//BaseFont-确认支持中文
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//设置字体
Font fontChinese = new Font(bfChinese, 20, Font.NORMAL);
String content = "凭证表单";
Paragraph pagragraph = new Paragraph(content, fontChinese);
六、添加水印
目前,找到的方法有两种。1、读取已存在的PDF文件,添加水印;2、在生成PDF的同时,添加水印。
1)、读取已存在的PDF文件,添加水印
PdfReader reader = new PdfReader("E://CMX60201904180007.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("E://111.pdf"));
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.1f);
PdfContentByte under = stamper.getUnderContent(1);
under.beginText();
under.setGState(gs1);
under.setFontAndSize(bfChinese, 30);
under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
// 水印文字成45度角倾斜
under.showTextAligned(Element.ALIGN_LEFT, "水印.......summer........", 230, 660, 45);
// 添加水印文字
under.endText();
//添加图片水印
Image image = Image.getInstance(IOUtils.toByteArray(new FileInputStream("E:\\u=3283476423,4126530767&fm=26&gp=0.jpg")));
image.setAbsolutePosition(100, 300);
under.addImage(image);
stamper.close();
2、在生成PDF的同时,添加水印
说明:透明度的设置必须在文本设置之前,否则不起作用。(切记)
自测的代码如下:
//BaseFont-确认支持中文
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//添加水印
PdfContentByte under = writer.getDirectContentUnder();
//打开设置水印的文本
under.beginText();
//设置透明度
PdfGState gState = new PdfGState();
gState.setFillOpacity(0.1f);
//gState.setStrokeOpacity(0.9f);
//水印颜色
under.setColorFill(BaseColor.RED);
under.setGState(gState);
under.setFontAndSize(bfChinese, 18);
// 水印文字成45度角倾斜
under.showTextAligned(Element.ALIGN_LEFT, "水印.......summer........", 230, 660, 45);
//关闭设置水印的文本
under.endText();
writer.flush();