如何自行设定打印坐标体系?以符合实际设置的要求
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的代码略
......
首先我们看一般的做法
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的代码略
......
相关文章推荐
- 如何设置网站URL结构使之符合SEO优化要求
- PS如何设置打印尺寸显示图像和实际纸张大小一致
- CP How-To:如何设置符合强度要求的密码
- 如何打印出符合acm要求的pdf
- Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
- 详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小
- matlb中如何设置坐标轴的参数以及进行绘图的如何进行注释
- 美团外卖GPRS热敏打印机如何设置自动接单打印(图文)
- 如何点击打印,直接打印出来,不弹打印设置选项
- Flex中如何通过设置textAlign样式设定DateField中选中日期对齐方式的例子
- Flex的DateChooser控件中如何通过设置maxYear属性来设定允许的最大年限的例子
- 详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小
- 用友U8如何设置凭证打印格式?
- 我们应如何修改MFC窗口标题来符合自己的要求?
- mysql 如何设置自动增长序列 sequence(二) 在实际中调用
- MFC打印预览问题(预览坐标与打印的实际坐标问题)
- Linux技巧: Linux终端打印如何设置不同的颜色及显示方式
- DevExpress.XtraCharts.ChartControl 如何设置横坐标倾斜显示
- 如何使用WebBrowser控件打印格式化的XML文档,并以编程方式任意设置打印方向(C#完整示例)
- 手把手教,你如何设置超市小票打印机打印票据(图文教程)