根据客户需求,现需要根据提供的PDF模板,封装数据生成,PDF,里面涉及到了多条数据的参数的封装,废话不多说,直接上步骤
1.因为是maven项目,需要引入itext的包已经中文注解包,如下图
2.因为需要模板,自己可以通过Adobe制作模板,制作需要的模板,这里就不进行模板的制作,
3.接下来是PDF的封装代码
@RestController public class ToPdfController { private final static Logger logger = (Logger) LoggerFactory.getLogger(ToPdfController.class); @Value("${spring.redis.enable}") private String enable; @Value("${client-process.suffixUrl}") private String suffixUrl; @Value("${****Header.Prefix}") private String *****HeaderPrefix; @Value("${****Header.Pdfurl}") private String Pdfurl; @Value("${****Header.pdfCreatFile}") private String pdfCreatFile; @Value("${****Header.caUrl}") private String caUrl; @Value("${****Header.caAppCode}") private String caAppCode; @Value("${****Header.caAppPWD}") private String caAppPWD; @Value("${****Header.caContainerName}") private String caContainerName; @Value("${****Header.caSignatureAlgorithm}") private String caSignatureAlgorithm; @Value("${*****Header.caInDataType}") private String caInDataType; @Autowired private ServiceTemplateDao serviceTemplateDao; @Autowired private DBServiceInfoManage serviceInfoManage; @Autowired private OrganInfoDao organInfoDao; @ResponseBody @RequestMapping(value = "/rest/selectFile", method = RequestMethod.POST) public void getMessageToPdf(HttpServletRequest request, @RequestBody String param, HttpServletResponse response, String serviceName) { logger.info("接口入参开始==================" + param); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd- HH:mm:ss.SSS"); Date date = new Date(); String StartTime = sf.format(date); String result = ""; JSONObject json = new JSONObject(); try { JSONObject parseObject = JSONObject.parseObject(param); // String serviceName = (String) parseObject.get("serviceName"); String serviceCode = (String) parseObject.get("serviceCode"); if (StringUtils.isBlank(serviceName)) { json.put("code", 1); json.put("message", "服务的英文名称不能为空"); return; } else { Map<String, String> map = new HashMap<String, String>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = (String) headerNames.nextElement(); String value = request.getHeader(key); map.put(key, value); } DbServiceInfo dbServiceInfo = serviceInfoManage.findByServiceName(serviceName); String url = Pdfurl + serviceName; // String url = dbServiceInfo.getServiceUrl(); String data = JSONObject.toJSONString(parseObject.get("data")); result = httpWithPost(url, map, data); Date enddate = new Date(); // 获取两个时间的时间差 long ms = getTimeMessage(enddate, date); // 转化时间的为String类型的数据 String valueOf = String.valueOf(ms); valueOf += "ms"; JSONObject parse = JSONObject.parseObject(result); int code = (int) parse.get("Code"); // 获取头信息数据 if (code != 0) { json.put("code", 1); json.put("message", "数据调用失败"); return; } else { Object object = parse.get("Data"); JSONArray jsonObject = (JSONArray) JSONArray.toJSON(object); String uuid = dbServiceInfo.getUuid(); ServiceTemplate serviceTemplate = serviceTemplateDao.findByServiceUuid(uuid); //进行参数的封装 encapsulation(jsonObject, serviceCode, response, serviceTemplate, request, map, serviceName, StartTime, valueOf); } } } catch (Exception e) { e.printStackTrace(); } }
/** * 获取时间差的数据 * * @param enddate * @param date * @return */ private long getTimeMessage(Date enddate, Date date) { long between = 0; try { between = (enddate.getTime() - date.getTime()); } catch (Exception e) { e.printStackTrace(); } long day = between / (24 * 60 * 60 * 1000); long hour = (between / (60 * 60 * 1000) - day * 24); long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000); return ms; }
封装参数,重点
/** * 进行参数的封装 * * @param jsonObject * @throws DocumentException * @throws IOException */ private void encapsulation(JSONArray jsonObject, String code, HttpServletResponse response, ServiceTemplate serviceTemplate, HttpServletRequest request, Map<String, String> map, String serviceName, String startTime, String value) { //多个PDF页需要多个ByteArrayOutputStream支持数据的封装 List<ByteArrayOutputStream> bossList = new ArrayList<>(); try { // 获取文件的路径 List<PdfReader> list = new ArrayList(); PdfReader reader = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); String pdfUrl = serviceTemplate.getUrl(); SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format2 = String.valueOf(new Date().getTime() / 1000); String flieName = serviceTemplate.getFlieName(); String flieName1 = ""; if (StringUtils.isNotBlank(flieName)) { String[] split = flieName.split("\\."); flieName = split[0]; flieName1 = split[1]; } FileOutputStream fos = new FileOutputStream(pdfCreatFile + flieName + "_" + format2 + "." + flieName1);// 需要生成PDF String batchId = MsgUtils.getBatchId(); for (int i = 0; i < jsonObject.size(); i++) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); reader = new PdfReader(pdfUrl);// 模板 PdfStamper mPdfStamper = new PdfStamper(reader, baos);// 解析 // 遍历 jsonarray 数组,把每一个对象转成 json 对象 JSONObject job = jsonObject.getJSONObject(i); // 准备好参数进行封装,这些参数都是页面固定,不可修改 String test = "*************."; String deptId = "**********"; job.put("code", code); job.put("batchId", batchId); job.put("deptId", deptId); job.put("startTime", startTime); job.put("test", test); job.put("serviceName", serviceName); String rid = map.get("*****_rid"); String sid = map.get("*******_sid"); String applyId = ""; String orgName = ""; if (StringUtils.isNotBlank(rid)) { if (rid.contains("@")) { String[] split = rid.split("@"); applyId = split[0]; } else { applyId = rid; } } // 根据服务调用方的名称 if (StringUtils.isNotBlank(applyId)) { OrganInfo byId = organInfoDao.findById(applyId); orgName = byId.getName(); } // 判断是否有调用方的介入,如果没有调用方,则不接受签名 String dataes = ""; if (StringUtils.isNotBlank(applyId) && StringUtils.isNotBlank(sid)) { // 调用ca接口 String result = getCaResult(caUrl, caAppCode, caAppPWD, caContainerName, caSignatureAlgorithm, batchId, job, caInDataType); String message = "调用签名接口失败"; if (result.equals(message)) { dataes = message; } else { // 开始解析返回值 String startSrt = "<SignData>"; String endSrt = "</SignData>"; dataes = subString(result, startSrt, endSrt); } } else { dataes = "无请求方,不接受签名"; } job.put("dataes", dataes); job.put("orgName", orgName); AcroFields form = mPdfStamper.getAcroFields();// 获取模板上的预订的参数 java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { String name = it.next().toString(); String param = job.getString(name); if(name.contains("time")){ String pp = job.getString(name); if(StringUtils.isNotBlank(pp)){ Date date = new Date(Long.valueOf(pp)); String format = ss.format(date); form.setField(name, format); }else{ form.setField(name, ""); } }else{ form.setField(name, param); } } mPdfStamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true mPdfStamper.close(); reader = new PdfReader(baos.toByteArray()); list.add(reader); bossList.add(baos); } // 创建新的pdf进行替换 // baos = new ByteArrayOutputStream();// 构建字节输出流 Document document = new Document(); // PdfWriter.getInstance(document, baos); PdfCopy copy = new PdfCopy(document, fos); document.open(); for (int k = 0; k < list.size(); k++) { PdfReader pdfReader = list.get(k); document.newPage(); // 获取每个PDF的byte 值 copy.addDocument(new PdfReader(bossList.get(k).toByteArray())); } copy.close(); // results = new String(baos.toByteArray(), "ISO-8859-1"); String header = request.getHeader("user-agent"); if (header.toLowerCase().indexOf("firefox") >= 0) { response.setContentType("application/pdf;"); response.setHeader("Content-disposition", "attachment;filename=" + new String(serviceTemplate.getFlieName().getBytes("utf-8"), "iso-8859-1")); } else { response.setContentType("application/pdf;charset=GB18030"); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(serviceTemplate.getFlieName(), "utf-8")); } ServletOutputStream outputStream = response.getOutputStream(); FileInputStream in = new FileInputStream(pdfCreatFile + flieName + "_" + format2 + "." + flieName1);// 文件的下载的路径 byte[] b = new byte[2048]; int len; try { while ((len = in.read(b)) > 0) outputStream.write(b, 0, len); in.close(); } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } // return results; }
注:这里调用其他系统的信息的接口就不进行编辑了,主要是接受封装PDF模板
发送请求
/** * 发送httpclient * * @param url * @param content * @param param * @return */ public String httpWithPost(String url, Map<String, String> content, String param) { String result = ""; if (StringUtils.isBlank(url)) { logger.info("URL为空"); result = "URL为空"; return null; } // spring rest工具类 RestTemplate rt = new RestTemplate(); MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); headers.add("content-type", "application/json;charset=UTF-8"); if (null != content) { for (Entry<String, String> entry : content.entrySet()) { headers.add(entry.getKey(), entry.getValue()); } } try { // 创建发送实体 HttpEntity<Object> requestEntity = new HttpEntity<Object>(param, headers); // 发送post请求 ResponseEntity<String> re = rt.exchange(url, HttpMethod.POST, requestEntity, String.class); // 打印返回http状态码 logger.info("response status code:" + re.getStatusCode()); // 打印http报文体内容 result = re.getBody(); } catch (Exception e) { result = e.getMessage(); } return result; }
自己的一点小心得如有问题,请联系我,谢谢