4

Java アプレットからカスタム用紙サイズを印刷しようとしています。用紙サイズを設定しましたが、無視されています。

これが機能するのに役立つ何かを見たので、本の方法も使用してみましたが、それを使用すると、空白のページが印刷され、まだA4程度のようです(明らかに多くの小切手を印刷しようとしています)小さい (8" x 4"))。

違いがある場合は、JEditorPane から HTML を印刷しようとしています。

何かアイデアがあれば、とても感謝しています。これで髪をかきむしっています。

Javaに関しては、私は非常に初心者であることも付け加えておきます。

これが私がこれまでに持っているものです:

更新: ページ サイズは正しくなりましたが、読み込んでいる HTML ページをページ サイズに合わせることができないようです。

更新: アプレットをブラウザで実行できません。ブラウザではなくEclipseから動作します。また、パラメーターから URL を渡す必要があります。

私が使用している HTML アプレット タグと更新された Java コードを次に示します。

<!DOCTYPE html>
<html>
<head><title>Printing Cheque</title></head>
<body>
<applet width=100 height=100 code="HTMLPrinter"
        archive="cheque_print.jar">
</applet>

</body>
</html>


package com.yunatech.pns.chequeprint;

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JEditorPane;

public class HTMLPrinter extends Applet {

    /**
     * 
     */
    private static final long serialVersionUID = 8065834484717197790L;
    private static JEditorPane editor;

    public HTMLPrinter() {


        try {

            editor = new JEditorPane();
            editor.setPage("http://localhost/print_test/test.html");

            PrinterJob pj = PrinterJob.getPrinterJob();
            if (pj.printDialog()) {
                PageFormat pf = pj.defaultPage();
                Paper paper = pf.getPaper();
                double width = 8d * 72d;
                double height = 4d * 72d;
                double margin = 1d * 72d;
                paper.setSize(width, height);
                paper.setImageableArea(
                        margin,
                        0,
                        width - (margin * 2),
                        height);
                System.out.println("Before- " + dump(paper));
                pf.setOrientation(PageFormat.PORTRAIT);
                pf.setPaper(paper);
                System.out.println("After- " + dump(paper));
                System.out.println("After- " + dump(pf));
                dump(pf);
                PageFormat validatePage = pj.validatePage(pf);
                System.out.println("Valid- " + dump(validatePage));

                Book pBook = new Book();
                pBook.append(new Page(), pf);
                pj.setPageable(pBook);

                try {
                    pj.print();
                } catch (PrinterException ex) {
                    ex.printStackTrace();
                }
            }

        } catch (Exception exp) {
            exp.printStackTrace();
        }
    }

    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 Page implements Printable {

        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
            if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;

            Graphics2D g2d = (Graphics2D)graphics;
            g2d.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());

            editor.setSize((int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());
            editor.print(g2d);

            return Printable.PAGE_EXISTS;
        }
    }
}

よろしくお願いいたします。

4

1 に答える 1

9

印刷は、1 インチあたりのピクセル数で機能するように設計されています。基本印刷 API は 72 の DPI を使用します。

それに応じて測定値を変換する必要があります...

double paperWidth = 8 * 72d;
double paperHeight = 4 * 72d;
double margin = 1 * 72d;

例で更新

g2d.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());不適切なアドバイスであり、危険であり、一般的には必要ありません。さらに、間違った幅と高さの値を使用しています。imageable パラメーターは余白を考慮に入れていますが、グラフィックスを変換していないため、印刷する必要がある領域の左下部分が切り取られる可能性が高くなります...

クリッピングの使用は避けたい

ここに画像の説明を入力

public class TestPrinting01 {

