LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2970|回复: 12

哪位大侠会开发打印程序

[复制链接]
发表于 2006-2-3 10:18:10 | 显示全部楼层 |阅读模式
我用java开发的、在windows 下做的打印程序能正常使用,到了linux下根本不能用,哪位
大侠提示一下,我该怎么办?
发表于 2006-2-4 23:20:54 | 显示全部楼层
linux下的打印需要另行配置jdk,具体怎么不能用?乱码?空白?无反应?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-21 11:21:07 | 显示全部楼层
truncatei大侠:
我的java打印程序在linux无反应。在eclipse下调试出错,出错信息是:
Exception occurred during event dispatching:
java.lang.IndexOutOfBoundsException
        at java.io.BufferedInputStream.read(BufferedInputStream.java:306)
        at sun.net.www.MeteredStream.read(MeteredStream.java:116)
        at java.io.FilterInputStream.read(FilterInputStream.java:111)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2139)
        at java.io.DataInputStream.read(DataInputStream.java:134)
        at sun.print.IPPPrintService.readIPPResponse(IPPPrintService.java:1589)
        at sun.print.IPPPrintService.opGetAttributes(IPPPrintService.java:1436)
        at sun.print.IPPPrintService.initAttributes(IPPPrintService.java:333)
        at sun.print.IPPPrintService.getSupportedDocFlavors(IPPPrintService.java:707)
        at sun.print.IPPPrintService.isDocFlavorSupported(IPPPrintService.java:783)
        at sun.print.RasterPrinterJob.getPrintService(RasterPrinterJob.java:428)
        at sun.print.RasterPrinterJob.defaultPage(RasterPrinterJob.java:1420)
        at java.awt.print.PrinterJob.defaultPage(PrinterJob.java:361)
        at MyPrint.<init>(MyPrint.java:23)
        at ScoreInputDialog1.print(ScoreInputDialog1.java:415)
        at ScoreInputDialog1.actionPerformed(ScoreInputDialog1.java:555)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1774)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
        at java.awt.Dialog$1.run(Dialog.java:515)
        at java.awt.Dialog.show(Dialog.java:536)
        at java.awt.Component.show(Component.java:1300)
        at java.awt.Component.setVisible(Component.java:1253)
        at ScoreInputDialog1.<init>(ScoreInputDialog1.java:208)
        at MyMenu.scoreInput(MyMenu.java:976)
        at MyMenu.actionPerformed(MyMenu.java:1175)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1000)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1041)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1774)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

恳请大侠帮助!先谢了!
回复 支持 反对

使用道具 举报

发表于 2006-2-21 14:45:43 | 显示全部楼层
其实我也没弄过打印程序,不过
等我调试一下,先弄个东西试试,看样子你的代码部分有一些缺陷未检查异常
另外,你的打印机安装好了吗?
回复 支持 反对

使用道具 举报

发表于 2006-2-21 15:13:13 | 显示全部楼层
你自己尝试一下吧,我的控制台输出是:
Unix Printer : HPDesJet9800
并且打印出了abc
我的打印机是安装的windows网络上共享的打印机

如果我的分析没错,你用类似
PrintService[] services = PrintServiceLookup.lookupPrintServices(myFormat, aset);
DocPrintJob job = services[0].createPrintJob();
这样的代码,未检查服务是否存在

