一、前言

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>

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;

}

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>

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();

    }
}

5.启动程序测试

SpringBoot集成OpenPDF实现PDF导出_OpenPDF

SpringBoot集成OpenPDF实现PDF导出_SpringBoot_02

SpringBoot集成OpenPDF实现PDF导出_SpringBoot_03

三、总结

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