springboot集成activiti5.22.0,处理activiti流程图中文乱码

一、 pom.xml文件增加

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>5.22.0</version>
        </dependency>

二、 在springboot配置文件,在spring下面增加

     activiti:
        #如果表不存在,则Activiti会自动创建
        database-schema-update: true
        #自动部署验证设置:true-开启(默认)、false-关闭
        check-process-definitions: true
        process-definition-location-prefix: classpath:/processes/
    #    process-definition-location-suffixes:
    #      - **.bpmn
    #      - **.bpmn20.xml
        #保存历史数据级别设置为full最高级别,便于历史数据的追溯
        history-level: full

三、 使用7大接口

    /**
     * 在流程运行时对流程实例进行管理与控制。
     */
    @Autowired
    private RuntimeService runtimeService;

    /**
     * 对流程任务进行管理,例如任务提醒、任务完成和创建任务等
     */
    @Autowired
    private TaskService taskService;

    /**
     * 提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系
     */
    @Autowired
    private IdentityService identityService;

    /**
     * 提供一系列管理流程部署和流程定义的API。
     */
    @Autowired
    private RepositoryService repositoryService;

    /**
     *
     */
    @Autowired
    private ProcessEngine processEngine;

    /**
     * 对流程的历史数据进行操作,包括查询、删除这些历史数据
     */
    @Autowired
    private HistoryService historyService;
    /**
     * 提供对流程引擎进行管理和维护的服务
     */
    @Autowired
    private ManagementService managementService;

    /**
     * 表单服务
     */
    @Autowired
    private FormService formService;

    
    public void test() {
        //项目中每创建一个新用户,对应的要创建一个Activiti用户
        //两者的userId和userName一致
        User admin = identityService.newUser("admin");//
        admin.setLastName("管理员");
        identityService.saveUser(admin);

        //项目中每创建一个角色,对应的要创建一个Activiti用户组
        Group adminGroup = identityService.newGroup("admin");
        adminGroup.setName("系统角色");
        identityService.saveGroup(adminGroup);

        //用户与用户组关系绑定
        identityService.createMembership("admin", "admin");

        // 启动流程
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("myProcess");
        System.out.println("process id" + pi.getId());
        System.out.println("process name" + pi.getName());

        // 获取任务
        List<Task> list = taskService.createTaskQuery().list();
        System.out.println("任务个数" + list.size());
        if (list != null && list.size() > 0) {
            for (Task t : list) {
                System.out.print(t.getId() + ",");
                System.out.print(t.getName() + ",");
                System.out.print(t.getAssignee() + ",");
                System.out.println(t.getProcessInstanceId());
                taskService.complete(t.getId());
            }
        }
        list = taskService.createTaskQuery().list();
        System.out.println("任务个数" + list.size());
    }

异常处理

  • springboot启动类注解排除 activiti 的SecurityAutoConfiguration自动配置
@SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class)

关于图片中文乱码处理



import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.io.IOException;

/**
 * @author xizhuangchui
 * @Description
 * @date 2018-08-31 10:03
 */
@Component
public class ProcessEngineConfiguration implements ProcessEngineConfigurationConfigurer {

