Activiti實現流程定義部署時自動裁切流程圖

版本聲明:Activiti 5.22.0 Activiti在流程部署(直接部署BPMN或者由模板轉換流程)時,生成的流程圖源碼裏是這樣肯定尺寸的: image.pngcanvas

意思是:按畫好的流程圖最右+十、最下+10的尺寸肯定圖片的尺寸,而左邊的空隙和上邊的空隙Activiti並無幫咱們自動去除,這樣會致使咱們在展現流程圖時很難作到將流程圖真正置於窗口的中央位置,對畫流程圖的節點位置頗有關係。咱們但願最後生成的流程圖應該是這個樣子的: image.pngide

這樣展現起來就美觀多了,好了,大體需求就是這樣:在流程部署時,自動根據流程圖的左側節點和上側節點邊緣實現裁切圖片; 思路:重寫DefaultProcessDiagramGenerator類的generateDiagram方法:spa

@Override
	public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List<String> highLightedActivities,
			List<String> highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
			ClassLoader customClassLoader, double scaleFactor, Color[] colors) {
		CustomProcessDiagramCanvas customProcessDiagramCanvas = generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, 
		        activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor,colors);
		BufferedImage bufferedImage = customProcessDiagramCanvas.generateBufferedImage(imageType);
		ByteArrayOutputStream bs = new ByteArrayOutputStream();  
		ImageOutputStream imOut;
		try {
			imOut = ImageIO.createImageOutputStream(bs);
			ImageIO.write(bufferedImage, "PNG", imOut);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		  
		InputStream is = new ByteArrayInputStream(bs.toByteArray());
		return is;
//		return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, 
//		        activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor,colors)
//				.generateImage(imageType);
	}

若是須要將這個裁切保留邊距設置爲可配置參數的話,還需重寫DefaultProcessDiagramCanvas類的generateBufferedImage方法:code

@Override
	public BufferedImage generateBufferedImage(String imageType) {
		if (closed) {
			throw new ActivitiImageException("ProcessDiagramGenerator already closed");
		}

		// Try to remove white space
		minX = (minX <= WorkflowConstants.PROCESS_PADDING) ? WorkflowConstants.PROCESS_PADDING : minX;
		minY = (minY <= WorkflowConstants.PROCESS_PADDING) ? WorkflowConstants.PROCESS_PADDING : minY;
		BufferedImage imageToSerialize = processDiagram;
		if (minX >= 0 && minY >= 0) {
			imageToSerialize = processDiagram.getSubimage(
					minX - WorkflowConstants.PROCESS_PADDING,
					minY - WorkflowConstants.PROCESS_PADDING, 
					canvasWidth - minX + WorkflowConstants.PROCESS_PADDING,
					canvasHeight - minY + WorkflowConstants.PROCESS_PADDING);
		}
		return imageToSerialize;
	}

這樣能夠隨時改變要生成的流程圖的保留邊距。blog

相關文章
相關標籤/搜索