一、前言
在我们日常开发中生成pdf是一个很常见的功能,IText是一种生成PDF报表的Java组件。通过使用IText可以很简单的实现生成PDF,设置PDF等操作。
二、基本使用
1.添加依赖
<!--iText-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<!--pdf输出中文-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--设置PDF密码-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.47</version>
</dependency>
2.常用类介绍
- com.itextpdf.text.Document:这是iText库中最常用的类,它代表了一个 pdf 实例。如果你需要从零开始生成一个pdf文件,你需要使用这个Document类。首先创建该实例,然后打开它,并添加内容,最后关闭该实例,即可生成一个pdf文件。
- com.itextpdf.text.Paragraph:表示一个缩进的文本段落,在段落中,你可以设置对齐方式,缩进,段落前后间隔等
- com.itextpdf.text.Chapter:表示 pdf 的一个章节,他通过一个Paragraph类型的标题和整形章数创建
- com.itextpdf.text.Font:这个类包含了所有规范好的字体,包括family of font,大小,样式和颜色,所有这些字体都被声明为静态常量
- com.itextpdf.text.List:表示一个列表;
- com.itextpdf.text.Anchor:表示一个锚,类似于HTML页面的链接。
- com.itextpdf.text.pdf.PdfWriter:当这个PdfWriter被添加到PdfDocument后,所有添加到Document的内容将会写入到与文件或网络关联的输出流中。
- com.itextpdf.text.pdf.PdfReader:用于读取 pdf 文件;
3.生成带有文本的pdf
package com.example.aopdemo;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@SpringBootTest
class AopDemoApplicationTests {
@Test
public void test1() throws IOException, DocumentException {
// 实例化Document
Document document = new Document();
// pdf文件保存地址
String filePath = "D:" + File.separator + "createPDF.pdf";
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
// 通过书写器将文档写入磁盘
PdfWriter.getInstance(document, new FileOutputStream(filePath));
// 打开 document
document.open();
// 微软雅黑
BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 中文字体 设置字体大小
Font font = new Font(chinese, 12, Font.NORMAL);
// 添加文本
document.add(new Paragraph("hello world", font));
// 关闭document
document.close();
}
}
执行测试生成PDF文件。
打开PDF,显示我们添加的文本内容。
4.生成带有密码的PDF
package com.example.aopdemo;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@SpringBootTest
class AopDemoApplicationTests {
@Test
public void test1() throws IOException, DocumentException {
// 实例化Document
Document document = new Document();
// pdf文件保存地址
String filePath = "D:" + File.separator + "createPasswordPDF.pdf";
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
// 通过书写器将文档写入磁盘
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
// userPassword:打开密码 ownerPassword:编辑密码
writer.setEncryption("123".getBytes(), "123456".getBytes(), PdfWriter.ALLOW_SCREENREADERS, PdfWriter.STANDARD_ENCRYPTION_128);
// 打开 document
document.open();
// 微软雅黑
BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 中文字体 设置字体大小
Font font = new Font(chinese, 12, Font.NORMAL);
// 添加文本
document.add(new Paragraph("hello world", font));
// 关闭document
document.close();
}
}
执行测试方法生成带有密码的PDF文件。
打开文件,需要密码。
我们输入代码中设置的密码,打开文件。
我们编辑pdf文件也受到保护,我们同样输入密码才能进行编辑操作。
5.为PDF文件添加水印,背景图
package com.example.aopdemo;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@SpringBootTest
class AopDemoApplicationTests {
@Test
public void test1() throws IOException, DocumentException {
FileOutputStream out = new FileOutputStream("D:" + File.separator + "createPDFWithWaterMark.pdf");
Document document = new Document();
PdfWriter.getInstance(document, out);
document.open();
// 微软雅黑
BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 中文字体 设置字体大小
Font font = new Font(chinese, 12, Font.NORMAL);
document.add(new Paragraph("hello1", font));
document.newPage();
document.add(new Paragraph("hello2", font));
document.newPage();
document.add(new Paragraph("hello3", font));
document.close();
// 图片水印
PdfReader reader = new PdfReader("D:" + File.separator + "createPDFWithWaterMark.pdf");
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("D:" + File.separator + "createPDFWithWaterMark2.pdf"));
Image img = Image.getInstance("D:" + File.separator + "a.jpeg");
img.setAbsolutePosition(200, 200);
PdfContentByte under = stamp.getUnderContent(1);
under.addImage(img);
// 文字水印
PdfContentByte over = stamp.getOverContent(2);
// 加载字库来完成对字体的创建
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
over.beginText();
// 设置颜色 默认为蓝色
over.setColorFill(BaseColor.RED);
// 设置字体字号
over.setFontAndSize(bf, 50);
// 设置起始位置
over.setTextMatrix(30, 30);
// 开始写入水印 左-下-倾斜度
over.showTextAligned(Element.ALIGN_LEFT, "nezha", 245, 400, 30);
over.endText();
// 背景图
Image img2 = Image.getInstance("D:" + File.separator + "b.jpg");
img2.setAbsolutePosition(0, 0);
PdfContentByte under2 = stamp.getUnderContent(3);
under2.addImage(img2);
stamp.close();
reader.close();
}
}
执行测试方法,生成两个PDF文件。
打开文件我们看到生成了带有水印和背景图的PDF文件。