最近研究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; }