package com.gkhy.safePlatform.specialWork.util; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerFontProvider; import com.itextpdf.tool.xml.XMLWorkerHelper; import jodd.util.StringUtil; import org.springframework.core.io.ClassPathResource; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WorkExportPdfUtil { private String tempLocalFilePath; private String htmlStr; //定义字体 private String FONT = "/fonts/simsun.ttf"; //初始化 public void init(){ String fontPath = System.getProperty("user.dir")+ FONT; //判断字体是否存在 File file = new File(fontPath); if (!file.exists()) { //如果文件夹不存在就创建一个文件夹 File folder = new File(System.getProperty("user.dir")+"/fonts"); if(!folder.exists() && !folder.isDirectory()){ folder.mkdir(); } try { OutputStream outputStream = new FileOutputStream(fontPath); ClassPathResource classPathResource = new ClassPathResource(FONT); InputStream inputStream = classPathResource.getInputStream(); int b = 0; byte[] buffer = new byte[512]; while (b != -1) { b = inputStream.read(buffer); if (b != -1) { outputStream.write(buffer, 0, b);// 4.写到输出流(out)中 } } inputStream.close(); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } //构造方法 public WorkExportPdfUtil(){ } //设置模板路径 public void setTempLocalPath(String filePath){ this.tempLocalFilePath = filePath; } //生成完整html public void generateComPleteHtml(Map dataMap) throws IOException { InputStream inputStream = null; try{ //1.获取html ClassPathResource classPathResource = new ClassPathResource(this.tempLocalFilePath); inputStream = classPathResource.getInputStream(); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf8")); String line = null; while((line = bufferedReader.readLine()) != null) { // 文字换行显示 stringBuilder.append(System.getProperty("line.separator")); stringBuilder.append(line); } //2. 替换html中的关键字 htmlStr = stringBuilder.toString(); htmlStr = htmlStr.replaceAll("#conpanyName#", "新疆国泰新华化工有限责任公司"); //2.获取数据 //Map dataMap = data(); //基础数据 Map baseDataMap = (Map)dataMap.get("baseData"); if(baseDataMap != null){ //动火 if(baseDataMap.containsKey("applydepName")){ htmlStr = htmlStr.replaceAll("#applydepName#", baseDataMap.get("applydepName") != null ? baseDataMap.get("applydepName") : ""); } if(baseDataMap.containsKey("applyUname")){ htmlStr = htmlStr.replaceAll("#applyUname#", baseDataMap.get("applyUname") != null ? baseDataMap.get("applyUname") : ""); } if(baseDataMap.containsKey("workCode")){ htmlStr = htmlStr.replaceAll("#workCode#", baseDataMap.get("workCode") != null ? baseDataMap.get("workCode") : ""); } if(baseDataMap.containsKey("workLevel")){ htmlStr = htmlStr.replaceAll("#workLevel#", baseDataMap.get("workLevel") != null ? baseDataMap.get("workLevel") : ""); } if(baseDataMap.containsKey("workMethod")){ htmlStr = htmlStr.replaceAll("#workMethod#", baseDataMap.get("workMethod") != null ? baseDataMap.get("workMethod") : ""); } if(baseDataMap.containsKey("addressAndContent")){ htmlStr = htmlStr.replaceAll("#addressAndContent#", baseDataMap.get("addressAndContent") != null ? baseDataMap.get("addressAndContent") : ""); } if(baseDataMap.containsKey("workTime")){ htmlStr = htmlStr.replaceAll("#workTime#", baseDataMap.get("workTime") != null ? baseDataMap.get("workTime") : ""); } if(baseDataMap.containsKey("operatorNames")){ htmlStr = htmlStr.replaceAll("#operatorNames#", baseDataMap.get("operatorNames") != null ? baseDataMap.get("operatorNames") : ""); } if(baseDataMap.containsKey("otherSpeicialWork")){ htmlStr = htmlStr.replaceAll("#otherSpeicialWork#", baseDataMap.get("otherSpeicialWork") != null ? baseDataMap.get("otherSpeicialWork") : ""); } if(baseDataMap.containsKey("harm")){ htmlStr = htmlStr.replaceAll("#harm#", baseDataMap.get("harm") != null ? baseDataMap.get("harm") : ""); } //吊装 if(baseDataMap.containsKey("hoistingToolName")){ htmlStr = htmlStr.replaceAll("#hoistingToolName#", baseDataMap.get("hoistingToolName") != null ? baseDataMap.get("hoistingToolName") : ""); } if(baseDataMap.containsKey("workLocation")){ htmlStr = htmlStr.replaceAll("#workLocation#", baseDataMap.get("workLocation") != null ? baseDataMap.get("workLocation") : ""); } if(baseDataMap.containsKey("workContent")){ htmlStr = htmlStr.replaceAll("#workContent#", baseDataMap.get("workContent") != null ? baseDataMap.get("workContent") : ""); } if(baseDataMap.containsKey("weightMass")){ htmlStr = htmlStr.replaceAll("#weightMass#", baseDataMap.get("weightMass") != null ? baseDataMap.get("weightMass") : ""); } //受限空间 if(baseDataMap.containsKey("workDepName")){ htmlStr = htmlStr.replaceAll("#workDepName#", baseDataMap.get("workDepName") != null ? baseDataMap.get("workDepName") : ""); } if(baseDataMap.containsKey("csName")){ htmlStr = htmlStr.replaceAll("#csName#", baseDataMap.get("csName") != null ? baseDataMap.get("csName") : ""); } if(baseDataMap.containsKey("csOriginalName")){ htmlStr = htmlStr.replaceAll("#csOriginalName#", baseDataMap.get("csOriginalName") != null ? baseDataMap.get("csOriginalName") : ""); } //断路 if(baseDataMap.containsKey("involvedDeptNames")){ htmlStr = htmlStr.replaceAll("#involvedDeptNames#", baseDataMap.get("involvedDeptNames") != null ? baseDataMap.get("involvedDeptNames") : ""); } if(baseDataMap.containsKey("bcReason")){ htmlStr = htmlStr.replaceAll("#bcReason#", baseDataMap.get("bcReason") != null ? baseDataMap.get("bcReason") : ""); } if(baseDataMap.containsKey("bcExplain")){ htmlStr = htmlStr.replaceAll("#bcExplain#", baseDataMap.get("bcExplain") != null ? baseDataMap.get("bcExplain") : ""); } //高处作业 if(baseDataMap.containsKey("workHight")){ htmlStr = htmlStr.replaceAll("#workHight#", baseDataMap.get("workHight") != null ? baseDataMap.get("workHight") : ""); } if(baseDataMap.containsKey("workType")){ htmlStr = htmlStr.replaceAll("#workType#", baseDataMap.get("workType") != null ? baseDataMap.get("workType") : ""); } //临时用电 if(baseDataMap.containsKey("powerAccessPoint")){ htmlStr = htmlStr.replaceAll("#powerAccessPoint#", baseDataMap.get("powerAccessPoint") != null ? baseDataMap.get("powerAccessPoint") : ""); } if(baseDataMap.containsKey("workVoltage")){ htmlStr = htmlStr.replaceAll("#workVoltage#", baseDataMap.get("workVoltage") != null ? baseDataMap.get("workVoltage") : ""); } if(baseDataMap.containsKey("equipmentAndPower")){ htmlStr = htmlStr.replaceAll("#equipmentAndPower#", baseDataMap.get("equipmentAndPower") != null ? baseDataMap.get("equipmentAndPower") : ""); } //盲板抽堵 if(baseDataMap.containsKey("mainMedia")){ htmlStr = htmlStr.replaceAll("#mainMedia#", baseDataMap.get("mainMedia") != null ? baseDataMap.get("mainMedia") : ""); } if(baseDataMap.containsKey("temperature")){ htmlStr = htmlStr.replaceAll("#temperature#", baseDataMap.get("temperature") != null ? baseDataMap.get("temperature") : ""); } if(baseDataMap.containsKey("pressure")){ htmlStr = htmlStr.replaceAll("#pressure#", baseDataMap.get("pressure") != null ? baseDataMap.get("pressure") : ""); } if(baseDataMap.containsKey("bpMq")){ htmlStr = htmlStr.replaceAll("#bpMq#", baseDataMap.get("bpMq") != null ? baseDataMap.get("bpMq") : ""); } if(baseDataMap.containsKey("bpSp")){ htmlStr = htmlStr.replaceAll("#bpSp#", baseDataMap.get("bpSp") != null ? baseDataMap.get("bpSp") : ""); } if(baseDataMap.containsKey("bpCode")){ htmlStr = htmlStr.replaceAll("#bpCode#", baseDataMap.get("bpCode") != null ? baseDataMap.get("bpCode") : ""); } if(baseDataMap.containsKey("workScm")){ htmlStr = htmlStr.replaceAll("#workScm#", baseDataMap.get("workScm") != null ? baseDataMap.get("workScm") : ""); } } //分析数据 String anasiList = ""; if(dataMap.containsKey("analysis") && null != dataMap.get("analysis")){ List> anList = (List>) dataMap.get("analysis"); for (Map map : anList){ if(map.containsKey("anaStand")){ anasiList += "\n"+ " \t\t\t\t\t\n" + " "+ (map.containsKey("anaAddress") ? map.get("anaAddress") : "") +"\n" + " "+ (map.containsKey("anaItemName") ? map.get("anaItemName") :"")+"\n" + " "+ (map.containsKey("anaStand") ? map.get("anaStand") : "") +"\n" + " "+ (map.containsKey("anaData") ? map.get("anaData") : "") +"\n" + " "+ (map.containsKey("anaResult") ? map.get("anaResult") : "") +"\n" + " "+ (map.containsKey("anaUname") ? map.get("anaUname") : "") +"\n" + " "+ (map.containsKey("anaTime") ? map.get("anaTime") : "") +"\n" + " "; }else {//区分是否含标准 anasiList += "\n"+ " \t\t\t\t\t\n" + " "+ (map.containsKey("anaAddress") ? map.get("anaAddress") : "") +"\n" + " "+ (map.containsKey("anaItemName") ? map.get("anaItemName") :"")+"\n" + " "+ (map.containsKey("anaData") ? map.get("anaData") : "") +"\n" + " "+ (map.containsKey("anaResult") ? map.get("anaResult") : "") +"\n" + " "+ (map.containsKey("anaUname") ? map.get("anaUname") : "") +"\n" + " "+ (map.containsKey("anaTime") ? map.get("anaTime") : "") +"\n" + " "; } } } //安全措施 String measureList = ""; if(dataMap.containsKey("measure") && null != dataMap.get("measure")){ List> meList = (List>) dataMap.get("measure"); for(Map map : meList){ measureList += "\n"+ " \t\t\t\n" + " "+ (map.containsKey("index") ? map.get("index") : "") +"\n" + " "+ (map.containsKey("measure") ? map.get("measure") : "") +"\n" + " "+ (map.containsKey("mResult") ? map.get("mResult") : "") +"\n" + " "+ (map.containsKey("mUname") ? map.get("mUname") : "") +"\n" + " "; } } //审批层数据 String approvalList = ""; if(dataMap.containsKey("approval") && null != dataMap.get("approval")){ List> apList = (List>) dataMap.get("approval"); for(Map map : apList){ approvalList += "\n"+ "\n" + " "+ (map.containsKey("apprStepName") ? map.get("apprStepName") : "") +"\n" + " "+ (map.containsKey("apprOpinion") ? map.get("apprOpinion") : "") +"\n" + " "+ (map.containsKey("apprUname") ? map.get("apprUname") : "") +"\n" + " "+ (map.containsKey("apResult") ? map.get("apResult") : "") +"\n" + " "+ (map.containsKey("apprSign") ? map.get("apprSign") : "") +"\n" + " "+ (map.containsKey("apprTime") ? map.get("apprTime") : "") +"\n" + " "; } } // 4. 将list中的数据替换到html中 htmlStr = htmlStr.replaceAll("#anasiList#", anasiList); htmlStr = htmlStr.replaceAll("#measureList#", measureList); htmlStr = htmlStr.replaceAll("#approvalList#", approvalList); }catch (Exception e){ e.printStackTrace(); System.out.println("生成html文档失败!"); }finally { inputStream.close(); } } //转换pdf public void htmlToPdf(HttpServletResponse response,String text) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream()); PdfBuilderUtils builderUtils = new PdfBuilderUtils(); builderUtils.setFooderText(text); builderUtils.setFontPath(FONT); writer.setPageEvent(builderUtils); document.open(); XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(this.htmlStr.getBytes(StandardCharsets.UTF_8)), null, Charset.forName("UTF-8"), fontImp); document.close(); } public void generate(HttpServletResponse response, Map dataMap) throws IOException, DocumentException { String text = dataMap.containsKey("workCode") ? (String)dataMap.get("workCode") : ""; WorkExportPdfUtil workExportPdfUtil = new WorkExportPdfUtil(); workExportPdfUtil.init(); workExportPdfUtil.setTempLocalPath((String)dataMap.get("filePath")); workExportPdfUtil.generateComPleteHtml(dataMap); workExportPdfUtil.htmlToPdf(response,text); String fileName = (dataMap.containsKey("fileName") ? (String)dataMap.get("fileName") : "") + (dataMap.containsKey("workCode") ? (String)dataMap.get("workCode") :""); if(StringUtil.isBlank(fileName)){ fileName = "特殊作业证"; } fileName = URLEncoder.encode(fileName,"UTF-8"); response.setContentType("application/pdf;charset=UTF-8"); response.addHeader("Content-Disposition","attachment;filename="+fileName+".pdf"); } public static void main(String[] args) throws DocumentException, IOException { /* WorkExportPdfUtil222 workExportPdfUtil = new WorkExportPdfUtil222(); workExportPdfUtil.setTempLocalPath("/templates/workhot.html"); workExportPdfUtil.generateComPleteHtml(); workExportPdfUtil.htmlToPdf();*/ } //创建模拟数据 public Map data(){ //基础数据 Map baseDataMap=new HashMap<>(); baseDataMap.put("applydepName","测试名称"); baseDataMap.put("applyUname","张三"); baseDataMap.put("workCode","GTXH-100001"); baseDataMap.put("workLevel","一级动火作业"); baseDataMap.put("workMethod","作业方式"); baseDataMap.put("addressAndContent","江苏苏州市" + " " + "动火作业"); baseDataMap.put("workTime","自" + "2022-10-23 12:30:00" + "至" + "2022-10-23 16:30:00" + "止"); baseDataMap.put("operatorNames","李四,王五"); baseDataMap.put("otherSpeicialWork","吊装作业"); baseDataMap.put("harm","危害辨识"); //分析数据 List> anList = new ArrayList<>(); for (int i = 0;i < 4;i++){ Map map = new HashMap<>(); map.put("anaAddress", "地址" + i); map.put("anaItemName", "名称" + i); map.put("anaData", 50 + i +"%"); map.put("anaResult", "通过"); map.put("anaUname", "张三"+i); map.put("anaTime", "2022年10月23日 13时00分00秒"); anList.add(map); } //安全措施数据 List> meList = new ArrayList<>(); for (int j = 0;j < 18;j++){ Map map = new HashMap<>(); map.put("index", String.valueOf(j)); map.put("measure", "测试测试测试测试测试测试测试测试测试测试"); map.put("mResult", "通过"); map.put("mUname", "张三"); meList.add(map); } //审批层数据 List> apList = new ArrayList<>(); for (int k = 0;k < 60;k++) { Map map = new HashMap<>(); map.put("apprStepName", "第"+k+"层级别"); map.put("apprOpinion", "意见意见意见意见意见意见意见意见意见意见意见意见"); map.put("apprUname", "张三"); map.put("apResult", "审批通过"); map.put("apprSign", "张三"); map.put("apprTime","2022年10月23日 13时00分00秒"); apList.add(map); } // 模板文件输入输出地址 String filePath = "/pdfHtmlTemplate/workhot.html"; //综合数据 Map dataMap = new HashMap<>(); dataMap.put("baseData",baseDataMap); dataMap.put("approval",apList); dataMap.put("measure",meList); dataMap.put("analysis",anList); dataMap.put("workCode","GTXH-100001"); dataMap.put("filePath",filePath); return dataMap; } }