    public static void main(String[] args) {

        PrinterJob pj = PrinterJob.getPrinterJob();
        if (pj.printDialog()) {
            PageFormat pf = pj.defaultPage();
            Paper paper = pf.getPaper();
            double width = 8d * 72d;
            double height = 4d * 72d;
            double margin = 1d * 72d;
            paper.setSize(width, height);
            paper.setImageableArea(
                    margin,
                    margin,
                    width - (margin * 2),
                    height - (margin * 2));
            System.out.println("Before- " + dump(paper));
            pf.setOrientation(PageFormat.LANDSCAPE);
            pf.setPaper(paper);
            System.out.println("After- " + dump(paper));
            System.out.println("After- " + dump(pf));
            dump(pf);
            PageFormat validatePage = pj.validatePage(pf);
            System.out.println("Valid- " + dump(validatePage));

            Book pBook = new Book();
            pBook.append(new Page(), pf);
            pj.setPageable(pBook);

            try {
                pj.print();
            } catch (PrinterException ex) {
                ex.printStackTrace();
            }
        }
    }

    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 Page implements Printable {

        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
            if (pageIndex >= 1) {
                return Printable.NO_SUCH_PAGE;
            }

            Graphics2D g2d = (Graphics2D) graphics;
            // Be careful of clips...
            g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY());

            double width = pageFormat.getImageableWidth();
            double height = pageFormat.getImageableHeight();

            g2d.drawRect(0, 0, (int)pageFormat.getImageableWidth() - 1, (int)pageFormat.getImageableHeight() - 1);
            FontMetrics fm = g2d.getFontMetrics();
            String text = "top";
            g2d.drawString(text, 0, fm.getAscent());

            text = "bottom";
            double x = width - fm.stringWidth(text);
            double y = (height - fm.getHeight()) + fm.getAscent();
            g2d.drawString(text, (int)x, (int)y);

            return Printable.PAGE_EXISTS;
        }
    }
}

更新しました

コンポーネントを印刷するときは、そのレイアウトを担当します。

ここに画像の説明を入力

public class TestPrinting01 {

    private static JEditorPane editor;

    public static void main(String[] args) {

        try {

            editor = new JEditorPane();
            editor.setPage(new File("C:/hold/search.htm").toURI().toURL());

            PrinterJob pj = PrinterJob.getPrinterJob();
            if (pj.printDialog()) {
                PageFormat pf = pj.defaultPage();
                Paper paper = pf.getPaper();
                double width = 8d * 72d;
                double height = 4d * 72d;
                double margin = 1d * 72d;
                paper.setSize(width, height);
                paper.setImageableArea(
                        margin,
                        margin,
                        width - (margin * 2),
                        height - (margin * 2));
                System.out.println("Before- " + dump(paper));
                pf.setOrientation(PageFormat.LANDSCAPE);
                pf.setPaper(paper);
                System.out.println("After- " + dump(paper));
                System.out.println("After- " + dump(pf));
                dump(pf);
                PageFormat validatePage = pj.validatePage(pf);
                System.out.println("Valid- " + dump(validatePage));

                Book pBook = new Book();
                pBook.append(new Page(), pf);
                pj.setPageable(pBook);

                try {
                    pj.print();
                } catch (PrinterException ex) {
                    ex.printStackTrace();
                }
            }

        } catch (Exception exp) {
            exp.printStackTrace();
        }
    }

    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 Page implements Printable {

        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
            if (pageIndex >= 1) {
                return Printable.NO_SUCH_PAGE;
            }

            Graphics2D g2d = (Graphics2D) graphics;
            // Be careful of clips...
//            g2d.setClip(0, 0, (int) pageFormat.getWidth(), (int) pageFormat.getHeight());
            g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY());

            double width = pageFormat.getImageableWidth();
            double height = pageFormat.getImageableHeight();

            System.out.println("width = " + width);
            System.out.println("height = " + height);

            editor.setLocation(0, 0);
            editor.setSize((int)width, (int)height);
            editor.printAll(g2d);

            g2d.setColor(Color.BLACK);
            g2d.draw(new Rectangle2D.Double(0, 0, width, height));

            return Printable.PAGE_EXISTS;
        }
    }
}
于 2012-11-26T03:32:58.207 に答える