2009-07-08 10 views
8

Tengo un archivo de texto y necesito imprimirlo en una impresora de red específica. Sé el nombre de la impresora.Imprimir texto Archivar en una impresora específica en java

Hasta ahora he hecho una clase imprimible para imprimir mi archivo (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; 
    } 
} 

Yo llamo a esto TicketPrintPage esta manera:

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

No funciona tan mal, pero:
- Yo no funciona desde hace más de una página de texto (encontrado algunos algoritmos para eso, pero bien)
- No puedo saber cuándo termina la impresión de la impresora, y si intento imprimir dos o más tickets seguidos, la impresora devolverá un mensaje de Impresora no preparada.

Entonces, la pregunta es: ¿no hay una manera simple de imprimir un archivo de texto en una impresora?

Respuesta

6

no estoy seguro de si esto resuelve su problema, pero yo uso el siguiente para imprimir un archivo de texto

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

    } 

Es posible que no necesite la ServiceUI, pero creo que se podría utilizar los servicios PRINTSERVICE [] para obtener una lista de impresoras disponibles para imprimir. Y usando un flujo de entrada y la clase Doc, puede imprimir un archivo en una impresora.

+0

Esto me permite imprimir la página (no utilicé printDialog), pero PrintRequestAttributeSet no se tiene en cuenta. Pido paisaje e imprime retrato ... Creo que es porque utilizo PrintServiceLookup.lookupPrintServices (null, null). Si especifico un sabor o atributos, no obtengo una lista de impresoras. Tal vez porque son impresoras de red, ¿no puedo interactuar con ellas de esa manera? – Icegras

+0

Posiblemente, también tuve algunos problemas con la impresión en red. Como solo necesitaba imprimir un archivo (el acuerdo de licencia) formateé el archivo de texto para no tener que meterme con la configuración de impresión. No tengo ninguna experiencia con tratar de cambiar la configuración en una impresora de red. Lo siento. – Allan

+0

¿Para qué sirve? Intenté ejecutar tu código pero me encontré con un error de variable aset no disponible. –

9

JTextComponent#print debe hacer el truco:

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 esta manera se puede imprimir rápidamente incluso agradable formatos de texto - acaba de crear un StyledDocument y adjuntarlo a JTextPane antes de imprimir.

+1

Además de la respuesta, una nota de Java SE 7 documentos (http://goo.gl/v85d6f) "este método bloquea hasta que finalice la impresión". – Willmore

Cuestiones relacionadas