悠悠楠杉
网站页面
在现代企业应用中,PDF文件的生成与处理是常见需求,例如报表导出、合同生成等场景。Java生态中,iText库是操作PDF的标杆工具,支持从零创建PDF、编辑现有文件、添加复杂元素等功能。本文将带你系统学习iText的核心用法,全程代码实战。
iText是一个开源的Java/PDF库,支持PDF 1.7标准(ISO 32000),提供对文本、表格、图像、签名的精细控制。
Maven依赖配置:xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
以下代码创建一个包含标题和段落的PDF文件:
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
public class BasicPdf {
public static void main(String[] args) {
Document document = new Document();
try {
PdfWriter.getInstance(document, new FileOutputStream("basic.pdf"));
document.open();
document.add(new Paragraph("Hello PDF with iText!"));
document.add(new Paragraph("This is a sample paragraph."));
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
iText支持通过PdfPTable类创建表格,并设置字体、颜色等样式:
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.PdfPTable;
// 创建表格
PdfPTable table = new PdfPTable(3);
table.addCell("Name");
table.addCell("Age");
table.addCell("Role");
// 设置字体
Font boldFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
Paragraph header = new Paragraph("Employee List", boldFont);
document.add(header);
document.add(table);
通过Image类添加图片,结合PdfContentByte实现水印效果:
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
// 插入图片
Image logo = Image.getInstance("logo.png");
logo.scaleToFit(100, 100);
document.add(logo);
// 添加水印
PdfContentByte canvas = writer.getDirectContentUnder();
canvas.beginText();
canvas.setFontAndSize(baseFont, 40);
canvas.showTextAligned(PdfContentByte.ALIGN_CENTER, "CONFIDENTIAL", 300, 400, 45);
canvas.endText();
使用PdfReader和PdfStamper修改已有PDF:
PdfReader reader = new PdfReader("input.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));
// 在第二页添加文本
ColumnText ct = new ColumnText(stamper.getOverContent(2));
ct.setSimpleColumn(50, 50, 500, 700);
ct.addText(new Phrase("Modified by iText"));
ct.go();
stamper.close();
reader.close();
通过PdfEncryptor设置文件密码,或使用PdfSignatureAppearance实现数字签名:
// 加密PDF
PdfEncryptor.encrypt(reader, new FileOutputStream("encrypted.pdf"),
"userpass".getBytes(), "ownerpass".getBytes(),
PdfWriter.ALLOW_PRINTING, PdfWriter.STRENGTH128BITS);
// 数字签名(需密钥库)
PdfSignatureAppearance sap = stamper.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
PdfReader的partialRead模式。itext-asian包,设置中文字体:
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
Font chineseFont = new Font(bf, 12);