第34夜 Java SEのあたりをつける 印刷編

Javaはもちろん全方位な言語なので印刷はできる。いろんな方法があるが、おそらく一番手っ取り早いヤツということで。

印刷の登場クラス

基本はココ、java.awt.printパッケージだ。ココで大体そろう。

  • java.awt.print.PageFormat ページ情報。A4とか用紙。
  • java.awt.print.Printable 印刷の描画部分
  • java.awt.print.PrinterException 印刷時の例外
  • java.awt.print.PrinterJob 印刷の処理をしてくれる

手順としてはPrintableが実際に描画する処理で、ここで渡されるページ番号とGraphicsを利用して描画する。戻り値はそのページが存在するか、というもの。後述するサンプルではreturnのところを見て1ページだけ印刷しているのを確認してほしい。

PrinterJobがプリンタへの命令を行うところ。サンプルでは印刷前のダイアログを出して、OKが選択されたらそのプリンタと用紙に対して描画をしている。サンプルではクロスプラットフォームダイアログではなく、OSネイティブのダイアログを出している。こちらのほうが使いやすい場合も多いので、クロスプラットフォームのダイアログは利用しないというのもあり。「現実的にユーザーはWindowsなんだろ?」とわりきれば細かい指定ができるわけだし。

サンプルコード

PrinterJob job = PrinterJob.getPrinterJob();
Printable painter = new Printable() {

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if(pageIndex > 0){
            return NO_SUCH_PAGE;
        }
        
        graphics.setColor(Color.RED);
        graphics.fillRect(10, 20, 100, 200);

        graphics.setColor(Color.BLACK);
        graphics.setFont(new Font("MS ゴシック",Font.PLAIN , 24));
        graphics.drawString("印刷されていますか?", 100, 50);

        return PAGE_EXISTS;
    }
};
job.setPrintable(painter);

boolean print = job.printDialog();
if(print){
    job.print();
}

実行結果

http://shin.cside.com/diary/2011/0623-01.png
ダイアログ。キャンセルをすると何もしない。


http://shin.cside.com/diary/2011/0623-02.png
描画結果を表示したところ。神をケチるためmdiファイルに出力している。


これでもう伝票印刷は完璧だね!