将文件打印到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); } 

它的工作并不那么糟糕但是:
– 我不会为一页以上的文本工作(找到一些算法,但很好)
– 我无法知道打印机何时完成打印,如果我尝试连续打印两张或更多张票,打印机将返回打印机未就绪消息。

所以问题又是:是不是有一种简单的方法将文本文件打印到打印机?

我不确定这是否解决了您的问题,但我使用以下内容来打印文本文件

 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类,您可以将文件打印到打印机。

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。