kaka
2017-08-03 09:25:02
activit流程图轨迹追踪以及linux下字体问题
最近遇到流程图追踪的一些问题,记录如下:
(1).前端用ajax请求,后端以流的方式传送一直无法展示出带轨迹的流程图
(2).项目部署到linux上后,带中文字体的带轨迹的流程图无法展示出汉字。
1.流程轨迹追踪的关键代码如下
BASE64传值方式
public String getTracePicture(String processInstanceId,HttpServletResponse response) { // 获取历史流程实例 HistoricProcessInstance processInstance = factory.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId( processInstanceId ).singleResult(); // 获取流程图 BpmnModel bpmnModel = factory.getRepositoryService().getBpmnModel( processInstance.getProcessDefinitionId() ); processEngineConfiguration = processEngine.getProcessEngineConfiguration(); Context.setProcessEngineConfiguration( (ProcessEngineConfigurationImpl)processEngineConfiguration ); ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator(); ProcessDefinitionEntity definitionEntity = ( ProcessDefinitionEntity )factory.getRepositoryService().getProcessDefinition( processInstance.getProcessDefinitionId() ); List<HistoricActivityInstance> highLightedActivitList = factory.getHistoryService().createHistoricActivityInstanceQuery().processInstanceId( processInstanceId ).orderByTenantId().desc() .list(); // 高亮环节id集合 List<String> highLightedActivitis = new ArrayList<String>(); // 高亮线路id集合 List<String> highLightedFlows = getHighLightedFlows( definitionEntity, highLightedActivitList ); //获取当前节点高亮 if(highLightedActivitList != null && highLightedActivitList.size() > 0 ){ String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId(); highLightedActivitis.add( activityId ); } // 中文显示的是口口口,设置字体就好了 InputStream imageStream = diagramGenerator.generateDiagram( bpmnModel, "png", highLightedActivitis, highLightedFlows, "宋体", "宋体", null, 1.0 ); byte[] data = null; //读取图片字节数组 try{ data = new byte[imageStream.available()]; imageStream.read(data); imageStream.close(); } catch (IOException e){ e.printStackTrace(); } //对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }
上面是后端获取带轨迹流程图的核心方法,前端ajax请求,后端必须用Base64转码一次,然后将结果当做字符串发送给前端,才可以展示出来
前端请求方式如下:
流方式传输
public String getTracePicture(String processInstanceId,HttpServletResponse response) { // 获取历史流程实例 HistoricProcessInstance processInstance = factory.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId( processInstanceId ).singleResult(); // 获取流程图 BpmnModel bpmnModel = factory.getRepositoryService().getBpmnModel( processInstance.getProcessDefinitionId() ); processEngineConfiguration = processEngine.getProcessEngineConfiguration(); Context.setProcessEngineConfiguration( (ProcessEngineConfigurationImpl)processEngineConfiguration ); ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator(); ProcessDefinitionEntity definitionEntity = ( ProcessDefinitionEntity )factory.getRepositoryService().getProcessDefinition( processInstance.getProcessDefinitionId() ); List<HistoricActivityInstance> highLightedActivitList = factory.getHistoryService().createHistoricActivityInstanceQuery().processInstanceId( processInstanceId ).orderByTenantId().desc() .list(); // 高亮环节id集合 List<String> highLightedActivitis = new ArrayList<String>(); // 高亮线路id集合 List<String> highLightedFlows = getHighLightedFlows( definitionEntity, highLightedActivitList ); //获取所有节点高亮 /*for( HistoricActivityInstance tempActivity : highLightedActivitList ) { String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId(); tempActivity.getActivityId(); highLightedActivitis.add( activityId ); }*/ //获取当前节点高亮 if(highLightedActivitList != null && highLightedActivitList.size() > 0 ){ String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId(); highLightedActivitis.add( activityId ); } // 中文显示的是口口口,设置字体就好了 InputStream imageStream = diagramGenerator.generateDiagram( bpmnModel, "png", highLightedActivitis, highLightedFlows, "宋体", "宋体", null, 1.0 ); byte[] b = new byte[1024]; int len; try{ while( (len = imageStream.read(b,0,1024))!=-1){ response.getOutputStream().write(b,0,len); } }catch (IOException e){ e.printStackTrace(); } return "success"; }
前端请求方式:
2.流程追踪在linux服务器部署不展示中文字体
(1)将windows上的simsun.ttc字体拷贝一份
(2)进入linux系统的jre目录下的lib/fonts
(3)创建fallback目录:mkdir fallback
(4)将simsun.ttc字体拷贝到fallback目录下:cp simsun.ttc fallback/
(5)进入到fallback目录:cd fallback
(6)执行命令:mkfontscale
(7)执行命令:mkfontdir
(8)重启你的应用
评论