项目的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图像绘制出来之前,打印选择框是可以弹出来的,但是图像绘制出来之后,再按打印的话,当程序跑到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(); } } };
折中的方法就是用SWT中的org.eclipse.swt.printing.Printer。
将图片转换BufferedImage,将图片写到项目根目录,然后再读取图片信息并进行一些修改再打印出来。
别忘了要将打开的资源关闭掉喔。