SpringBoot与iTextPdf完美结合:高效生成PDF预览

在Web应用开发中,生成PDF文档的需求十分常见,特别是在需要导出报表、发票、合同等场景下。SpringBoot作为Java领域的一个流行框架,提供了简洁高效的开发方式。而iTextPdf则是Java中最强大且使用广泛的PDF生成库之一。本文将详细介绍如何在SpringBoot项目中结合iTextPdf来高效生成PDF文档,并提供预览功能。

图片[1]-SpringBoot与iTextPdf完美结合:高效生成PDF预览-连界优站

一、环境准备

在开始之前,请确保你的开发环境中已经安装了以下组件:

  1. Java环境:确保已经安装了Java开发环境(JDK)。
  2. IDE:推荐使用IntelliJ IDEA或Eclipse等支持Maven的IDE。
  3. 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
喜欢就支持一下吧
点赞7赞赏 分享