最近在弄JAVA打印时,找来找去没找到一个好的解决方案.我是要打印canvas界面上的东西,都是由Graphics画出来的,想要有彩色,想要能通过打印对话框来设置纸型大小和纵横向
现在我了解的几种打印方案:
方案1:
Toolkit toolkit = Toolkit.getDefaultToolkit();
java.awt.PrintJob printjob = toolkit.getPrintJob(frame, "", null);
        if(printjob != null)
        {
            g = printjob.getGraphics();
            dimension = printjob.getPageDimension();
            w = dimension.width;
            h = dimension.height;
        }
drawImg(g,w,h);
优:
   这种方法来打印时,最大的方便就是可以得到打印对话框里的设置,在打印对话框里设置的纸的宽度可以在JAVA程序中得到,这样我打印的时候就可以根据纸宽来设置我打印的图片drawImg(g,w,h),横纵打印都可以直接反应在打印输出上.
缺点:
   不能实现彩色打印,在我的应用中没办法采用.第2种方案:
PrinterJob pj=PrinterJob.getPrinterJob(); 
if (pj != null) {
    pj.setPrintable(new Printable(){
public int print(Graphics g,PageFormat pf,int page) throws PrinterException{ 
    if(page>=1){
            return Printable.NO_SUCH_PAGE; 
    } 
    drawImg(g,(int)pf.getWidth(),(int)pf.getHeight()); 
return Printable.PAGE_EXISTS; 

}); 

if(pj.printDialog()){ 
    try{
pj.print(); 
}catch(PrinterException exception){}
}
缺点:
用这种方案,打印对话框里对纸张大小的设置,纸张宽纵的设置完全不起作用.我在drawImg(g,w,h)的时候,这里完全得不到正确的由打印对话框设置的纸张大小,程序里得到的纸型都是A4,我可以在JAVA程序里自己设置纸的大小,但这个设置跟打印对话框的设置脱节3种方案:
PrintService svc = PrintServiceLookup.lookupDefaultPrintService();
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
PrintService selection = ServiceUI.printDialog(null, 100, 100, services, svc, null, attrs); 
  
DocPrintJob job = service.createPrintJob();
DocFlavor flavor = DocFlavor.URL.GIF;
Doc doc = new SimpleDoc(url, flavor, null);
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(new Copies(2));
job.print(doc, attrs); 
用这种方案来打印,是打印文档的,不能把我的canvas内容用drawImg的方法打印出来,而且,它弹出来的打印对话框也不能调整纸型.也不行.
不知道还有别的JAVA打印方法,现在的这些我都没法满足我的要求,请问有没有好的方法来实现.
(我的要求关键是两点:1是能有彩打,1,1的方案就没有彩打,2是能从打印对话框里获取到纸型,能让客户设置纸型及模打纵打)非常感谢!

解决方案 »

  1.   

    congliu老兄你好请问如果用PrinterJob.printDialog的话,那应该如何从打印对话框里获取纸张的类型大小了?
      

  2.   

    楼主这么做,是不聪明。
    我们在开发软件的时候,碰到打印的,我基本上不去碰这些东西了。
    我会按照格式导入到Excel表格,由Excel去打印。
    为什么不利用Excel的打印功能而自己开发,因为Java控制打印很烦而且效果不好。
    我觉得楼主可以考虑一下这个办法。
      

  3.   

    dogcai(dogcai) 
    哥们,我是打印图形啊,图形还要根据纸的大小还调整输出大小的啊.
      

  4.   

    打印图形?也许LZ该找位对JAVA(2d,3d,image io等技术)图形编程有了解的朋友问下
    关注
      

  5.   


    Java 在打印方面做得还不够强。楼主可以试着将要打印的东西转换成图片或者是pdf档案,然后通过其他软件来打印。我们现在是转成pdf后打印,省去了很多麻烦,java产生pdf文件倒是很简单。
      

  6.   

    我主要是做APPLET的,本来下载这个APPLET包就比较慢了,再用第三方控制来打印就更麻烦了.生成的东西直接交给IE来打的话,IE的打印功能也是很差的,郁闷
      

  7.   

    在IE上打印? 又能打印出很好的效果? 然后还要通过Applet去控制打印机? 有些难度1. 一般的做法是使用画布, 在上面画好了直接输出打印机
    2. Applet控制打印机一般是被禁止的吧, 是否你的签名不正确, 所以applet无法访问本地资源
    3. 实在不行还是建议用PDF, IE中打开一个PDF文件, 这样打印你能省去不少功夫
      

  8.   

    多谢楼上老兄.我做的东西是应用于局域网内的,APPLET都是做了数字签名的,对本地资源的访问不存在问题其实是个GIS应用了,所以在应用中要根据客户的需求打印不同大小图形输出,而我的想法得到纸的大小是从打印机处直接获取参数的,在打印对话框中读到纸张大小后,就可以在我的画布中根据纸大小画不同大小的图来打印了.用JAVA1.1那个打印的方法就可以读到打印机的纸张大小了,可惜它的打印没有彩色
    用JAVA1.2的打印方法打印是有了彩色了,却读不到打印机中纸的大小了
    其实这两者结合起来就可以达到我的要求了