制作模板的工具 Adobe Acrobat DC
controller层
@ApiOperation(value = "导出PDF")
@PostMapping("/admissioncard")
public void generatorAdmissionCard(@RequestBody Map<String, Object> map, @RequestParam LocalDate date , HttpServletResponse response){
provincialTransactionAnalysisService.exportPDF(map, date, response);
}
service层
public void exportPDF(Map<String, Object> map, LocalDate date, HttpServletResponse response) {
try {
String base64Str = (String) map.get("base64Str");
InputStream streamSafe = ResourceUtil.getStreamSafe("exportTemplate/XXXX.pdf");
//inputStream转byte数组
byte[] bytes = inputStreamToByteArray(streamSafe);
// 模板名称
// String templateName = "XXXX.pdf";
// String path = "";
// 获取操作系统名称,根据系统名称确定模板存放的路径
// String systemName = System.getProperty("os.name");
// if(systemName.toUpperCase().startsWith("WIN")){
// path = "D:/pdf/";
//// path = "src/main/resources/exportTemplate/";
// }else {
// path = "/usr/local/pdf/";
// }
// 生成导出PDF的文件名称
String fileName = "XXXX日报"+date+".pdf";
fileName = URLEncoder.encode(fileName, "UTF-8");
// 设置响应头
response.setContentType("application/force-download");
response.setHeader("Content-Disposition",
"attachment;fileName=" + fileName);
OutputStream out = null;
ByteArrayOutputStream bos = null;
PdfStamper stamper = null;
PdfReader reader = null;
try {
// 保存到本地
// out = new FileOutputStream(fileName);
// 输出到浏览器端
out = response.getOutputStream();
// 读取PDF模板表单
// reader = new PdfReader(path + templateName);
reader = new PdfReader(bytes);
// 字节数组流,用来缓存文件流
bos = new ByteArrayOutputStream();
// 根据模板表单生成一个新的PDF
stamper = new PdfStamper(reader, bos);
// 获取新生成的PDF表单
AcroFields form = stamper.getAcroFields();
// 给表单生成中文字体,这里采用系统字体,不设置的话,中文显示会有问题
BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
// BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); //系统字体
form.addSubstitutionFont(font);
// 装配数据
Map<String, Object> data = new HashMap<>(2);
data.put("header", date.getYear()+"年"+date.getMonthValue()+"月"+date.getDayOfMonth()+"日全国省间电力现货交易情况");
data.put("date", date.getYear()+"年"+date.getMonthValue()+"月"+date.getDayOfMonth()+"日");
// data.put("img","C:/Users/iszhi/Pictures/Saved Pictures/1667647418320.jpg");
data.put("img",base64Str);
// 遍历data,给pdf表单赋值
for(String key : data.keySet()){
// 图片要单独处理
if("img".equals(key)){
int pageNo = form.getFieldPositions(key).get(0).page;
Rectangle signRect = form.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// String studentImage = data.get(key).toString();
//根据路径或Url读取图片
Image image = Image.getInstance(generateImage(base64Str));
// Image image = Image.getInstance("C:/Users/iszhi/Pictures/Saved Pictures/1667647418320.jpg");
// generateImage(base64Str,"省间现货");
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
// 设置普通文本数据
else {
form.setField(key, data.get(key).toString());
}
}
// 表明该PDF不可修改
stamper.setFormFlattening(true);
// 关闭资源
stamper.close();
// 将ByteArray字节数组中的流输出到out中(即输出到浏览器)
com.itextpdf.text.Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (out != null) {
out.flush();
out.close();
}
if (reader != null) {
reader.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}