【问题标题】:Print text File to specific printer in java将文本文件打印到java中的特定打印机
【发布时间】:2009-07-08 10:52:13
【问题描述】:

我有一个文本文件,我需要将它打印到特定的网络打印机。我知道打印机的名称。

到目前为止,我已经制作了一个 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);
}

效果还不错,但是:
- 我不能为超过一页的文本工作(找到了一些算法但很好)
- 我无法知道打印机何时完成打印,如果我尝试连续打印两张或多张票,打印机将返回打印机未就绪消息。

那么问题又来了:难道没有一种简单的方法可以将文本文件打印到打印机上吗?

【问题讨论】:

    标签: java file printing


    【解决方案1】:

    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。

    【讨论】:

    • 除了答案之外,Java SE 7 文档 (goo.gl/v85d6f) 中的注释“此方法会阻塞,直到打印完成。”
    【解决方案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 类,您可以将文件打印到打印机。

    【讨论】:

    • 这允许我打印页面(我没有使用 printDialog),但不考虑 PrintRequestAttributeSet。我要求横向并打印纵向...我认为这是因为我使用 PrintServiceLookup.lookupPrintServices(null,null)。如果我指定一种风格或属性,我不会得到打印机列表。可能是因为它们是网络打印机,我无法以这种方式与它们交互?
    • 可能,我在网络打印方面也遇到了一些问题。因为我只需要打印一个文件(许可协议),所以我格式化了文本文件,所以我不需要弄乱打印设置。我没有任何尝试更改网络打印机设置的经验。对不起。
    • set 有什么用?我尝试运行您的代码,但遇到了不可用的资产变量错误。
    • 我没有原始代码了。但它应该是docs.oracle.com/javase/1.4.2/docs/api/javax/print/attribute/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多