内容目录
- —— 一、环境准备
- —— 二、引入依赖
- —— 三、创建PDF生成服务
- —— 四、创建Thymeleaf模板
- —— 五、创建控制器
- —— 六、测试预览功能
- —— 七、总结
在Web应用开发中,生成PDF文档的需求十分常见,特别是在需要导出报表、发票、合同等场景下。SpringBoot作为Java领域的一个流行框架,提供了简洁高效的开发方式。而iTextPdf则是Java中最强大且使用广泛的PDF生成库之一。本文将详细介绍如何在SpringBoot项目中结合iTextPdf来高效生成PDF文档,并提供预览功能。
一、环境准备
在开始之前,请确保你的开发环境中已经安装了以下组件:
- Java环境:确保已经安装了Java开发环境(JDK)。
- IDE:推荐使用IntelliJ IDEA或Eclipse等支持Maven的IDE。
- SpringBoot项目:一个基本的SpringBoot项目环境。
二、引入依赖
首先,需要在项目的pom.xml
文件中引入iTextPdf的相关依赖:
<dependencies>
<!-- SpringBoot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- iText 7 (适用于HTML转换) -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.12</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>7.1.12</version>
</dependency>
<!-- Thymeleaf模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
三、创建PDF生成服务
接下来,我们将创建一个服务类来处理PDF的生成。
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
@Service
public class PdfGeneratorService {
private final TemplateEngine templateEngine;
public PdfGeneratorService(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
public void generatePdfFromHtml(HttpServletResponse response, String templateName, Map<String, Object> variables) throws Exception {
// 设置响应类型
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"document.pdf\"");
try (OutputStream outputStream = response.getOutputStream()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 解析模板
Context context = new Context();
context.setVariables(variables);
String processedHtml = templateEngine.process(templateName, context);
// 初始化PDF文档
PdfWriter pdfWriter = new PdfWriter(baos);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
// 设置HTML到PDF的转换属性
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setCharset(StandardCharsets.UTF_8);
// 转换HTML到PDF
HtmlConverter.convertToPdf(processedHtml, pdfDocument, converterProperties);
// 写入PDF文档
pdfDocument.close();
baos.writeTo(outputStream);
outputStream.flush();
}
}
}
四、创建Thymeleaf模板
创建一个简单的Thymeleaf HTML模板,该模板将被转换为PDF。
<!-- resources/templates/document.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}">Document Title</title>
</head>
<body>
<h1 th:text="${header}">Header</h1>
<p th:text="${content}">Content here</p>
</body>
</html>
五、创建控制器
创建一个控制器类来处理HTTP请求,并调用上面的服务类来生成PDF。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
@RestController
public class DocumentController {
private final PdfGeneratorService pdfGeneratorService;
@Autowired
public DocumentController(PdfGeneratorService pdfGeneratorService) {
this.pdfGeneratorService = pdfGeneratorService;
}
@GetMapping("/generate-pdf")
public void generatePdf(@RequestParam("title") String title,
@RequestParam("header") String header,
@RequestParam("content") String content,
HttpServletResponse response) throws Exception {
Map<String, Object> variables = new HashMap<>();
variables.put("title", title);
variables.put("header", header);
variables.put("content", content);
pdfGeneratorService.generatePdfFromHtml(response, "document", variables);
}
}
六、测试预览功能
启动SpringBoot应用后,可以通过浏览器访问http://localhost:8080/generate-pdf?title=My%20Document&header=Welcome&content=This%20is%20a%20sample%20document
来测试PDF生成和预览功能。
七、总结
通过本文的学习,你应该已经掌握了如何在SpringBoot项目中结合iTextPdf生成PDF文档,并提供了在线预览功能。这种方法不仅可以提高工作效率,还能保证文档的一致性和准确性。希望这篇教程能够帮助你在实际项目中更好地应用这些技术。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END