linux 环境 ruoyi springboot + Activiti6.0 项目上线后,流程图查看时有乱码问题 字体方块显示

本地开发环境一直没有出现下面的情况,放到linux CentOS上就出现了文字方块的问题,网上搜了下,原因是linux的java环境没有找到activiti中设置的对应字体导致的,好,找到代码中设置的字体是什么,然后找到相应的字体文件放到linux的java字体库中,重启项目就好了,具体步骤如下:

 上线后乱码

原流程

1. 查看代码中activiti设置的字体

每个人的项目不同,字体配置方式也不同,有的配在配置文件中,有的在代码里指定,请根据配置的字体灵活运用。

这里是自己的代码,ProcessDiagramGenerator的generateDiagram方法配置字体时,设置了字体为「宋体」,java环境默认是不带宋体这个字体文件的,所以要找一个宋体字体文件放到linux的java环境中。

获取流程图像,已执行节点和流程线高亮显示

下面代码无意义,仅供参考。

/**
     * 获取流程图像,已执行节点和流程线高亮显示
     */
    public void getActivitiProccessImage(String pProcessInstanceId, HttpServletResponse response) {
        //logger.info("[开始]-获取流程图图像");
        try {
            //  获取历史流程实例
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                    .processInstanceId(pProcessInstanceId).singleResult();

            if (historicProcessInstance == null) {
                //throw new BusinessException("获取流程实例ID[" + pProcessInstanceId + "]对应的历史流程实例失败!");
            }
            else {
                // 获取流程定义
                ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                        .getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId());

                // 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序
                List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
                        .processInstanceId(pProcessInstanceId).orderByHistoricActivityInstanceId().asc().list();

                // 已执行的节点ID集合
                List<String> executedActivityIdList = new ArrayList<String>();
                int index = 1;
                //logger.info("获取已经执行的节点ID");
                for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {
                    executedActivityIdList.add(activityInstance.getActivityId());

                    //logger.info("第[" + index + "]个已执行节点=" + activityInstance.getActivityId() + " : " +activityInstance.getActivityName());
                    index++;
                }

                BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());

                // 已执行的线集合
                List<String> flowIds = new ArrayList<String>();
                // 获取流程走过的线 (getHighLightedFlows是下面的方法)
                flowIds = getHighLightedFlows(bpmnModel,processDefinition, historicActivityInstanceList);

                // 获取流程图图像字符流
                ProcessDiagramGenerator pec = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();
                //配置字体
                InputStream imageStream = pec.generateDiagram(bpmnModel, "png", executedActivityIdList,
                        flowIds,"宋体","宋体","宋体",null,2.0);

                response.setContentType("image/png");
                OutputStream os = response.getOutputStream();
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = imageStream.read(buffer, 0, 8192)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                imageStream.close();
            }
            //logger.info("[完成]-获取流程图图像");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            //logger.error("【异常】-获取流程图失败!" + e.getMessage());
            //throw new BusinessException("获取流程图失败!" + e.getMessage());
        }
    }

2. 通过一些方式找到对应的字体文件,并放到linux的java文字库中

如果本地是Windows系统,直接到C:\Windows\Fonts下找到 SIMSUN.TTC 文件(右键-查看-列表详情方式比较容易找到),上传到linux的 java字体库中(具体目录参考下文)

或者网络下载这个文件 链接:https://pan.baidu.com/s/1EKGUCRPQjh5ygJW204Gd5g  密码:zejd

查找linux下java的安装目录

whereis java

jdk的根目录一直顺着往下找到/jdk***/jre/lib/fonts/目录,里边是java现有的文字库,把SIMSUN.TTC 放到该目录下即可

3. 重启项目

    放在tomcat里,就重启tomcat;直接裸跑的,就重新运行jar;解决。

发布了99 篇原创文章 · 获赞 55 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/torpidcat/article/details/104670565