前端VUE项目页面,点击按钮调用后端接口生成PDF文件,可以选择直接下载到浏览器,也可以后端生成到服务器再下载,我这里是直接下载到浏览器;
前端代码
getPdf(){
this.$axios.getPdf(this.queryParams).then((res)=>{
if (res.type.includes('application/json')) {
this.fileDown.loadDialogStatus = false;
let reader = new FileReader()
reader.readAsText(res)
reader.onload = function (event) {
let content = reader.result
let message = JSON.parse(content).errMessage // 错误信息
// TODO 错误处理
this.msgError('导出失败:'+message);
}.bind(this)
}else{
//导出文件名
// var filename = new Date().getTime();
var filename = 'PDF文件';
//创建url
let url = window.URL.createObjectURL(res)
//创建a标签 并设置属性
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', filename + '.pdf')
//添加a标签
document.body.appendChild(link)
//执行下载
link.click();
//释放url对象
URL.revokeObjectURL(link.href);
//释放a标签
document.body.removeChild(link);
}
});
}
这里做了后端报错处理,后端业务数据报错导致数据报错,可以通过判断res.type是否为application/json,后端代码在后面附上
export function getPdf(url, params) {
return request({
url: url,
method: 'get',
responseType:'blob',
params: params,
timeout: 1000 * 60 * 5
})
}
url为后端请求路径,这里注意timeout,如果PDF文件太大,会导致请求超时情况
后端代码
1.java pom.xml文件加入依赖**
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
2.Controller代码
@GetMapping("/growReportPDF")
public void growReportPDF(GrowRecordBaseQueryDto growRecordQueryDto, HttpServletResponse response) throws Exception{
//设置响应格式等
response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
String title = "PDF导出";
response.setHeader("Content-disposition","attachment; filename=".concat(String.valueOf(URLEncoder.encode(title + ".pdf", "UTF-8"))));
bgpdfService.createGrowReportPDF(response,growRecordQueryDto);
}
3.Service代码
import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.SneakyThrows;
import net.microcarystal.comm.GrowConstants;
import net.microcarystal.dao.GrowRecordBaseMapper;
import net.microcarystal.dao.NurseryStuMapper;
import net.microcarystal.dto.grow.GrowRecordBaseQueryDto;
import net.microcarystal.services.grow.IGrowBgpdfService;
import net.microcarystal.utils.DateUtils;
import net.microcarystal.utils.PDFReport;
import net.microcarystal.utils.PdfCustomFont;
import net.microcarystal.utils.PdfHeaderFooterEvent;
import net.microcarystal.vo.grow.GrowRecordQueryVo;
import net.microcarystal.vo.nursery.NurseryStuQueryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class GrowBgpdfServiceImpl implements IGrowBgpdfService {
@Autowired
private GrowRecordBaseMapper growRecordMapper;
@Autowired
private NurseryStuMapper nurseryStuMapper;
/**
* @param response
* @param growRecordQueryDto
* @throws Exception
*/
@Override
public void createGrowReportPDF(HttpServletResponse response, GrowRecordBaseQueryDto growRecordQueryDto) throws IOException {
try{
if(条件){
throw new Exception("这里异常前端可以拿到");
}
Rectangle rect = new Rectangle(PageSize.A4);
//创建文档实例
Document document = new Document(rect);
OutputStream out = response.getOutputStream();
PdfWriter writer = PdfWriter.getInstance(document,out);
//第二步设置背景图
setBackImage(writer,"/phoenixImg/backGround.jpg");
document.open();
PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();
writer.setPageEvent(event);
//首页
BufferedImage image = ImageIO.read(new File("/phoenixImg/bg-fm.jpg"));
Graphics2D graphics = image.createGraphics();
PdfCustomFont customFont = new PdfCustomFont();
java.awt.Font fontNurseryName = customFont.loadFont("/fonts/SourceHanSansCN-Medium.ttf", 120f);
graphics.setFont(fontNurseryName);
// 设置文字颜色
graphics.setColor(Color.BLACK);
// 添加文字到图片
String nurseryName = nurseryStu.getNurseryName();
int xNurseryName = 1100;
int yNurseryName = 1500;
graphics.drawString(nurseryName, xNurseryName, yNurseryName);
java.awt.Font font = customFont.loadFont("/fonts/SourceHanSansCN-Medium.ttf", 72f);
graphics.setFont(font);
String textName = nurseryStu.getStuName();
int xName = 800;
int yName = 2420;
graphics.drawString(textName, xName, yName);
String bitthDay = DateUtils.transformatDate(nurseryStu.getStuBirth(),DateUtils.YYYY_MM_DD);
int xBitthDay = 1030;
int yBitthDay = 2550;
graphics.drawString(bitthDay, xBitthDay, yBitthDay);
String className = nurseryStu.getClassNames();
int xClassName = 1030;
int yClassName = 2690;
graphics.drawString(className, xClassName, yClassName);
String bgTime = DateUtils.transformatDate(growRecordQueryDto.getStartGrowUpDate(),DateUtils.YYYY_MM) + " - "+
DateUtils.transformatDate(growRecordQueryDto.getEndGrowUpDate(),DateUtils.YYYY_MM);
int xBgTime = 1030;
int yBgTime = 2820;
graphics.drawString(bgTime, xBgTime, yBgTime);
// 保存修改后的图片
String filePath = "/phoenixImg/"+nurseryStu.getStuName()+"jpg";
ImageIO.write(image, "jpg", new File(filePath));
Image imgfm = Image.getInstance(filePath);
float height = document.getPageSize().getHeight();
float width = document.getPageSize().getWidth();
imgfm.setAbsolutePosition(0 , 0);
imgfm.scaleAbsolute(width , height);
document.add(imgfm);
if(new File(filePath).exists()){
new File(filePath).delete();
}
//正文
document.setMargins(0,0,60,100);
document.newPage();
//PDF内容
//尾页
document.newPage();
Image imgLogoW = Image.getInstance("/phoenixImg/bg-fd.jpg");
imgLogoW.setAbsolutePosition(0 , 0);
imgLogoW.scaleAbsolute(width , height);
document.add(imgLogoW);
document.close();
}catch (Exception e){
response.setContentType("application/json;charset=UTF-8");
JSONObject object = new JSONObject();
object.put("errMessage", e.getMessage());
response.getWriter().write(object.toString());
e.printStackTrace();
}
}
/***
* PDF的所有页都设置背景图
*/
private static void setBackImage(PdfWriter writer, final String backImagePath) {
writer.setPageEvent(new PdfPageEventHelper(){
@SneakyThrows
@Override
public void onStartPage(PdfWriter writer, Document document) {
int totalNum = writer.getPageNumber();
if(totalNum>1){
super.onStartPage(writer, document);
//填充背景图
float height = document.getPageSize().getHeight();
float width = document.getPageSize().getWidth();
Image instance = Image.getInstance(backImagePath);
instance.setAbsolutePosition(0 , 0);
instance.scaleAbsolute(width , height);
document.add(instance);
}
}
});
}
}