Распечатать текстовый файл на определенный принтер в 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)

Решение Вопроса

что это решит вашу проблему, но я использую следующее для печати текстового файла

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, вы можете распечатать файл на принтере.

 16 янв. 2013 г., 02:07
для чего? Я попытался запустить ваш код, но столкнулся с недоступной ошибкой переменной aset.
 17 янв. 2013 г., 15:37
У меня больше нет оригинального кода. Но это должно бытьdocs.oracle.com/javase/1.4.2/docs/api/javax/print/attribute/…
 Icegras08 июл. 2009 г., 14:52
Это позволяет мне распечатать страницу (я не использовал printDialog), но PrintRequestAttributeSet не принимается во внимание. Я спрашиваю пейзаж, и он печатает портрет ... Я думаю, что это потому, что я использую PrintServiceLookup.lookupPrintServices (null, null). Если я укажу вкус или атрибуты, я не получу список принтеров. Может быть, из-за того, что они являются сетевыми принтерами, я не могу взаимодействовать с ними таким образом?
 08 июл. 2009 г., 15:25
Возможно, у меня были некоторые проблемы с сетевой печатью. Так как мне нужно было распечатать только один файл (лицензионное соглашение), я отформатировал текстовый файл, поэтому мне не нужно связываться с настройками печати. У меня нет опыта попытки изменить настройки на сетевом принтере. Сожалею.

JTextComponent # печать должен сделать трюк:

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 перед печатью.

 03 янв. 2014 г., 12:49
В дополнение к ответу заметка из Java SE 7 docs (goo.gl/v85d6f) & quot; этот метод блокируется до завершения печати. & quot;

Ваш ответ на вопрос