文章目录
使用iText实现PDF文件生成
1. 需求
在实际开发中,我们经常需要生成PDF文档,比如报告、通知书、证书等。本文将介绍如何使用iText库在Java中生成PDF文件,并结合实际案例讲解具体实现步骤。
功能:用户能够实现对录用通知的信息录入、打印功能。
业务:用户可以对作者名字、论文题目、期刊名称、录用时间等信息录入,并且可以生成PDF版的录用通知书。
录用通知书的模板见附件。
2 . 添加依赖
首先在项目中添加iText依赖:
<!-- iText 7 核心包 实现转pdf的依赖-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
<!-- 如果需要支持中文,添加以下依赖 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.2.5</version>
</dependency>
3. 核心
使用iText生成PDF时,主要涉及以下几个核心类:
PdfWriter
:负责写入PDF文件PdfDocument
:代表PDF文档Document
:用于添加内容的高级文档对象PdfFont
:字体对象,特别重要,用于处理中文等字符Paragraph
:段落对象,用于添加文本内容Image
:图片对象,用于添加图片
4. 实战案例:生成录用通知书
4.1 整体架构
@Service
public class LetterServiceImpl implements LetterService {
@Override
public byte[] generatePdf(LetterParam param) {
try {
// PDF生成逻辑
} catch (Exception e) {
throw new RuntimeException("生成PDF失败", e);
}
}
}
4.2 初始化PDF文档
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
4.3 配置中文字体
处理中文是PDF生成中的一个重要环节,需要正确配置字体:
String fontPath = Paths.get("src/main/resources/static/fonts/simsun.ttf")
.toAbsolutePath().toString();
PdfFont font = PdfFontFactory.createFont(fontPath,
PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
document.setFont(font);
4.4 添加背景图片
String backgroundPath = Paths.get("src/main/resources/static/background.png")
.toAbsolutePath().toString();
Image background = new Image(ImageDataFactory.create(backgroundPath));
// 设置背景图片属性
background.setFixedPosition(0, 0);
background.setWidth(document.getPdfDocument().getDefaultPageSize().getWidth());
background.setHeight(document.getPdfDocument().getDefaultPageSize().getHeight());
document.add(background);
4.5 添加文本内容
// 添加作者名字
document.add(new Paragraph(param.getAuthorName())
.setFontSize(24)
.setMarginLeft(200)
.setFont(font));
// 添加期刊名称
document.add(new Paragraph(param.getJournalName())
.setFontSize(24)
.setTextAlignment(TextAlignment.CENTER)
.setFontColor(new DeviceRgb(0, 0, 255)) // 蓝色
.setMarginTop(20)
.setFont(font));
4.6 处理文档生成
document.close();
return baos.toByteArray();
5. 关键技巧与注意事项
5.1 字体处理
- 确保字体文件存在且路径正确
- 使用
PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED
嵌入字体 - 设置适当的字体大小和样式
5.2 图片处理
- 背景图片设置为固定位置
- 根据页面大小自适应图片尺寸
- 注意图片格式支持(推荐PNG、JPG)
5.3 布局控制
- 使用
setMarginLeft()
等方法控制元素位置 - 通过
setTextAlignment()
设置文本对齐方式 - 使用
new Paragraph("\n")
添加空行调整间距
5.4 异常处理
- 包装iText可能抛出的异常
- 提供清晰的错误信息
- 确保资源正确关闭
6. 前后端交互
6.1 后端接口
@PostMapping("/upload")
public ResponseEntity<byte[]> generateLetter(@RequestBody LetterParam letter) {
byte[] pdf = letterService.generatePdf(letter);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.setContentDispositionFormData("filename",
"acceptance_letter_" + letter.getAuthorName() + ".pdf");
// 返回
return new ResponseEntity<>(pdf, headers, HttpStatus.OK);
}
6.2 前端处理
const response = await letter(formData);
const blob = new Blob([response.data], { type: 'application/pdf' });
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = `录用通知书_${formData.authorName}.pdf`;
document.body.appendChild(link);
link.click();
7. 效果
8. 总结
使用iText生成PDF文件的关键步骤:
- 正确配置环境和依赖
- 处理中文字体
- 设置背景和布局
- 添加文本内容
- 处理文件下载
通过这些步骤,我们可以生成专业的PDF文档。在实际应用中,还可以根据需求添加更多功能,如水印、加密、电子签名等。