4

次のコードを使用して、80mm ロール紙のサーマル プリンターでテキストを印刷しています。

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

なぜこれが起こっているのか、どうすれば解決できるのかについて何か考えはありますか?

4

1 に答える 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());
        }
    }
}

前のソース コード (間違ったコード) では、アプリケーションが印刷ダイアログ ボックスをトリガーし、ユーザーが [OK] をクリックすると、デフォルトの印刷設​​定が Java アプリに転送され、必要なものが印刷されます。しかし、次の行を削除して印刷ダイアログ ボックスを無効にすると: boolean don = job.printDialog();

どこからともなく発生する未知の PageFormat が転送されます。問題は、定義済みの PageFormat にあるのではなく、pageFormat が最初に行っていなかった印刷メソッドに渡されることでした。

job.setPrintable(contentToPrint, pageFormat);

2 番目のパラメーターが上記のメソッドに渡されていることに注意してください。これがみんなに役立つことを願っています。:)

于 2013-08-01T15:52:55.287 に答える