0

Bufferedimage を印刷するために PrinterJob オブジェクトを使用しています。BufferedImage を処理して Paper Format などのプリンタ ジョブに送信しましたが、カード プリンタに適合させることができません。ハードディスクに保存し、Windows 印刷マネージャーを介して印刷すると、カード プリンターでは非常に良好に印刷されますが、PrinterJob では大きすぎてカードに収まりません。

カードのサイズは 86X54mm で、バッファリングされた画像のサイズは 1300x816px コード:

    PrinterJob printjob = PrinterJob.getPrinterJob();
    printjob.setJobName("CardPrint");

    Printable printable = new Printable() {

            public int print(Graphics pg, PageFormat pf, int pageNum) {

                    if (pageNum > 0) {
                            return Printable.NO_SUCH_PAGE;
                    }
                    JLayeredPane j1 = new JLayeredPane();
                    Dimension size = j1.getSize();

                    j1.print(bi.getGraphics());

                    Graphics2D g2 = (Graphics2D) pg;
                    g2.translate(pf.getImageableX(), pf.getImageableY());
                    g2.drawImage(bi, 0, 0, (int) pf.getWidth(), (int) pf.getHeight(), null);

                    return Printable.PAGE_EXISTS;
            }
    };

    Paper paper = new Paper();
    paper.setImageableArea(0, 0, 0, 0);
    paper.setSize(1.15, 0.72);

    PageFormat format = new PageFormat();
    format.setPaper(paper);


    printjob.setPrintable(printable, format);

    try {
            printjob.printDialog();
            printjob.print();

    } catch (Exception eee){
            System.out.println("NO PAGE FOUND."+eee.toString());

    }

paper.setSize(1.15, 0.7); であることがわかりました。インチ単位です ( http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/print/Paper.html ) paper.setImageableArea(0, 0, 0, 0); そして、私はこのsetImageableAreaについて知りません。

誰かが現在のサイズについて手がかりを持っていますか、計算を間違えましたか? ありがとう。

4

1 に答える 1

5

印刷の最初に、「印刷は楽しいです」 - 覚えておいてください、午前 2 時にこれを繰り返します...

基本的に、用紙サイズを CM からピクセルに変換することから始める必要があります。Java は API に 72dpi を使用します。

したがって、8.6x5.4cm のページ サイズは、153.0708659856 x 243.7795273104 ピクセルと計算されます。

Paper次に、それらのページ要件を満たす新しいものを作成する必要があります...

これをすべて にラップして、 に戻す必要がありPageFormatますPrintJob

内でPrintable、印刷可能な領域に「収まる」ように画像をスケーリングする必要があります。画像のスケーリングは楽しいです...

私のテストでは、800x1159 の画像を 166x241 に縮小しました。

画像のスケーリングに関するより良い議論については、この質問をチェックしてください

public class PrintTest02 {

    private static BufferedImage image;

    public static void main(String[] args) {
        try {
            image = ImageIO.read(new File("/path/to/image.png"));

            System.out.println(image.getWidth() + "x" + image.getHeight());

            PrinterJob pj = PrinterJob.getPrinterJob();
            if (pj.printDialog()) {
                PageFormat pf = pj.defaultPage();
                Paper paper = pf.getPaper();
//                        86X54mm
                double width = fromCMToPPI(8.6);
                double height = fromCMToPPI(5.4);
                paper.setSize(width, height);
                paper.setImageableArea(
                                fromCMToPPI(0.1),
                                fromCMToPPI(0.1),
                                width - fromCMToPPI(0.1),
                                height - fromCMToPPI(0.1));
                pf.setOrientation(PageFormat.PORTRAIT);
                pf.setPaper(paper);
                PageFormat validatePage = pj.validatePage(pf);
                System.out.println("Valid- " + dump(validatePage));
                pj.setPrintable(new MyPrintable(), validatePage);
                try {
                    pj.print();
                } catch (PrinterException ex) {
                    ex.printStackTrace();
                }
            }
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }

    protected static double fromPPItoCM(double dpi) {
        return dpi / 72 / 0.393700787;
    }

    protected static double fromCMToPPI(double cm) {
        return toPPI(cm * 0.393700787);
    }

    protected static double toPPI(double inch) {
        return inch * 72d;
    }

    protected static String dump(Paper paper) {
        StringBuilder sb = new StringBuilder(64);
        sb.append(paper.getWidth()).append("x").append(paper.getHeight())
                        .append("/").append(paper.getImageableX()).append("x").
                        append(paper.getImageableY()).append(" - ").append(paper
                        .getImageableWidth()).append("x").append(paper.getImageableHeight());
        return sb.toString();
    }

    protected static String dump(PageFormat pf) {
        Paper paper = pf.getPaper();
        return dump(paper);
    }

    public static class MyPrintable implements Printable {

        @Override
        public int print(Graphics graphics, PageFormat pageFormat,
                                         int pageIndex) throws PrinterException {
            System.out.println(pageIndex);
            int result = NO_SUCH_PAGE;
            if (pageIndex < 1) {
                Graphics2D g2d = (Graphics2D) graphics;
                System.out.println("[Print] " + dump(pageFormat));
                double width = pageFormat.getImageableWidth();
                double height = pageFormat.getImageableHeight();

                System.out.println("Print Size = " + fromPPItoCM(width) + "x" + fromPPItoCM(height));
                g2d.translate((int) pageFormat.getImageableX(),
                                (int) pageFormat.getImageableY());
                Image scaled = null;
                if (width > height) {
                    scaled = image.getScaledInstance((int)Math.round(width), -1, Image.SCALE_SMOOTH);
                } else {
                    scaled = image.getScaledInstance(-1, (int)Math.round(height), Image.SCALE_SMOOTH);
                }
                g2d.drawImage(scaled, 0, 0, null);
                result = PAGE_EXISTS;
            }
            return result;
        }

    }

}
于 2013-02-06T10:11:06.080 に答える