根据模板导出PDF

185 阅读2分钟

制作模板的工具 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();
        }
}