web-dev-qa-db-ja.com

テキストファイルを特定のプリンタに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);
}

それはそれほど悪くはありませんが:
-私は1ページ以上のテキストで作業していません(そのためのいくつかのアルゴリズムを見つけましたが、うまくいきました)
-プリンタの印刷がいつ完了したかわかりません。2つ以上のチケットを続けて印刷しようとすると、プリンタはプリンタの準備ができていませんというメッセージを返します。

したがって、もう一度質問があります。テキストファイルをプリンタに印刷する簡単な方法はありませんか。

8
Icegras

これで問題が解決するかどうかはわかりませんが、以下を使用してテキストファイルを印刷します

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クラスを使用して、ファイルをプリンターに印刷できます。

6
Allan

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

このようにして、Nice形式のテキストでもすばやく印刷できます。StyledDocumentを作成してJTextPaneに添付するだけで、印刷できます。

9
linski