计算机系统应用教程网站

网站首页 > 技术文章 正文

Spring Boot集成OpenPDF实现PDF导出功能

btikc 2024-10-23 09:10:16 技术文章 7 ℃ 0 评论

如果你想要在Spring Boot项目中使用OpenPDF来生成PDF文件,而不是iText,你可以通过将HTML转换成PDF的方式来实现。OpenPDF是一个开源的Java PDF库,它基于iText 5.x版本,但是它主要提供了HTML到PDF的转换能力。

下面是如何在Spring Boot项目中设置并使用OpenPDF来生成PDF文件的一个简单教程。

1. 引言

PDF文件因其跨平台兼容性和格式的稳定性而在商业文档中广泛使用。使用Spring Boot集成OpenPDF库可以方便地将HTML、JSON或其他数据源转换为PDF格式,以供下载或打印。

2. 准备工作

2.1 添加依赖

首先,在你的pom.xml文件中添加OpenPDF的依赖:

Xml

深色版本

1<dependency>
2    <groupId>com.github.openpdf</groupId>
3    <artifactId>openpdf</artifactId>
4    <version>1.3.14</version>
5</dependency>

2.2 创建实体类

假设我们有一个简单的Invoice实体类,用于存储发票信息:

Java

深色版本

1import java.time.LocalDate;
2
3public class Invoice {
4
5    private String invoiceNumber;
6    private LocalDate issueDate;
7    private String customerName;
8    private double totalAmount;
9
10    // 构造器、getter和setter...
11
12    public Invoice(String invoiceNumber, LocalDate issueDate, String customerName, double totalAmount) {
13        this.invoiceNumber = invoiceNumber;
14        this.issueDate = issueDate;
15        this.customerName = customerName;
16        this.totalAmount = totalAmount;
17    }
18
19    // Getter and setter methods...
20}

3. 创建HTML模板

为了将数据转换为PDF文件,我们需要创建一个HTML模板,该模板定义了PDF文件的样式和布局。

Html

深色版本

1<!DOCTYPE html>
2<html>
3<head>
4    <style>
5        body { font-family: Arial; }
6        table { width: 100%; border-collapse: collapse; }
7        td, th { border: 1px solid #dddddd; text-align: left; padding: 8px; }
8    </style>
9</head>
10<body>
11    <h2>Invoice</h2>
12    <table>
13        <tr>
14            <th>Invoice Number:</th>
15            <td>${invoiceNumber}</td>
16        </tr>
17        <tr>
18            <th>Issue Date:</th>
19            <td>${issueDate}</td>
20        </tr>
21        <tr>
22            <th>Customer Name:</th>
23            <td>${customerName}</td>
24        </tr>
25        <tr>
26            <th>Total Amount:</th>
27            <td>${totalAmount}</td>
28        </tr>
29    </table>
30</body>
31</html>

4. 使用OpenPDF生成PDF

接下来,我们需要编写一个控制器方法,该方法读取HTML模板,填充数据,并将其转换为PDF文件。

Java

深色版本

1import com.lowagie.text.Document;
2import com.lowagie.text.pdf.PdfWriter;
3import com.lowagie.text.pdf.parser.PdfTextExtractor;
4import freemarker.template.Configuration;
5import freemarker.template.Template;
6import freemarker.template.TemplateException;
7import org.springframework.stereotype.Controller;
8import org.springframework.web.bind.annotation.GetMapping;
9import org.springframework.web.bind.annotation.ResponseBody;
10
11import javax.servlet.http.HttpServletResponse;
12import java.io.ByteArrayOutputStream;
13import java.io.IOException;
14import java.io.OutputStream;
15import java.io.StringWriter;
16import java.nio.charset.StandardCharsets;
17import java.util.HashMap;
18import java.util.Map;
19
20@Controller
21public class PdfController {
22
23    @GetMapping("/generate-pdf")
24    @ResponseBody
25    public void generatePdf(HttpServletResponse response) throws IOException, TemplateException {
26        // 设置HTTP响应头
27        response.setContentType("application/pdf");
28        response.setHeader("Content-Disposition", "attachment; filename=invoice.pdf");
29
30        // 创建Invoice实例
31        Invoice invoice = new Invoice("INV-123456", LocalDate.now(), "John Doe", 250.99);
32
33        // 使用FreeMarker处理HTML模板
34        Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
35        cfg.setClassForTemplateLoading(PdfController.class, "/templates/"); // 假设HTML模板位于/templates/目录下
36
37        Map<String, Object> data = new HashMap<>();
38        data.put("invoice", invoice);
39
40        Template template = cfg.getTemplate("invoice.html");
41        StringWriter stringWriter = new StringWriter();
42        template.process(data, stringWriter);
43
44        // 将HTML字符串转换为PDF
45        ByteArrayOutputStream pdfBytes = new ByteArrayOutputStream();
46        try (Document document = new Document()) {
47            PdfWriter.getInstance(document, pdfBytes);
48            document.open();
49            com.lowagie.text.html.HtmlWriter.getInstance(document, pdfBytes);
50            com.lowagie.text.html.simpleparser.HTMLWorker htmlParser = new com.lowagie.text.html.simpleparser.HTMLWorker(document);
51            htmlParser.parse(new StringReader(stringWriter.toString()));
52            document.close();
53        }
54
55        // 输出PDF到浏览器
56        OutputStream out = response.getOutputStream();
57        out.write(pdfBytes.toByteArray());
58        out.flush();
59        out.close();
60    }
61}

在这个示例中,我们使用了Freemarker作为模板引擎来渲染HTML页面。如果你不使用Freemarker,你可以选择其他的模板引擎或者直接使用静态HTML文件。

注意事项

  • 在实际生产环境中,你可能需要考虑更复杂的HTML布局以及CSS样式。
  • 如果你需要支持中文等非英文字符,可能需要对字体进行额外配置。
  • 以上代码片段只是一个基本的示例,你可能需要根据实际情况进行调整。

这样,当用户访问/generate-pdf URL时,他们将能够下载生成的PDF文件。

以上步骤展示了如何在Spring Boot中集成OpenPDF并生成PDF文件的基本流程。希望这可以帮助你快速上手!

如果你有任何问题或需要进一步的帮助,请随时提问。


本文档撰写于2024年7月25日。


参考资料

  • OpenPDF GitHub Repository

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表