项目的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,将图片写到项目根目录,然后再读取图片信息并进行一些修改再打印出来。
别忘了要将打开的资源关闭掉喔。