2011年2月22日火曜日

JavaPrintServiceでページ毎の印刷

先日は、画像を印刷するというのをやってみたのだけど、本日は、
ページ毎に印刷を行うにはどうしたらいいのだろうかとサンプルを参考に書いてみた。

ポイントは、interfaceのPrintableを実装したクラスを作るということ
そして

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

という関数を実装するということでしょうか。

pageIndexを見て、 Printable.NO_SUCH_PAGEを返してあげるまで
印刷が続くという感じでしょう。

というわけで、例によってサンプルプログラム
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jps/spec/appendix_2DPrinterJob.fm.html#997825
を参考にして、

「現在のページ数:」を表示して、四角を印字するというサンプルプログラムです。

途中。プリンタダイアログも出現します。


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.OrientationRequested;

public class Print2DPrinterJob implements Printable {

 public Print2DPrinterJob() {

  PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
  aset.add(OrientationRequested.LANDSCAPE);
  aset.add(new Copies(2));
  aset.add(new JobName("100ページの印刷", null));

  PrinterJob pj = PrinterJob.getPrinterJob();       
  pj.setPrintable(this);
  //プリンタの検索
  PrintService[] services =
   PrinterJob.lookupPrintServices();

  // primoPDFを検索
  int primoIdx=-1;
  for (int i=0;i<services.length;i++){
   if ("PrimoPDF".equals(services[i].getName())){
    primoIdx=i;
   }
  }
  
  if (services.length > 0) {
   System.out.println("選択されたプリンタ: " + services[primoIdx].getName());
   try {
    pj.setPrintService(services[primoIdx]);
    pj.pageDialog(aset);
    if(pj.printDialog(aset)) {
     pj.print(aset);
    }
   } catch (PrinterException pe) { 
    System.err.println(pe);
   }
  }
 }

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

  //100ページというのは(Printable.NO_SUCH_PAGE)を返却することで表現する
  if (pageIndex < 100) {
   Graphics2D g2d= (Graphics2D)g;
   g2d.translate(pf.getImageableX(), pf.getImageableY()); 
   g2d.setColor(Color.black);
   g2d.drawString("現在のページ数:"+(pageIndex+1), 250, 250);
   g2d.fillRect(0, 0, 200, 200);
   return Printable.PAGE_EXISTS;         
  } else {
   return Printable.NO_SUCH_PAGE;
  }
 }

 public static void main(String arg[]) {
  new Print2DPrinterJob();
 }
}

0 件のコメント: