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

 

posted @ 2015-03-24 15:00  程序员老刘  阅读(3137)  评论(1编辑  收藏  举报