2009-07-08 9 views
8

J'ai un fichier texte et je dois l'imprimer sur une imprimante réseau spécifique. Je connais le nom de l'imprimante.Imprimer le texte Fichier vers une imprimante spécifique en Java

Jusqu'à présent, j'ai fait une classe imprimable pour imprimer mon fichier (ticket).

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

Je l'appelle TicketPrintPage ainsi:

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

Il fonctionne pas si mal, mais:
- Je ne travaille pas pour plus d'une page de texte (trouvé quelques algorithmes pour cela, mais bien)
- Je n'arrive pas à savoir quand l'impression est terminée et si j'essaie d'imprimer deux tickets ou plus à la suite, l'imprimante retournera un message Imprimante pas prête. Donc, la question est encore: est-il pas un moyen simple d'imprimer un fichier texte à une imprimante?

Répondre

6

Je ne suis pas sûr si cela résout votre problème, mais j'utiliser ce qui suit pour imprimer un fichier texte

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

    } 

Vous ne pouvez pas besoin du ServiceUI, mais je pense que vous pouvez utiliser PrintService [] services pour obtenir une liste d'imprimantes disponibles pour l'impression. Et en utilisant un flux d'entrée et la classe Doc, vous pouvez imprimer un fichier sur une imprimante.

+0

Cela me permet d'imprimer la page (je n'ai pas utilisé printDialog), mais le PrintRequestAttributeSet n'est pas pris en compte. Je demande le paysage et il imprime le portrait ... Je pense que c'est parce que j'utilise PrintServiceLookup.lookupPrintServices (null, null). Si je spécifie une saveur ou des attributs, je n'ai pas de liste d'imprimantes. Peut-être parce que ce sont des imprimantes réseau, je ne peux pas interagir avec eux de cette façon? – Icegras

+0

Peut-être, j'ai eu quelques problèmes avec l'impression en réseau. Comme je n'avais besoin que d'imprimer un fichier (le contrat de licence), j'ai formaté le fichier texte pour ne pas avoir à modifier les paramètres d'impression. Je n'ai aucune expérience avec essayer de changer les paramètres sur une imprimante réseau. Pardon. – Allan

+0

à quoi sert une asette? J'ai essayé d'exécuter votre code, mais j'ai rencontré une erreur de variable aset indisponible. –

9

JTextComponent#print devrait faire l'affaire:

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

de cette manière, vous pouvez rapidement imprimer même joli texte formaté - il suffit de créer un StyledDocument et l'attacher à JTextPane avant l'impression.

+1

En plus de la réponse, une note provenant des documents Java SE 7 (http://goo.gl/v85d6f) "cette méthode bloque jusqu'à ce que l'impression soit terminée." – Willmore

Questions connexes