需求
根据上传的bpmn文件生成流程图,目前网上的资料全都是先将流程文件部署之后,然后才可以生成流程图,但是我们项目的需求是先根据bpmn文件生成流程图,确认流程图没有问题之后才能部署(避免失误传错bpmn文件的情况)。
问题分析
网上没有资料只能自己想办法,既然流程定义部署之后可以生成流程图,并且部署之后在数据库ACT_GE_BYTEARRAY表中发现了流程图文件,那么说明在部署操作时肯定是执行了流程图的生成操作,然后保存到数据库中了,那么只要分析下Activiti源码,看下是在哪一步执行了流程图的操作就可以了。根据分析发现关键得一步在于将bpmn文件转换为BpmnModel,有了BpmnModel 就可以调用generateDiagram方法生成流程图了
解决方案
环境
SpringBoot版本 2.1.0.RELEASE
activiti-spring-boot-starter-basic版本 6.0.0
flowable-image-generator版本 6.0.0
代码
/**
* 根据流程定义文件生成流程图
* @param file 流程定义文件
* @param response
* @throws IOException
* @throws XMLStreamException
*/
public void createFlowImage(MultipartFile file, HttpServletResponse response) throws IOException, XMLStreamException {
InputStream inputStream = file.getInputStream();
// 创建转换对象
BpmnXMLConverter converter = new BpmnXMLConverter();
// 创建XMLStreamReader读取XML资源
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
// 把XML转换成BpmnModel对象
BpmnModel bpmnModel = converter.convertToBpmnModel(reader);
// 使用默认配置获得流程图表生成器,并生成追踪图片字符流
DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();
InputStream imageStream = processDiagramGenerator.generateDiagram(bpmnModel, "png", "宋体", "微软雅黑", "黑体", null, 2.0);
ServletOutputStream output = response.getOutputStream();
IOUtils.copy(imageStream , output);
}