有人說需要為發明之母,我深深的認同
總是覺得人類的生活上有些方式或說邏輯總是一再的重覆,只是方式或是媒介有所改變
最近忽然感覺到 blog 的重要性了,以前沒寫日記或筆記的習慣經常重覆要找類似的資料或是邏輯,就以最近要用 java 套表時,那種深深的痛苦,唉喲,真是讓我感觸良多 :-)
研究了二天的 javax.print, java.awt.print 又不能征服它,又做了重覆的苦工,呵呵, Orz
它有一堆的 attribute 但...,網路上可用的資料實在太少了,IPS 從二年前 (2005) Draft 0.1 到現在(2007.3) 我再去找,它仍舊是那一份 Alpha Draft,呵呵
不過也因為這樣才發現自己中 google 毒很深,因為一但在 google 上找不到太多相關資料時,你就知道這件事很不樂觀了,呵呵 (不過仍舊有可能是我不夠會用 google 大神)
by the way 它實際上的做為是
- implements java.awt.print.Printable
- 實做 public int print(Graphics g, PageFormat pf, int pageIndex)
- 我是在 construct 中呼叫 print()
設定紙張的方式有二
- java.awt.print.PageFormat
- javax.print.attribute.HashPrintRequestAttributeSet
這些基本上都相當的清楚明白,不過不幸的是我要用的是一般的 132 columns 的紙張,事情怪異的就在於二年前寫的程式在之前的 NB (xp) 上 run 的很好,也可正常的套表;但我將程式移到開發用的 pc 上就有辦法正常的工作了,唉...
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.JobName;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import org.apache.log4j.Logger;
public class SizebyName implements Printable {
private static final Logger log = Logger.getLogger(SizebyName.class);
public SizebyName() {
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.JIS_B4);
aset.add(OrientationRequested.LANDSCAPE);
aset.add(new JobName("JobName", null));
PrinterJob pj = PrinterJob.getPrinterJob();
PrintService[] services = PrinterJob.lookupPrintServices();
if (services.length > 0) {
try {
pj.setPrintService(services[1]);
pj.setPrintable(this);
pj.print(aset);
} catch (PrinterException e) {
log.error(e);
}
}
}
public int print(Graphics g, PageFormat pf, int pageIndex)
throws PrinterException {
if (pageIndex == 0) {
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
g2d.setColor(Color.black);
g2d.drawString("中文字", 250, 600);
g2d.drawString("地址地址地址地址地址", 250, 700);
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}
}
依我用 vb 的經驗紙張應該用 us std Fanfold 的大小就可以了,但 javax.print 似乎沒有這樣的尺寸,也有一位朋友在 sun 的 forum 上問過但沒人回覆 (不過,這有時是思考的方向錯了) ,我記得 2005 年時我是用 java.awt.print.PageFormat + java.awt.print.Paper ,將 Paper.setImageableArea() 設成 us std Fanfold (約為14"*11" 的大小) 再去印表即可,but not this time.