Bootstrap

【Java】使用iText依赖生成PDF文件

使用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文件的关键步骤:

  1. 正确配置环境和依赖
  2. 处理中文字体
  3. 设置背景和布局
  4. 添加文本内容
  5. 处理文件下载

通过这些步骤,我们可以生成专业的PDF文档。在实际应用中,还可以根据需求添加更多功能,如水印、加密、电子签名等。

;