在实际的项目开发中,如果觉得Activiti生成的图片不美观?这个时候该怎么做呢?相信这也是很多开发人员所面临的问题。本文的讲解基于扩展DefaultProcessDiagramGenerator类。
其实现思路如下:
- 重写DefaultProcessDiagramCanvas类,该类中的initialize方法负责图片资源的加载。
- 重写DefaultProcessDiagramGenerator类,然后使用自定义的HMProcessDiagramCanvas类
重写DefaultProcessDiagramCanvas类,代码如下:
public class HMProcessDiagramCanvas extends DefaultProcessDiagramCanvas public void initialize(String imageType) { if ("png".equalsIgnoreCase(imageType)) { this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB); } else { this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB); } this.g = processDiagram.createGraphics(); if ("png".equalsIgnoreCase(imageType) == false) { this.g.setBackground(new Color(255, 255, 255, 0)); this.g.clearRect(0, 0, canvasWidth, canvasHeight); } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE); g.setFont(font); this.fontMetrics = g.getFontMetrics(); LABEL_FONT = new Font(labelFontName, Font.ITALIC, 10); ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE); try { USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource( "com/shareniu/chapter18/image/3.png", customClassLoader));
核心点在于重写initialize方法中的图片资源地址。
重写DefaultProcessDiagramCanvas类,代码如下:
public class HMProcessDiagramGenerator extends DefaultProcessDiagramGenerator protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas( BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { //将父类中的方法拷贝到这里即可。 return new HMProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType); }
测试:
@Test public void getBpmnModel() { BpmnModel bpmnModel = repositoryService.getBpmnModel("myProcess:1:4"); ListactiveActivityIds = new ArrayList<>(0); List highLightedFlows=new ArrayList<>(0); InputStream in = new HMProcessDiagramGenerator().generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows,"宋体","宋体","宋体",null, 1.0); System.out.println(in); FileOutputStream fw=null; try{ fw=new FileOutputStream("D:/zxn.jpg"); byte[] buf=new byte[1024]; int len=0; while((len=in.read(buf))!=-1){ //将byte数据读到最多buf长度的buf数组中 fw.write(buf,0,len); //将buf中 从0-len长度的数据写到文件中 } } catch(IOException e){ System.out.println("输入错误"); } }
转载请注明:分享牛 » Activiti自定义生成图片实现