Activiti 5.16 流程图高亮追踪 中文乱码问题解决方法
最近研究activiti的高亮流程图,发现中文是乱码,为了让大家少走弯路共享出来。
本文包含三个主要技术点:
1、spring MVC架构下输出动态图片
2、获得activiti流程图的stream流
3、实现执行的任务高亮和中文无乱码
首先修改activiti.cfg.xml文件
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <!-- 配置数据源,和系统使用同一个数据源 --> <property name="dataSource" ref="dataSource" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <property name="transactionManager" ref="transactionManager" /> <!-- 下面这两行是关于中文乱码的,不知道为什么选择微软雅黑不生效,可能和tomcat容器下找不到字库有关系,切忌,修改这里后还要修改java代码 --> <property name="activityFontName" value="宋体" /> <property name="labelFontName" value="宋体" /> </bean>
然后是java代码
@RequestMapping(value = "/taskImg", method = RequestMethod.GET) @ResponseBody protected String taskImg( HttpServletResponse response, @RequestParam(value = "processInstanceId", required = true) String processInstanceId) throws IOException { //根据流程定义ID获得流程实例 ProcessInstance pi = this.engine.getRuntimeService() .createProcessInstanceQuery() .processInstanceId(processInstanceId).singleResult(); BpmnModel bpmnModel = this.engine.getRepositoryService().getBpmnModel( pi.getProcessDefinitionId()); // 得到正在执行的环节 List<String> activeIds = this.engine.getRuntimeService() .getActiveActivityIds(pi.getId()); DefaultProcessDiagramGenerator dpg = new DefaultProcessDiagramGenerator(); //获得流程图的流对象,这里显示的加载了字体 InputStream is = dpg.generateDiagram(bpmnModel, "png", activeIds, Collections.<String> emptyList(), this.engine .getProcessEngineConfiguration().getActivityFontName(), this.engine.getProcessEngineConfiguration().getLabelFontName(), null, 1.0); //输出流准备 int readSize = 0; byte[] data = new byte[8192]; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); //每次读出8192字节 while ((readSize = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, readSize); } is.close();//关闭原始流 //根据response的输出流,即客户端流 ServletOutputStream toClient = response.getOutputStream(); // 得到向客户端输出二进制数据的对象 toClient.write(buffer.toByteArray()); // 输出数据 toClient.flush(); //关闭输出流 toClient.close(); //图片流已经从response对象输出了,函数返回null就可以了 return null; }