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

以下只提供我的思路和解决方案,代码只是部分从我的源代码中摘录,不能直接运行。

首先我们看一般的做法

    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的代码略
   ...... 
  
  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值