以下是测试程序,注意其中判断打印服务是否存在的代码
==================

  1. import java.io.ByteArrayInputStream;
  2. import java.io.InputStream;

  3. import javax.print.Doc;
  4. import javax.print.DocFlavor;
  5. import javax.print.DocPrintJob;
  6. import javax.print.PrintException;
  7. import javax.print.PrintService;
  8. import javax.print.PrintServiceLookup;
  9. import javax.print.SimpleDoc;
  10. import javax.print.attribute.HashPrintRequestAttributeSet;
  11. import javax.print.attribute.PrintRequestAttributeSet;
  12. import javax.print.attribute.standard.Copies;
  13. import javax.print.attribute.standard.MediaSize;
  14. import javax.print.attribute.standard.Sides;

  15. public class PrintTest {

  16.         /**
  17.          * @param args
  18.          */
  19.         public static void main(String[] args) throws Exception {
  20.                 //                 Input the file
  21.                 InputStream textstream = null;
  22.                 textstream = new ByteArrayInputStream(new byte[]{'a', 'b', 'c'});
  23.                 //                 Set the document type
  24.                 DocFlavor myFormat = DocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCII;
  25.                 //                 Create a Doc
  26.                 Doc myDoc = new SimpleDoc(textstream, myFormat, null);
  27.                 //                 Build a set of attributes
  28.                 PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
  29.                 aset.add(new Copies(1));
  30.                 //aset.add(MediaSize.ISO.A4);
  31.                 aset.add(Sides.ONE_SIDED);
  32.                 //                 discover the printers that can print the format according to the
  33.                 //                 instructions in the attribute set
  34.                 PrintService services = PrintServiceLookup.lookupDefaultPrintService(
  35.                                 );
  36.                
  37.                 if (services != null) {
  38.                         System.out.println(services);
  39.                         DocPrintJob job = services.createPrintJob();
  40.                         try {
  41.                                 job.print(myDoc, aset);
  42.                         } catch (PrintException pe) {
  43.                                 System.out.println(pe.getMessage());
  44.                         }
  45.                 }
  46.         }

  47. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-21 22:24:52 | 显示全部楼层
看来,我要叫你大师了,真是很感谢你。只是最近较忙,等抽出功夫才能试你的代码,先将我的代码给你:

import javax.swing.*;

import java.awt.*;

//import javax.swing.text.*;

import java.awt.print.*;

//import javax.print.attribute.*;



public class MyPrint  {

   private String prnStr="";

   private String []arrStr;

   //private PrinterJob job;

   private PageFormat pf;

   private Font font;

   private int line=0,y=0;

   private int rowNum;

   int totalPageNum=0;

//#####################   

   public  MyPrint(String str,PageFormat pf0,Font fnt){

             prnStr=str;

             arrStr=prnStr.split("\n");

             rowNum=arrStr.length;

             font=fnt;

             PrinterJob job=PrinterJob.getPrinterJob();

             if(pf0==null)pf=job.defaultPage();

             else pf=pf0;

             int size=font.getSize()+2;//that is very important

             int height=(int)pf.getImageableHeight();

      //line=arrStr.length;

      totalPageNum=size*rowNum/height;

      if(totalPageNum==0)totalPageNum=1;

      else if(totalPageNum%height!=0)totalPageNum++;

             int linePerPage=height/size;//,curSize=0;

   

           JOptionPane.showMessageDialog(null,String.valueOf(linePerPage));

             

           Book bk = new Book();

    bk.append(new Painter(arrStr,font,linePerPage,totalPageNum),

                 pf,totalPageNum);

    job.setPageable(bk);

    //job.setPrintable(new Painter(arrStr,font,linePerPage),pf);

           if(job.printDialog())

     try { job.print(); }

     catch (Exception e) {

              JOptionPane.showMessageDialog(null,e.toString());}

  }//end MyPrint

}//end class MyPrint

//###############

class Painter implements Printable{

        String []arrStr;

        Font   fnt;

        int size,i=0;

        int rowNum;

        int linePerPage,totalPageNum;

        String start="0";

        public Painter(String arr[],Font f,int linePerPage,

                       int totalPage){

                arrStr=arr;fnt=f;

                size=fnt.getSize();

                this.linePerPage=linePerPage;

                rowNum=arrStr.length;

                totalPageNum=totalPage;

                }

//##################

public int print(Graphics g, PageFormat pf, int pageIndex)

                  throws PrinterException {

                  if(pageIndex>=totalPageNum)

                             return        Printable.NO_SUCH_PAGE;

                  int y0=(int)pf.getImageableY();

                  int x0=(int)pf.getImageableX();

                  int y=0;

              int height=(int)pf.getImageableHeight();

       g.translate(x0,y0);

             g.setFont(fnt);

  int i=pageIndex*linePerPage;

  while(i<(pageIndex+1)*linePerPage){

          if(i>=rowNum)break;

          g.drawString(arrStr,x0,y+y0);

    y=y+size;

    i++;

  }//end while

     return Printable.PAGE_EXISTS;

}//end print

//###################

}//end class Painter
回复 支持 反对

使用道具 举报

发表于 2006-2-22 12:49:44 | 显示全部楼层
我在MyPrint里面加了这个方法试了一下,没有问题

  1. public static void main(String[] args) {
  2.                 MyPrint p = new MyPrint("str to print", new PageFormat(), new Font("Arial", Font.PLAIN, 12));       
  3. }
复制代码




现在的问题是异常出现在哪一行?就是堆栈信息里的这个信息:
at MyPrint.<init>(MyPrint.java:23)
我不知道我的行号是否正确,我觉得可能是
PrinterJob job=PrinterJob.getPrinterJob();
返回了null,未经检查,就调用job上的方法
if(pf0==null)pf=job.defaultPage();

还有一个问题就是打印机在其它程序中能不能使用

附件中最后一个任务是刚刚发送的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-26 07:13:40 | 显示全部楼层
我运行你的代码,出现如下错误,我的系统是红旗的ws 5.0,打印机是epson的lq300(针打)

IPP Printer : lq300
Exception in thread "main" java.lang.IndexOutOfBoundsException
        at java.io.BufferedInputStream.read(BufferedInputStream.java:306)
        at sun.net.www.MeteredStream.read(MeteredStream.java:116)
        at java.io.FilterInputStream.read(FilterInputStream.java:111)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2139)
        at java.io.DataInputStream.read(DataInputStream.java:134)
        at sun.print.IPPPrintService.readIPPResponse(IPPPrintService.java:1589)
        at sun.print.IPPPrintService.opGetAttributes(IPPPrintService.java:1436)
        at sun.print.IPPPrintService.initAttributes(IPPPrintService.java:333)
        at sun.print.IPPPrintService.getAttribute(IPPPrintService.java:940)
        at sun.print.UnixPrintJob.print(UnixPrintJob.java:292)
        at PrintTest.main(PrintTest.java:45)
