2009-07-08 143 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); 
} 

它的工作原理沒有那麼糟糕,但:
- 我不會爲文本的多頁的工作(發現了一些算法這一點,但)
- 我無法知道打印機何時完成打印,並且如果我嘗試在一行中打印兩張或更多張票據,打印機將返回「打印機未準備就緒」消息。

所以問題再次是:是否有一種簡單的方法來打印文本文件到打印機?

回答

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類可以將文件打印到打印機。

+0

這允許我打印頁面(我沒有使用printDialog),但PrintRequestAttributeSet沒有考慮在內。我問風景,它打印的肖像... 我認爲這是因爲我使用PrintServiceLookup.lookupPrintServices(null,null)。如果我指定一個風味或屬性,我不會獲得打印機列表。 也許是因爲他們是網絡打印機,我無法以這種方式與他們互動? – Icegras 2009-07-08 12:52:47

+0

也許,我在網絡打印方面也遇到了一些麻煩。由於我只需要打印一個文件(許可證協議),因此我對文本文件進行了格式化,所以我不需要混淆打印設置。我沒有嘗試更改網絡打印機上的設置的任何經驗。抱歉。 – Allan 2009-07-08 13:25:47

9

JTextComponent#print應該做的伎倆:

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(); 
} 

以這種方式可以快速打印出漂亮的連格式的文本 - 只需創建一個StyledDocument中的,它在打印之前附加到的JTextPane。