複数ページを印刷する

  1. ページを印刷する

    1. 印刷業務の作成

       印刷はPrinterJobクラスを利用します。まず、インスタンス job を作成します。

       PrinterJob job = PrinterJob.getPrinterJob();

      このjob に次に紹介する Book クラスのインスタンスを割り付けます。

       job.setPageable(bk);

      これで、印刷業務(job)が設定できます。

    2. Bookの印刷

      Bookを印刷するには、printDialog() をチェックしてから、job.print() で実行します。これは、bk に追加したページの 印刷クラス(この場合、PaintContent())で実装した、print() メソッドを呼び出します。
         if (job.printDialog()) {
              try {
                  job.print();//印刷指示
              } catch (Exception e) { /* handle exception */
           }
         }
      printDialog() は、Windowsの標準の印刷ダイアログを利用します。このダイアログで、プリンタの設定や、印刷の中止を指定できます。

    3. Bookクラス
       複数のページを印刷するには、Bookクラスが便利です。まず、

       Book bk = new Book();

      で、Bookクラスのインスタンスを作成します。これに、次のように、ページを追加します。

       bk.append(new PaintContent(), job.defaultPage(), 2);

      PaintContent()は、Printableクラスをextendsしたクラスで、実際の印刷を行う、

       int print(Graphics g, PageFormat pf, int pageIndex)

      メソッドを実装します。2はページ数で、このクラスで2ページの印刷を行うことを指定します。print() メソッドには、pageIndex で0から始まるページ番号が渡されますから、これを利用して、Graphics g に描画を行うと、その軌跡が印刷されます。

    4. int print(Graphics g, PageFormat pf, int pageIndex)メソッド
       print() メソッドは、設定されたページフォーマットでpageIndexのページ番号の内容をGraphics g に描画します。g はAWT の Graphics と同じであり、Graphics2D を利用することもできます。ただし、単位は画素でなく、1/72 インチとなります。
       印刷可能なサイズは

       int iw=(int)fmt.getImageableWidth();
       int ih=(int)fmt.getImageableHeight();

      で取得できます。単位は画素でなく、1/72 インチとなります(1インチは2.54cmです)。また、印刷可能な原点(左上の座標)は、

       int ox=(int)fmt.getImageableX();
       int oy=(int)fmt.getImageableY();

      で、取得できます。
       
    5. PageFormatクラス
       ページの印刷フォーマットは PageFormat で指定します。job から、job.defaultPage(); で標準のページフォーマットを取得します。

       PageFormat pfl = job.defaultPage();

      取得した pfl に設定を行います。次の例は、印刷を 横置き に指定します。
       pfl.setOrientation(PageFormat.LANDSCAPE);
       
  2. プロジェクト

    1. 3ページの本
       個々では、横置き印刷の表紙と、2ページの本文をもつ「本」を作成し、印刷します。最初のページは、大きな文字で横向きにタイトルを印刷します。この印刷は、PaintCover クラスで定義します。
       残りの2ページは、PaintContent クラスが担当で、円や四角を表示します。

    2. jobとbkの作成
      main() で、まず、PrinterJobのインスタンスを作成します。横向き(LANDSCAPE)印刷を行う、PageFormat を作成し、bkの第1ページを追加します。この印刷は、PaintCover() クラスが担当します。
       次に、標準の PageFormat で、2ページを追加します。これは、PaintContent() クラスが担当します。

    3. PaintCover クラス
       int print(Graphics g, PageFormat pf, int pageIndex) メソッドを実装し、このクラスの印刷方法を指定します。ここでは、文字 Font を設定し、印刷領域の中央に 72ポイントのサイズの文字を表示します。

    4. PaintContent クラス
       本文の2ページを印刷します。pageIndex で、印刷するページ番号を取得し、対応する内容を 描画 することで、印刷を行います。この例では、2色で丸と四角を印刷します。

    5. ソース
      Book の印刷には java.awt.print.* のimportが必要です。
      import java.awt.*;
      import java.awt.print.*;
      
      public class PrintBook {
          public static void main(String[] args) {
              // 印刷をするクラスのインスタンス:jobを生成    
              PrinterJob job = PrinterJob.getPrinterJob();
      
              // 横向き印刷をするページフォーマットを設定する   
              PageFormat pfl = job.defaultPage();
              pfl.setOrientation(PageFormat.LANDSCAPE);
      
              // Book  クラスのインスタンスを作成  
              Book bk = new Book();
              //表紙を1ページ追加
              bk.append(new PaintCover(), pfl);
              //本文を2ページ追加
              bk.append(new PaintContent(), job.defaultPage(), 2);
              
              //本を印刷iobに渡す
              job.setPageable(bk);
              
              // 印刷ダイアログを表示、プリンタの設定可能    
              if (job.printDialog()) {
                  try {
                      job.print();//印刷指示
                  } catch (Exception e) { /* handle exception */
                  }
              }
              System.exit(0);
          }
      }
      
      //landScapeで印刷する
      class PaintCover implements Printable {
          
          Font fnt = new Font("Helvetica-Bold", Font.PLAIN, 72);
      
          public int print(Graphics g, PageFormat pf, int pageIndex)
              throws PrinterException {
              g.setFont(fnt);
              g.setColor(Color.black);
              
              //中央部に72ポイントで表示
              int yc = (int) (pf.getImageableY() + pf.getImageableHeight() / 2);
              g.drawString("中京", 72, yc + 36);
              
              return Printable.PAGE_EXISTS;
          }
      }
      
      class PaintContent implements Printable {
          
          public int print(Graphics g, PageFormat pf, int pageIndex)
              throws PrinterException {
                  
              Graphics2D g2 = (Graphics2D) g;
              int useRed = 0;
              int xo = (int) pf.getImageableX();
              int yo = (int) pf.getImageableY();
              
              //1ページは赤と緑の円、2ページ目は四角を印刷する
              for (int x = 0; x + 28 < pf.getImageableWidth(); x += 36)
                  for (int y = 0; y + 28 < pf.getImageableHeight(); y += 36) {
                      if (useRed == 0)
                          g.setColor(Color.red);
                      else
                          g.setColor(Color.green);
                  
                      useRed = 1 - useRed;
                      if (pageIndex % 2 == 0)
                          g.drawRect(xo + x + 4, yo + y + 4, 28, 28);
                      else
                          g.drawOval(xo + x + 4, yo + y + 4, 28, 28);
                  }
      
              return Printable.PAGE_EXISTS;
          }
      }