回复 支持 反对

使用道具 举报

发表于 2006-2-26 10:44:27 | 显示全部楼层
我的输出是 Unix Printer : HPDesJet9800
而你的是IPP Printer : lq300
我不是很了解各种不同的打印服务器,我测试时用的打印服务器是CUPS,如果你的不是,换成CUPS试试
如果你用的是1.4的jdk,换一个新版的试试,我用的是1.5.0_06。

异常是从 sun.print.UnixPrintJob.print() 这个方法的内部或者它的调用链中抛出的
针打我没弄过,不过按照jdk的打印抽象,应该都转换为页式的。

如果还不行,那我只能建议你换一个linux发行版了
因为代码确实没问题,问题是底层抛出的。
底层某部分的代码不知道在哪里访问了超出下标的数组元素。
回复 支持 反对

使用道具 举报

发表于 2006-3-3 18:28:59 | 显示全部楼层

javax.print包怎么用来打印?

我用来打印txt, html, pdf...都说:
The printer does not support the appropriate DocFlavor
sun.print.PrintJobFlavorException: invalid flavor

只有打印jpg能够成功。

import java.io.*;
import java.net.*;

import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.event.*;

public class PrintPS {

        public static void main(String args[]) {
                PrintPS ps = new PrintPS();
        }
        public PrintPS() {
                DocFlavor flavor = new DocFlavor("text/html; charset=UTF-16", "java.io.InputStream");
               
               
                //DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
                PrintRequestAttributeSet aset =
                        new HashPrintRequestAttributeSet();
                aset.add(MediaSizeName.ISO_A4);
                aset.add(new Copies(1));
//                aset.add(Sides.TWO_SIDED_LONG_EDGE);
//                aset.add(Finishings.STAPLE);

                /* locate a print service that can handle it */
               
               
                PrintService service = PrintServiceLookup.lookupDefaultPrintService();
                System.out.println(service.getName());
               
               
                PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
                for (int i = 0; i < services.length; i++) {   
                        System.out.println(i + " : " + services.getName());
                }
               
                PrintService[] pservices =
                        PrintServiceLookup.lookupPrintServices(null, null);
                if (pservices.length > 0) {
                        System.out.println("selected printer: " + pservices[2].getName());

                        /* create a print job for the chosen service */
                        DocPrintJob pj = pservices[2].createPrintJob();
                        if (!pservices[2].isDocFlavorSupported(flavor)) {   
                                System.err.println("The printer does not support the appropriate DocFlavor");
                                }


                        try {
                                FileInputStream fis = new FileInputStream("helloworld.html");
                                Doc doc = new SimpleDoc(fis, flavor, null);

                                /* print the doc as specified */
                                pj.print(doc, aset);

                                /*
                                * Do not explicitly call System.exit() when print returns.
                                * Printing can be asynchronous so may be executing in a
                                * separate thread.
                                * If you want to explicitly exit the VM, use a print job
                                * listener to be notified when it is safe to do so.
                                */
                                System.out.println("Successful Printed!");
                        } catch (IOException ie) {
                                System.err.println(ie);
                        } catch (PrintException e) {
                                System.err.println(e);
                        }
                }else {
                        System.out.println("ATTENTION! No printer selected!!!");
                }
        }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表