一、前言

OpenPDF是一个开源的Java PDF库,它基于iText 5.x版本,但是它主要提供了HTML到PDF的转换能力。我们可以在SpringBoot项目中使用OpenPDF来生成PDF文件。PDF文件因其跨平台兼容性和格式的稳定性而在商业文档中广泛使用。使用Spring Boot集成OpenPDF库可以方便地将HTML、JSON或其他数据源转换为PDF格式,以供下载或打印。

二、项目实践

1.引入依赖

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

2.创建实体类

package com.example.springbootdemo.domain;

import lombok.Data;

@Data
public class Order {
    /**
     * 订单号
     */
    private String orderNo;
    /**
     * 商品名称
     */
    private String name;
    /**
     * 商品单价
     */
    private double price;
    /**
     * 数量
     */
    private Integer nums;
    /**
     * 订单总价
     */
    private double totalPrice;

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

3.创建HTML模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>订单详情</h2>
<table>
    <tr>
        <th>orderNo:</th>
        <td>${orderNo}</td>
    </tr>
    <tr>
        <th>name:</th>
        <td>${name}</td>
    </tr>
    <tr>
        <th>price:</th>
        <td>${price}</td>
    </tr>
    <tr>
        <th>nums:</th>
        <td>${nums}</td>
    </tr>
    <tr>
        <th>totalPrice:</th>
        <td>${totalPrice}</td>
    </tr>
</table>
</body>
</html>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

4.使用OpenPDF生成PDF

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

package com.example.springbootdemo.controller;

import com.example.springbootdemo.domain.Order;
import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.org.apache.xpath.internal.operations.Or;
import org.mapstruct.ap.shaded.freemarker.template.Configuration;
import org.mapstruct.ap.shaded.freemarker.template.Template;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

@RestController
public class PdfController {

    @GetMapping("/createPdf")
    public void createPdf(HttpServletResponse response) throws Exception {
        // 设置HTTP响应头
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=order.pdf");
        Order order = new Order("202408181124885", "phone", 5.0, 10, 50.0);
        // 使用FreeMarker处理HTML模板
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
        cfg.setClassForTemplateLoading(PdfController.class, "/templates/"); // 假设HTML模板位于/templates/目录下
        Map<String, Object> data = new HashMap<>();
        data.put("orderNo", order.getOrderNo());
        data.put("name", order.getName());
        data.put("price", order.getPrice());
        data.put("nums", order.getNums());
        data.put("totalPrice", order.getTotalPrice());

        Template template = cfg.getTemplate("order.html");
        StringWriter stringWriter = new StringWriter();
        template.process(data, stringWriter);
        // 将HTML字符串转换为PDF
        ByteArrayOutputStream pdfBytes = new ByteArrayOutputStream();
        try (Document document = new Document()) {
            PdfWriter.getInstance(document, pdfBytes);
            document.open();
            com.lowagie.text.html.HtmlWriter.getInstance(document, pdfBytes);
            com.lowagie.text.html.simpleparser.HTMLWorker htmlParser = new com.lowagie.text.html.simpleparser.HTMLWorker(document);
            htmlParser.parse(new StringReader(stringWriter.toString()));
        }

        // 输出PDF到浏览器
        OutputStream out = response.getOutputStream();
        out.write(pdfBytes.toByteArray());
        out.flush();
        out.close();

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.

5.启动程序测试

SpringBoot集成OpenPDF实现PDF导出_SpringBoot

SpringBoot集成OpenPDF实现PDF导出_SpringBoot_02

SpringBoot集成OpenPDF实现PDF导出_OpenPDF_03

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