点击链接加入群聊【java菜鸟学习】:https://jq.qq.com/?_wv=1027&k=5afU7nS
群号:124569404
-
pom文件引入pom相应的包
<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>core-renderer</artifactId> <version>R8</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.12</version> </dependency>
- 定义导入接口(这样只要实现这个PDF导出接口就可以自定义导出逻辑)
package com.example.demo.service; import com.lowagie.text.Document; import com.lowagie.text.pdf.PdfWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; public interface PdfExportService { public void make(Map<String, Object> model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response); }
3.PDF导出实现类
package com.example.demo.view;
import com.example.demo.service.PdfExportService;
import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfWriter;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**** imports ****/
public class PdfView extends AbstractPdfView {
// 导出服务接口
private PdfExportService pdfExportService = null;
// 创建对象的时候载入导出服务接口
public PdfView(PdfExportService pdfExportService) {
this.pdfExportService = pdfExportService;
}
// 调用接口实现
@Override
protected void buildPdfDocument(Map<String, Object> model, Document document,
PdfWriter writer,HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 调用导出服务接口类
pdfExportService.make(model, document, writer, request, response);
}
}
4.用户导出测试
controller
代码如下
package com.example.demo.controller;
import com.example.demo.aspect.service.UserService;
import com.example.demo.aspect.validator.UserValidator;
import com.example.demo.pojo.User;
import com.example.demo.service.PdfExportService;
import com.example.demo.view.PdfView;
import com.lowagie.text.Chunk;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.validation.Valid;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**** imports ****/
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/converter")
@ResponseBody
public User getUserByConverter(User user) {
return user;
}
@GetMapping("/list")
@ResponseBody
public List<User> list(List<User> userList) {
return userList;
}
/**
*
* @param user
* -- 用户对象用StringToUserConverter转换
* @param Errors
* --验证器返回的错误
* @param date
* -- 因为WebDataBinder已经绑定了格式,所以不再需要注解
* @return 各类数据
*/
@GetMapping("/validator")
@ResponseBody
public Map<String, Object> validator(@Valid User user, Errors Errors, Date date) {
Map<String, Object> map = new HashMap<>();
map.put("user", user);
map.put("date", date);
// 判断是否存在错误
if (Errors.hasErrors()) {
// 获取全部错误
List<ObjectError> oes = Errors.getAllErrors();
for (ObjectError oe : oes) {
// 判定是否字段错误
if (oe instanceof FieldError) {
// 字段错误
FieldError fe = (FieldError) oe;
map.put(fe.getField(), fe.getDefaultMessage());
} else {
// 对象错误
map.put(oe.getObjectName(), oe.getDefaultMessage());
}
}
}
return map;
}
// 导出接口
@GetMapping("/export/pdf")
public ModelAndView exportPdf(String userName, String note) {
// 查询用户信息列表 模拟从数据库中取两条记录
List<User> userList = new ArrayList<>();
User user = new User();
user.setId(1L);
user.setUserName("Tome");
user.setNote("not_01");
userList.add(user);
user = new User();
user.setId(2L);
user.setUserName("Jack");
user.setNote("not_02");
userList.add(user);
//List<User> userList = userService.findUsers(userName, note);
// 定义PDF视图
View view = new PdfView(exportService());
ModelAndView mv = new ModelAndView();
// 设置视图
mv.setView(view);
// 加入数据模型
mv.addObject("userList", userList);
return mv;
}
// 导出PDF自定义
@SuppressWarnings("unchecked")
private PdfExportService exportService() {
// 使用Lambda表达式定义自定义导出
return (model, document, writer, request, response) -> {
try {
// A4纸张
document.setPageSize(PageSize.A4);
// 标题
document.addTitle("用户信息");
// 换行
document.add(new Chunk("\n"));
// 表格,3列
PdfPTable table = new PdfPTable(3);
// 单元格
PdfPCell cell = null;
// 字体,定义为蓝色加粗
Font f8 = new Font();
f8.setColor(Color.BLUE);
f8.setStyle(Font.BOLD);
// 标题
cell = new PdfPCell(new Paragraph("id", f8));
// 居中对齐
cell.setHorizontalAlignment(1);
// 将单元格加入表格
table.addCell(cell);
cell = new PdfPCell(new Paragraph("user_name", f8));
// 居中对齐
cell.setHorizontalAlignment(1);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("note", f8));
cell.setHorizontalAlignment(1);
table.addCell(cell);
// 获取数据模型中的用户列表
List<User> userList = (List<User>) model.get("userList");
for (User user : userList) {
document.add(new Chunk("\n"));
cell = new PdfPCell(new Paragraph(user.getId() + ""));
table.addCell(cell);
cell = new PdfPCell(new Paragraph(user.getUserName()));
table.addCell(cell);
String note = user.getNote() == null ? "" : user.getNote();
cell = new PdfPCell(new Paragraph(note));
table.addCell(cell);
}
// 在文档中加入表格
document.add(table);
} catch (DocumentException e) {
e.printStackTrace();
}
};
}
}
5,浏览器访问http://localhost:8080/user/export/pdf
就能看到导出效果
附:
github地址:https://github.com/q920447939/spring-boot-2.x-demo/tree/master
引用<深入浅出Spring Boot 2.x>