本文目录导读:

- 前提条件
- 方法一:使用 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 开始学习,因为它更新、设计更清晰,且官方文档更完善,如果遇到具体问题(如表格合并、页眉页脚、加密等),可以进一步询问。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播