Spring-boot导入PDF文件

点击链接加入群聊【java菜鸟学习】:https://jq.qq.com/?_wv=1027&k=5afU7nS
群号:124569404

  1. 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>
    
    
    
    
    1. 定义导入接口(这样只要实现这个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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值