根據客戶需求,現需要根據提供的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; }
自己的一點小心得如有問題,請聯系我,謝謝