在热敏打印机上使用Java打印

4

我正在使用以下代码在一台80毫米卷纸热敏打印机上打印一些文本:

public class printnow {

    public static void printCard(final String bill) {
        final PrinterJob job = PrinterJob.getPrinterJob();

        Printable contentToPrint = new Printable() {
            @Override
            public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws  PrinterException {
                Graphics2D g2d = (Graphics2D) graphics;
                g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                g2d.setFont(new Font("Monospaced", Font.BOLD, 7));
                pageFormat.setOrientation(PageFormat.PORTRAIT);

                Paper pPaper = pageFormat.getPaper();
                pPaper.setImageableArea(0, 0, pPaper.getWidth() , pPaper.getHeight() -2);
                pageFormat.setPaper(pPaper);

                if (pageIndex > 0) 
                    return NO_SUCH_PAGE; //Only one page

                String Bill [] = bill.split(";");
                int y = 0;
                for (int i = 0; i < Bill.length; i++) {
                    g2d.drawString(Bill[i], 0, y);
                    y = y + 15;
                }

                return PAGE_EXISTS;
            }
        };  

        boolean don = job.printDialog();

        job.setPrintable(contentToPrint);

        try {
            job.print();
        } catch (PrinterException e) {
            System.err.println(e.getMessage());
        }
    }
}

这样打印非常精细,正是我想要的。但是当我删除以下行以禁用打印对话框并自动化打印过程时,我的打印会出现问题,打印机会自动在左侧留下一些边距。

boolean don = job.printDialog();

有什么想法是为什么会发生这种情况,以及如何解决?

我曾经遇到过完全相同的问题,但没有得到答案。这是一台光栅RNP打印机吗? - Liam Sorsby
不是的。这是爱普生TM-T81。 - Siddhant Minocha
尽管如此,请尝试使用我的代码。我有一个可以在普通打印机上工作而不需要打印对话框的代码,但是它在我的打印机(ptr printer)上无法正常工作。希望它能够奏效。https://dev59.com/d3TYa4cB1Zd3GeqPwp3s - Liam Sorsby
1个回答

2

经过大量的研究和一点点思考,我找到了解决方案。这是一个非常小但愚蠢的错误。请阅读以下源代码:

public class printnow {

    public static void printCard(final String bill ) {
        final PrinterJob job = PrinterJob.getPrinterJob();

        Printable contentToPrint = new Printable() {
            @Override
            public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
                Graphics2D g2d = (Graphics2D) graphics;
                g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                g2d.setFont(new Font("Monospaced", Font.BOLD, 7));

                if (pageIndex > 0) {
                    return NO_SUCH_PAGE;
                } //Only one page

                String Bill [] = bill.split(";");
                int y = 0;
                for (int i = 0; i < Bill.length; i++) {
                    g2d.drawString(Bill[i], 0, y);
                    y = y + 15;
                }

                return PAGE_EXISTS;
            }
        };

        PageFormat pageFormat = new PageFormat();
        pageFormat.setOrientation(PageFormat.PORTRAIT);

        Paper pPaper = pageFormat.getPaper();
        pPaper.setImageableArea(0, 0, pPaper.getWidth() , pPaper.getHeight() -2);
        pageFormat.setPaper(pPaper);

        job.setPrintable(contentToPrint, pageFormat);

        try {
            job.print();
        } catch (PrinterException e) {
            System.err.println(e.getMessage());
        }
    }
}

在之前的源代码(错误的)中,当应用程序触发打印对话框并且用户点击“确定”时,将默认的打印首选项传递给Java应用程序,并打印所需内容。但是,当我们通过删除此行来禁用打印对话框: boolean don = job.printDialog();
一个未知的PageFormat被传递,它不知从何处出现。问题不在于我们定义的PageFormat,而在于该pageFormat被传递到了最初我们没有执行的打印方法中:
job.setPrintable(contentToPrint, pageFormat);

注意上述方法传递的第二个参数。 希望这对大家有所帮助。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接