    @Override
    public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
        processEngineConfiguration.setActivityFontName("宋体");
        processEngineConfiguration.setLabelFontName("宋体");
        processEngineConfiguration.setAnnotationFontName("宋体");
        processEngineConfiguration.setDbIdentityUsed(false);
    }
}
<think>我们参考引用[1]和[2]的内容,特别是引用[1]中提到Activiti默认提供的流程图生成器以及字体问题,引用[2]中提到了ActivitiModeler的集成和前端代码集成。用户的问题是:如何在Activiti5.22.0中读取流程图并实现在前端渲染?分析:1.Activiti本身提供了生成流程图图片的功能,可以通过API获取流程图的图片流(通常是PNG格式)。2.但是,默认的流程图生成器(DefaultProcessDiagramGenerator)不支持中文字体,且高亮颜色固定,需要自定义。3.前端渲染通常是指将流程图的图片展示给用户,或者使用更高级的可视化库(如BPMN.js)来渲染BPMN2.0的XML。有两种主要方式:方式一:生成图片流,前端通过img标签展示。方式二:获取BPMN2.0的XML定义,使用前端BPMN渲染库(如bpmn-js)进行渲染。由于用户使用的是Activiti5.22.0,我们分别介绍两种方式。方式一:生成图片流(适用于静态流程图展示)步骤:1.通过RepositoryService获取流程定义。2.使用ProcessDiagramGenerator生成流程图图片流,并返回给前端。方式二:获取BPMNXML并使用前端库渲染(支持交互)步骤:1.通过RepositoryService获取BPMN2.0XML的流程定义文件。2.将XML字符串传递给前端,前端使用bpmn-js等库进行渲染。根据引用[2]和[5]中提到的ActivitiModeler,它实际上就是基于BPMN.js的,所以我们可以考虑集成ActivitiModeler来实现在线编辑和渲染。但是用户仅仅需要渲染,可以只使用bpmn-js的查看器。由于引用[4]提到camunda-modeler生成的XML和Activiti有区别,但这里我们使用的是Activiti引擎,因此直接使用Activiti生成的BPMNXML应该是没有问题的。具体步骤:方式一:后端生成图片1.后端代码(示例):获取流程定义ID(processDefinitionId),然后生成图片流。注意:需要解决字体问题,否则中文乱码。可以通过自定义ProcessDiagramGenerator来设置中文字体。方式二:后端提供BPMNXML,前端渲染1.后端通过RepositoryService获取BPMN2.0XML资源。如:InputStreamxmlStream=repositoryService.getResourceAsStream(deploymentId,resourceName);2.将XML流转换为字符串返回给前端。3.前端使用bpmn-js渲染。由于用户使用的是Activiti5.22.0,而bpmn-js是独立的前端库,与Activiti版本没有直接依赖,因此可以使用。我们推荐方式二,因为这样前端可以交互(如放大缩小、查看详细信息),且无需处理字体和颜色问题(前端库会处理)。但用户需要的是在Activiti5.22.0中实现,因此我们给出两种方式的代码示例。具体实现:方式一:生成图片(使用默认生成器,注意设置字体)```java//自定义流程图生成器,解决中文乱码和颜色问题(这里只解决中文,颜色修改需要自定义)publicclassChineseProcessDiagramGeneratorextendsDefaultProcessDiagramGenerator{publicChineseProcessDiagramGenerator(){super();}//重写生成方法,传入中文字体@OverridepublicInputStreamgenerateDiagram(BpmnModelbpmnModel,StringimageType,List<String>highLightedActivities,List<String>highLightedFlows,StringactivityFontName,StringlabelFontName,StringannotationFontName,ClassLoadercustomClassLoader,doublescaleFactor){//设置中文字体,例如:宋体StringfontName="宋体";returnsuper.generateDiagram(bpmnModel,imageType,highLightedActivities,highLightedFlows,fontName,fontName,fontName,customClassLoader,scaleFactor);}}```然后在后端生成图片的接口中:```javaProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();RepositoryServicerepositoryService=processEngine.getRepositoryService();StringprocessDefinitionId="xxxxxx";//获取流程定义ProcessDefinitionprocessDefinition=repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();BpmnModelbpmnModel=repositoryService.getBpmnModel(processDefinitionId);List<String>highLightedActivities=newArrayList<>();//需要高亮的节点List<String>highLightedFlows=newArrayList<>();//需要高亮的线//使用自定义的生成器ProcessDiagramGeneratorgenerator=newChineseProcessDiagramGenerator();InputStreamimageStream=generator.generateDiagram(bpmnModel,"png",highLightedActivities,highLightedFlows,"宋体","宋体","宋体",Thread.currentThread().getContextClassLoader(),1.0);//将imageStream写入response,前端通过img标签展示```方式二:获取BPMNXML,前端用bpmn-js渲染后端代码:```java@GetMapping(value="/getBpmnXml",produces=MediaType.APPLICATION_XML_VALUE)publicStringgetBpmnXml(StringprocessDefinitionId)throwsIOException{ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();RepositoryServicerepositoryService=processEngine.getRepositoryService();ProcessDefinitionprocessDefinition=repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();StringdeploymentId=processDefinition.getDeploymentId();StringresourceName=processDefinition.getResourceName();//如:myProcess.bpmn20.xmltry(InputStreamxmlStream=repositoryService.getResourceAsStream(deploymentId,resourceName)){returnIOUtils.toString(xmlStream,StandardCharsets.UTF_8);}}```前端代码(使用bpmn-js):1.引入bpmn-js2.创建查看器3.通过API获取XML并渲染```html<divid="canvas"></div><scriptsrc="https://unpkg.com/bpmn-js@8.7.3/dist/bpmn-navigated-viewer.development.js"></script><script>//从后端获取BPMNXMLasyncfunctiongetBpmnXml(processDefinitionId){constresponse=awaitfetch(`/getBpmnXml?processDefinitionId=${processDefinitionId}`);returnawaitresponse.text();}//渲染asyncfunctionrenderBpmn(){constxml=awaitgetBpmnXml('your-processDefinitionId');constviewer=newBpmnJS({container:'#canvas'});try{awaitviewer.importXML(xml);viewer.get('canvas').zoom('fit-viewport');}catch(err){console.error('渲染失败',err);}}renderBpmn();</script>```总结:方式一简单,但图片无法交互;方式二需要前端集成bpmn-js,但交互性好。根据需求选择。注意:在Activiti5.22.0中,使用方式二需要确保返回的BPMNXML是符合BPMN2.0规范的,Activiti生成的BPMNXML可以被bpmn-js正确解析。相关问题:1.如何自定义Activiti流程图生成器以改变高亮颜色?2.Activiti中使用bpmn-js渲染流程图有哪些注意事项?3.除了bpmn-js,还有哪些前端库可以渲染Activiti流程图?</think> ### Activiti 5.22.0 流程图读取与前端渲染实现方法 #### 核心实现步骤 1. **获取流程图定义文件** 通过 `RepositoryService` 获取流程图的 BPMN 2.0 XML 文件: ```java InputStream bpmnStream = repositoryService.getResourceAsStream( deploymentId, processDefinition.getResourceName() ); String bpmnXml = IOUtils.toString(bpmnStream, "UTF-8"); // Apache Commons IO ``` 2. **自定义流程图生成器**(解决中文乱码) 继承 `DefaultProcessDiagramGenerator`,覆盖字体设置(引用[1]): ```java public class CustomDiagramGenerator extends DefaultProcessDiagramGenerator { @Override protected void initialize(String activityFontName, String labelFontName) { super.initialize("SimSun", "SimSun"); // 使用中文字体 } } ``` 3. **生成流程图图像** 使用自定义生成器创建图片流: ```java ProcessDiagramGenerator generator = new CustomDiagramGenerator(); InputStream imageStream = generator.generateDiagram( bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), "SimSun", "SimSun", "SimSun" // 统一设置中文字体 ); ``` 4. **前端渲染方案** - **方案1:静态图片渲染** 将图片流转为 Base64 传输: ```java byte[] bytes = IOUtils.toByteArray(imageStream); String base64Img = "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes); ``` 前端直接使用 `<img src="<%= base64Img %>">` 显示 - **方案2:动态BPMN渲染** 结合 **Activiti Modeler**(引用[2][5]): ```javascript // 前端引入bpmn-js const viewer = new BpmnJS({ container: '#canvas' }); viewer.importXML(bpmnXml, (err) => { if (err) console.error('渲染失败', err); else viewer.get('canvas').zoom('fit-viewport'); }); ``` #### 关键配置 1. **字体依赖**(必须) 在服务器安装中文字体(如宋体),否则生成的图片仍会出现乱码[^1]。 2. **Activiti Modeler集成** Maven 依赖配置(引用[2]): ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>5.22.0</version> </dependency> ``` 3. **高亮渲染扩展** 自定义 `ProcessDiagramCanvas` 实现节点高亮(引用[1]): ```java public class CustomCanvas extends DefaultProcessDiagramCanvas { @Override public void drawHighLight(int x, int y, int width, int height) { super.drawHighLight(x, y, width, height); // 添加自定义高亮逻辑(如红色边框) g.setColor(Color.RED); g.drawRect(x, y, width, height); } } ``` #### 部署注意事项 - **跨平台兼容性** 测试不同操作系统的字体渲染差异 - **性能优化** 对生成图片做缓存处理,避免重复生成 - **安全控制** 校验用户权限,限制仅授权用户获取流程图 > **难点解决**:字体问题需同时满足两个条件 > ① 代码指定中文字体名(如 `"SimSun"`) > ② 服务器操作系统安装对应字体文件 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值