SWTで印刷

最近SWTでの印刷をいろいろ調べたのでメモ。
Swingで印刷とかちょっとやる気が起きなかったが、SWTでは大して難しくなかった。

プリンタを選択するダイアログの表示して、選択したプリンタオブジェクトを作る。

PrintDialog printDialog = new PrintDialog();
PrinterData pdata = printDialog.open();
Printer printer = new Printer(pdata);

印刷する

Graphic Contextを使って、印刷内容を描くには次のようにやります。

if (printer.startJob("ジョブ名")) {
    GC gc = new GC(printer);
    if (printer.startPage()) {
        // gcでいろいろ描く
        printer.endPage();
    }
    gc.dispose();
    printer.endJob();
}

改ページはstartPage()とendPage()を繰り返せばいいのでしょうか?やってないのでわかりません。


Graphic Contextの使いかたは下記参照。
Introduction to SWT Graphics
http://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html


とりあえず文書と表を書くくらいなら

//字を描く
gc.drawText("ABC, x, y);
//線を引く
gc.drawLine(x1, y1, x2, y2);


ちなみにGCはPaintEventからも取得できるので、画面でのプレビューも同じようにできる。出力用のクラスをGCのみに依存し、Printerに依存しないようにしておけばプレビューも楽チン。

Shell shell = new Shell();
shell.addPaintListener(new PaintListener() {
    public void paintControl(PaintEvent e) {
        GC gc = e.gc;
        //gcでいろいろ描く
    }
});

紙の大きさ

紙の大きさは次のように取得できるようです(未検証)

Rectangle paper = printer.computeTrim(0, 0, 0, 0);
//紙の左上の位置
int x = paper.x;
int y = paper.y;
//紙の大きさ
int h = paper.height;
int w = paper.width;

文字の大きさ(pixel)

GCは画面やプリンタの解像度によって同じ文字でもピクセル数が変わります。実際のピクセル数の取得方法は次の通りです。文字を右寄せとか、センター配置するときに必須です。

// 解像度
Point dpi = printer.getDPI();
int dx = dpi.x;
int dy = dpi.y;
// フォントの指定
gc.setFont(new Font(printer, "Courier", 10, SWT.NORMAL));
// 現在のフォントの高さ
int h = gc.getFontMetrics().getHeight();
// 現在のフォントの幅(プロポーショナルフォントだとキャラクタごとに異なる)
int w = gc.getCharWidth('A');
// 文字列の幅
int wstr = gc.textExtent("ABCDEFG");


参考
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet132.java?rev=HEAD&content-type=text/vnd.viewcvs-markup