一、前言
OpenPDF是一个开源的Java PDF库,它基于iText 5.x版本,但是它主要提供了HTML到PDF的转换能力。我们可以在SpringBoot项目中使用OpenPDF来生成PDF文件。PDF文件因其跨平台兼容性和格式的稳定性而在商业文档中广泛使用。使用Spring Boot集成OpenPDF库可以方便地将HTML、JSON或其他数据源转换为PDF格式,以供下载或打印。
二、项目实践
1.引入依赖
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.启动程序测试
三、总结
- 在实际生产环境中,你可能需要考虑更复杂的HTML布局以及CSS样式。
- 如果你需要支持中文等非英文字符,可能需要对字体进行额外配置。
- 以上代码片段只是一个基本的示例,你可能需要根据实际情况进行调整。