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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM