您的位置:首页 > 其它

如何自行设定打印坐标体系?以符合实际设置的要求

2006-10-29 08:10 267 查看
以下只提供我的思路和解决方案,代码只是部分从我的源代码中摘录,不能直接运行。

首先我们看一般的做法

PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); //默认的打印机

PrinterJob printJob = PrinterJob.getPrinterJob();
PageFormat pf = printJob.defaultPage(); //打印介质对象
double pageTopFoot = 1.3; //默认页眉高度,cm
double pageBottomFoot = 1.3; //默认页脚高度,cm

然后在预览时

public void paint(Graphics g){

Graphics2D g2 = (Graphics2D)g
g2.translate(pf.getImageableX(), pf.getImageableY());
//下面是绘制JTable的代码,略
.........
}

结果发现,页眉和页脚无法打印和预览出来,即使设置页边距为零也不行。

打印边距不符合要求,当页边距设定为0时,顶边打印实测距离约为1.3cm,左边实测距离约为0.5cm

这是因为,

g2.translate(pf.getImageableX(), pf.getImageableY());

这句话,将左上角定为
系统保留页眉1.3cm + 顶部页边距(可自定义)
系统保留左边0.5cm + 左边距(可自定义)
的起始X,Y坐标转为可使用裁剪区域的0,0坐标
即:
如:设定顶边距2.5cm,则左上角的起始Y坐标为1.3+2.5 = 3.8cm
那这样的话,就不可能在1.3cm处打印出页眉,因为它超出了图像裁剪范围(ClipBounds)。


因此,要想打印出页眉和页脚,和符合设置要求的纸张效果,就不能用它原来的那套东西,java api原来那个误差太大。

以下为我的解决方案,在打印或预览之前,将图像裁剪范围放大为整张纸张大小,然后再重新计算坐标体系。

//绘制部分代码

public void paint(Graphics g){

Graphics2D g2 = (Graphics2D)g
//g2.translate(pf.getImageableX(), pf.getImageableY()); 将这个原来的转换注释掉

double pageTotalW = pf.getWidth();
double pageTotalH = pf.getHeight();

if(pf.getOrientation()==0){ //处理纸张为横向时的设定
pageTotalW = pf.getHeight();
pageTotalH = pf.getWidth();
}

PageFormat pft = new PageFormat(); //新建一个PageFormat
Paper pa = new Paper();
pa.setImageableArea(0,0,pageTotalW,pageTotalH); //将图像裁剪范围放大为整张纸张大小
pa.setSize(pageTotalW,pageTotalH);
pft.setPaper(pa);
pft.setOrientation(pf.getOrientation());

//下面是绘制扩展JTable类的代码,将设置后的pft做为参数传递到绘制类,略
.........

}

绘制类的处理部分代码

在table中的边距变量定义,单位cm

LeftMargin ,左边距
RightMargin ,右边距
TopMargin,上边距
BottomMargin, 下边距
PageTopFoot ,页眉
PageBottomFoot,页脚

//转换

double doubl = 2.8345f * 10; //1cm的像素点长度

//求左边系统坐标,左边距
douLeft = (table.getLeftMargin()-0.1) * doubl ; //微调0.1毫米
//右边距
douRight = table.getRightMargin() * doubl;

//上边系统坐标,上边距
douTop = table.getTopMargin() * doubl;
//下边距
douBottom = table.getBottomMargin() * doubl;
//页面全宽
douTotalWidth = pf.getWidth(); //pf为上边传递过来的pft
//页面全高
douTotalHeight = pf.getHeight(); //pf为上边传递过来的pft

//页眉高
douTopFoot = (table.getPageTopFoot()+0.2) * doubl; // 微调0.2毫米
//页脚高
douBottomFoot = (table.getPageBottomFoot()-0.2) * doubl; // 微调0.2毫米

prW = douTotalWidth - (douLeft + douRight); //纸张页面实际可用宽
prH = douTotalHeight - (douTop + douBottom); //纸张页面实际可用高

//有了以上参数,就可以知道需要的坐标体系了

//如:起始绘制table的左上角为上边距和左边距的交汇处,左边距为X,上边距为Y,等等
//如 页眉为 douTopFoot 处绘制,这时就可以绘制出来了,因为图像裁剪范围为整张纸

//以下按行绘制table的代码略
......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: