工作中偶尔用到Java代码生成PDF文件的场景。iText是一个用于操作PDF文档的开源库,可以在Java和.NET环境中使用。它提供了创建、读取、修改和写入PDF文档的功能,在此测试记录一下。示例中包括PDF生成、水印添加等。
Maven依赖
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.3.2</version>
</dependency>
<!--iText-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
</dependencies>
测试代码
package test;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author NYK
* @date 2023/6/13-9:08
*/
@Slf4j
public class ItextTest {
private static Font titleFont = new Font(Font.FontFamily.TIMES_ROMAN, 25, Font.BOLD);
private static Font subtitleFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD, new BaseColor(249, 157, 37));
private static Font normalFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL);
private static Font boldFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD, new BaseColor(60, 131, 153));
// 水印内容
private static String waterContent = "NIYUEKE";
// 水印不透明度
private static float opacity = 0.9f;
// 水印倾斜角度
private static float rotation = 40f;
// 水印字体大小
private static float fontSize = 50f;
/**
* 生成一个包含标题、段落、图片和超链接等等的PDF文件
* 1. Chunk(块):Chunk是PDF文档中的最小单位,它表示一个单独的字符串。在iText中,一个Chunk对象通常用于表示PDF文档中
* 的一块不可分割的文本。它具有一定的样式、字体等属性。
* <p>
* 2. Phrase(短语):Phrase是由一个或多个Chunks组成的文本段。短语继承了Chunk的属性,但还可以包含多个Chunk,并自动处
* 理不同Chunk之间的换行、空格等。
* <p>
* 3. Paragraph(段落):Paragraph是由多个Phrases组成的文本段。此外,段落还具有与文档的排版和位置相关的属性,例如对齐
* 方式、缩进、间距等。
* <p>
* 4. List(列表):List是由多个ListItems组成的文本列表。列表有有序列表和无序列表两种类型,可以自定义列表符号等样式。
* <p>
* 5. ListItem(列表项):ListItem是一个特殊的段落类型,通常用于表示一个列表中的单个元素。ListItem是由一个或多个Phrases
* 组成的,具有与段落相似的文本排版属性,但可以添加到List对象中。
* <p>
* 6. PdfPTable(表格):PdfPTable是一个PDF文档中的表格对象
*