mxgraph打印图片两种方案

项目的C/S架构的,项目中用到了mxgraph.但是一直没有去研究.


老大叫我研究研究并且做一个功能出来,就是打印生成出来的图片.看了一下mxgraph的Demo,发现其中有打印功能,并找到其代码:

public static class PrintAction extends AbstractAction
	{
		public void actionPerformed(ActionEvent e)
		{
			if (e.getSource() instanceof mxGraphComponent)
			{
				mxGraphComponent graphComponent = (mxGraphComponent) e
						.getSource();
				PrinterJob pj = PrinterJob.getPrinterJob();

				if (pj.printDialog())
				{
					PageFormat pf = graphComponent.getPageFormat();
					Paper paper = new Paper();
					double margin = 36;
					paper.setImageableArea(margin, margin, paper.getWidth()
							- margin * 2, paper.getHeight() - margin * 2);
					pf.setPaper(paper);
					pj.setPrintable(graphComponent, pf);

					try
					{
						pj.print();
					}
					catch (PrinterException e2)
					{
						System.out.println(e2);
					}
				}
			}
		}
	}

这个事mxgraph的Demo中自带的代码,传入它需要的参数:mxGraphComponent即可.

打印代码基本不用改,除非你有特殊的要求..


本来这件事情没什么好说的,但是我却碰到一个让我头痛欲裂的问题,

在将mxgraph图像绘制出来之前,打印选择框是可以弹出来的,但是图像绘制出来之后,再按打印的话,当程序跑到pj.printDialog()的时候,打印选择框弹不出来,

程序会直接无响应.无奈,上网搜索未果.只好采用折中的方法把此问题解决.

下面将我的代码贴出,希望能帮助遇到同样问题的朋友,如果大家有遇到这种问题并且解决,麻烦告诉小弟一声.

printAction = new Action() {
    		public void run(){
    			mxGraphComponent graphComponent = getGraphComponent();
				PrintDialog printDialog = new PrintDialog(Display.getCurrent().getActiveShell());
				PrinterData printerData = printDialog.open();
				if(printerData!=null){
					Printer printer = new Printer(printerData);
					if(printer.startJob("一级修方案")){
						if(printer.startPage()){
							//测算屏幕与打印机之间的屏幕分辨率
							Point screenDPI = Display.getCurrent().getDPI();
							Point printerDPI = printer.getDPI();
							int scaleFactor = printerDPI.x / screenDPI.x;
							Rectangle trim = printer.computeTrim(0, 0, 0, 0);
							GC gc = new GC(printer);
							BufferedImage bi = new BufferedImage((int)jgxd.getiWidth(), (int)jgxd.getiHeight(), BufferedImage.TYPE_INT_RGB);
							Graphics2D g2d = bi.createGraphics();
							g2d.setPaint(graphComponent.getViewport().getBackground());
							g2d.fillRect(0, 0, (int)jgxd.getiWidth(), (int)jgxd.getiHeight());
							graphComponent.getViewport().getView().paint(g2d);
							try {
								//写出图片到指定路径
								ImageIO.write(bi, "jpg", new File(writeFilePath));
								//读取图片并压缩图片
								ImageData newImageData = new ImageData(writeFilePath).scaledTo(1100, 680);
								ImageLoader imageLoader = new ImageLoader();
								imageLoader.data = new ImageData[] {newImageData};
								//输出修改分辨率之后的图片
								imageLoader.save(loadFilePath,SWT.IMAGE_JPEG);

								Image image = new Image(printer, new FileInputStream(loadFilePath));
								gc.drawImage(image, 0, 0, image.getImageData().width,
										image.getImageData().height, -trim.x, -trim.y, 
						                scaleFactor * image.getImageData().width, 
						                scaleFactor * image.getImageData().height);
								
								image.dispose();
								gc.dispose();
								printer.endPage();
							} catch (IOException e1) {
								e1.printStackTrace();
							}
						}
					}
					printer.endJob();
					printer.dispose();
				}
    		}
	};

大体思路是这样的,mxgraph中打印是采用的java.awt.print.PrinterJob类.

折中的方法就是用SWT中的org.eclipse.swt.printing.Printer。

将图片转换BufferedImage,将图片写到项目根目录,然后再读取图片信息并进行一些修改再打印出来。

别忘了要将打开的资源关闭掉喔。


你可能感兴趣的:(mxgraph打印图片两种方案)