本文目录导读:

- 前提条件
- 方法一:使用 iText 7 生成 PDF(推荐)
- 方法二:使用 iText 5 生成 PDF(旧版)
- 完整示例:生成带中文、表格和图片的 PDF(iText 7)
- 常见问题与参考
- 重要提示:iText 的版权问题
使用 iText 生成 PDF 主要分为两个主要版本:iText 5(旧版)和 iText 7(当前主流版本),两者在 API 和包名上有较大差异。
下面是基于 iText 7 和 iText 5 的两种典型生成方式。
前提条件
首先需要在项目中添加 iText 依赖,以 Maven 为例:
iText 7(推荐):
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
iText 5(旧版):
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
使用 iText 7 生成 PDF(推荐)
iText 7 的 API 更加现代化,采用工厂模式和链式调用。
示例代码:生成一个简单的“Hello World”PDF
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import java.io.FileNotFoundException;
public class GeneratePdfItext7 {
public static void main(String[] args) throws FileNotFoundException {
// 1. 创建 PdfWriter,指定输出文件路径
String dest = "hello_itext7.pdf";
PdfWriter writer = new PdfWriter(dest);
// 2. 创建 PdfDocument 对象
PdfDocument pdfDoc = new PdfDocument(writer);
// 3. 创建 Document 对象(用于添加内容)
Document document = new Document(pdfDoc);
// 4. 添加内容(Paragraph 是段落)
document.add(new Paragraph("Hello, iText 7!"));
document.add(new Paragraph("这是用 iText 7 生成的 PDF 文件。"));
// 5. 关闭文档(必须调用)
document.close();
System.out.println("PDF 已生成:" + dest);
}
}
iText 7 常用功能:
- 添加表格:
Table table = new Table(3);+table.addCell("内容"); - 添加图片:
Image img = new Image(ImageDataFactory.create("logo.png")); - 设置样式:
Paragraph p = new Paragraph("文本").setFontSize(12).setBold();
使用 iText 5 生成 PDF(旧版)
iText 5 的 API 直接操作 Document 对象进行内容的添加。
示例代码:
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class GeneratePdfItext5 {
public static void main(String[] args) {
Document document = new Document();
try {
// 1. 创建 PdfWriter 并与 Document 关联
PdfWriter.getInstance(document, new FileOutputStream("hello_itext5.pdf"));
// 2. 打开文档
document.open();
// 3. 添加内容
document.add(new Paragraph("Hello, iText 5!"));
document.add(new Paragraph("这是用 iText 5 生成的 PDF。"));
// 4. 关闭文档
document.close();
System.out.println("PDF 已生成");
} catch (DocumentException | FileNotFoundException e) {
e.printStackTrace();
}
}
}
完整示例:生成带中文、表格和图片的 PDF(iText 7)
很多初学者会遇到中文乱码问题,这里给出一个包含中文字体设置的完整例子。
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.io.image.ImageDataFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
public class AdvancedPdfExample {
public static void main(String[] args) throws IOException {
String dest = "advanced_example.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// ---- 处理中文(加载字体后,中文显示正常) ----
// 方法1:使用系统字体(Windows 常见)
String fontPath = "C:\\Windows\\Fonts\\simsun.ttc"; // 宋体(注意 ttc 格式)
// 方法2:使用项目资源中的字体
// String fontPath = "src/main/resources/fonts/SimSun.ttf";
// 加载中文字体
PdfFont chineseFont = PdfFontFactory.createFont(fontPath, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
// 设置基础字体
document.setFont(chineseFont);
// 1. 添加标题
document.add(new Paragraph("员工信息报表").setFontSize(20).setBold());
// 2. 添加段落
document.add(new Paragraph("以下是公司 2024 年第一季度员工名单:"));
// 3. 添加表格
float[] columnWidths = {1, 2, 3}; // 列宽比例
Table table = new Table(UnitValue.createPercentArray(columnWidths));
table.addCell(new Cell().add(new Paragraph("编号")));
table.addCell(new Cell().add(new Paragraph("姓名")));
table.addCell(new Cell().add(new Paragraph("部门")));
table.addCell("001");
table.addCell("张三");
table.addCell("技术部");
table.addCell("002");
table.addCell("李四");
table.addCell("市场部");
document.add(table);
// 4. 添加图片
try {
Image img = new Image(ImageDataFactory.create("logo.png")); // 图片路径
img.setWidth(100); // 设置宽度
document.add(img);
} catch (Exception e) {
document.add(new Paragraph("[图片加载失败]"));
}
// 关闭文档
document.close();
System.out.println("高级示例 PDF 已生成");
}
}
常见问题与参考
| 问题 | iText 7 解决方案 | iText 5 解决方案 |
|---|---|---|
| 中文乱码 | 必须加载中文字体 PdfFont(如宋体、黑体) |
使用 BaseFont 加载中文字体 |
| 引入依赖 | com.itextpdf:itext7-core |
com.itextpdf:itextpdf |
| 包名 | com.itextpdf.kernel.*, com.itextpdf.layout.* |
com.itextpdf.text.* |
| License | iText 7 存在 AGPL 版权限制(商业使用需购买许可) | 同左 |
重要提示:iText 的版权问题
iText 是一个采用 AGPL 许可证的开源库,这意味着:
- 如果你将生成 PDF 的功能集成到商业闭源软件中,且不公开源码,必须购买 iText 的商业许可证。
- 免费使用仅适用于开源项目或个人非商业用途。
如果你需要避免版权问题,可以考虑使用 Apache PDFBox 或 Flying Saucer(基于 iText 但有时也受限),或者使用不限制商业使用的库。
建议从 iText 7 开始学习,因为它更新、设计更清晰,且官方文档更完善,如果遇到具体问题(如表格合并、页眉页脚、加密等),可以进一步询问。