有人說需要為發明之母,我深深的認同

總是覺得人類的生活上有些方式或說邏輯總是一再的重覆,只是方式或是媒介有所改變

最近忽然感覺到 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.


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 identical 的頭像
    identical

    心得筆記

    identical 發表在 痞客邦 留言(0) 人氣()