2009-07-08 25 views
8

私はテキストファイルを持っており、特定のネットワークプリンタに印刷する必要があります。私はプリンタの名前を知っています。テキストを印刷Javaの特定のプリンタにファイル

これまでは、ファイル(チケット)を印刷するためにPrintableクラスを作成しました。

public class TicketPrintPage implements Printable { 

    private File ticket; 

    public TicketPrintPage(File f) { 
     ticket = f; 
    } 

    public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { 
     int interline = 12; 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setFont(new Font("CourierThai", Font.PLAIN, 10)); 
     int x = (int) pf.getImageableX(); 
     int y = (int) pf.getImageableY(); 

     try { 
      FileReader fr = new FileReader(ticket); 
      BufferedReader br = new BufferedReader(fr); 

      String s; 
      while ((s = br.readLine()) != null) { 
       y += interline; 
       g2.drawString(s, x, y); 
      } 
     } catch (IOException e) { 
      throw new PrinterException("File to print does not exist (" + ticket.getAbsolutePath() +") !"); 
     } 
     return Printable.PAGE_EXISTS; 
    } 
} 

私はこの方法このTicketPrintPageを呼び出す:それはそう悪くない動作しますが、

public void printTicketFile(File ticket, int orientation) throws PrinterException { 
    if (!ticket.exists()) { 
     throw new PrinterException("Ticket to print does not exist (" + ticket.getAbsolutePath() + ") !"); 
    } 
    PrinterJob pjob = PrinterJob.getPrinterJob(); 
    // get printer using PrintServiceLookup.lookupPrintServices(null, null) and looking at the name 
    pjob.setPrintService(getPrintService()); 
    // job title 
    pjob.setJobName(ticket.getName()); 

    // page fomat 
    PageFormat pf = pjob.defaultPage(); 
    // landscape or portrait 
    pf.setOrientation(orientation); 
    // Paper properties 
    Paper a4Paper = new Paper(); 
    double paperWidth = 8.26; 
    double paperHeight = 11.69; 
    double margin = 16; 
    a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0); 
    a4Paper.setImageableArea(
       margin, 
       //0, 
       margin, 
       //0, 
       a4Paper.getWidth()- 2 * margin, 
       //a4Paper.getWidth(), 
       a4Paper.getHeight()- 2 * margin 
       //a4Paper.getHeight() 
       ); // no margin = no scaling 
    pf.setPaper(a4Paper); 
    // Custom class that defines how to layout file text 
    TicketPrintPage pages = new TicketPrintPage(ticket); 
    // adding the page to a book 
    Book book = new Book(); 
    book.append(pages, pf); 
    // Adding the book to a printjob 
    pjob.setPageable(book); 
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
     // No jobsheet (banner page, the page with user name, job name, date and whatnot) 
    pras.add(JobSheets.NONE); 
    // Printing 
    pjob.print(pras); 
} 


- そのためにいくつかのアルゴリズムを発見した私は、テキストの複数のページでは動作しません(ただし、よく)
- プリンタが印刷を終了したことを知ることができず、2つ以上のチケットを連続して印刷しようとすると、プリンタは準備不能メッセージを返します。

もう一度質問します。テキストファイルをプリンタに簡単に印刷する方法はありませんか?

答えて

6

私はこれがあなたの問題を解決するかどうかはわからないが、私は、テキストファイル

FileInputStream textStream; 
textStream = new FileInputStream(FILE_NAME); 

DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
Doc mydoc = new SimpleDoc(textStream, flavor, null); 

    PrintService[] services = PrintServiceLookup.lookupPrintServices(
       flavor, aset); 
    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); 

    if(services.length == 0) { 
     if(defaultService == null) { 
      //no printer found 

     } else { 
      //print using default 
      DocPrintJob job = defaultService.createPrintJob(); 
      job.print(mydoc, aset); 

     } 

    } else { 

     //built in UI for printing you may not use this 
     PrintService service = ServiceUI.printDialog(null, 200, 200, services, defaultService, flavor, aset); 


     if (service != null) 
     { 
      DocPrintJob job = service.createPrintJob(); 
      job.print(mydoc, aset); 
     } 

    } 

を印刷するには、次の使用あなたがServiceUIを必要としないかもしれないが、私は、あなたが取得するのPrintService []サービスを利用することができると思います印刷可能なプリンタのリスト。また、入力ストリームとDocクラスを使用すると、ファイルをプリンタに印刷できます。ただStyledDocumentのを作成し、印刷する前にJTextPaneにアタッチ - あなたはすぐにでも素敵なフォーマットされたテキストを印刷することができ、このように

JTextPane jtp = new JTextPane(); 
jtp.setBackground(Color.white); 
jtp.setText("text to print"); 
boolean show = true; 
try { 
    jtp.print(null, null, show, null, null, show); 
} catch (java.awt.print.PrinterException ex) { 
    ex.printStackTrace(); 
} 

+0

これで、私はprintDialogを使用しなかったページを印刷できますが、PrintRequestAttributeSetは考慮されていません。私は風景を求めて、肖像画を印刷します。 PrintServiceLookup.lookupPrintServices(null、null)を使用しているためです。フレーバーやアトリビュートを指定すると、プリンタのリストが表示されません。 ネットワークプリンタなので、私はそれらとやりとりできません。 – Icegras

+0

おそらく、私はネットワーク印刷にもいくつか問題がありました。私は1つのファイル(ライセンス契約)を印刷する必要があったので、テキストファイルをフォーマットしたので、印刷設定を混乱させる必要はありません。ネットワークプリンタの設定を変更しようとする経験はありません。ごめんなさい。 – Allan

+0

アセットは何ですか?私はあなたのコードを実行しようとしましたが、利用できないaset変数エラーが発生しました。 –

9

JTextComponent#printは、トリックを行う必要があります。

+1

であるはずです。答えに加えて、Java SE 7のドキュメント( http://goo.gl/v85d6f) "このメソッドは印刷が完了するまでブロックします。" – Willmore

関連する問題