熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

開發技巧:Java打印程序設計全攻略

2013-11-23 19:19:19  來源: Java核心技術 

  前言
  在我們的實際工作中經常需要實現打印功能但由於歷史原因Java提供的打印功能一直都比較弱實際上最初的jdk根本不支持打印直到jdk才引入了很輕量的打印支持所以在以前用Java/Applet/JSP/Servlet設計的程序中較復雜的打印都是通過調用ActiveX/OCX控件或者VB/VC程序來實現的非常麻煩實際上SUN公司也一直致力於Java打印功能的完善而Java平台則終於有了一個健壯的打印模式的開端該打印模式與JavaD圖形包充分結合成一體更令人鼓舞的是新發布的jdk則提供了一套完整的Java 打印服務 API (Java Print Service API)它對已有的打印功能是積極的補充利用它我們可以實現大部分實際應用需求包括打印文字圖形文件及打印預覽等等本文將通過一個具體的程序實例來說明如何設計Java打印程序以實現這些功能並對不同版本的實現方法進行分析比較希望大家能從中獲取一些有益的提示
  
  Java中的打印
  Java的打印API
  
  Java的打印API主要存在於javaawtprint包中而jdk新增的類則主要存在於javaxprint包及其相應的子包javaxprintevent和javaxprintattribute中其中javaxprint包中主要包含打印服務的相關類而javaxprintevent則包含打印事件的相關定義javaxprintattribute則包括打印服務的可用屬性列表等
  
  如何實現打印
  
  要產生一個打印至少需要考慮兩條
  
  需要一個打印服務對象這可通過三種方式實現在jdk之前的版本必須要實現javaawtprintPrintable接口或通過ToolkitgetDefaultToolkit()getPrintJob來獲取打印服務對象在jdk中則可以通過javaxprintPrintSerivceLookup來查找定位一個打印服務對象
  
  需要開始一個打印工作這也有幾種實現方法在jdk之前可以通過javaawtprintPrintJob(jdk提供的現在已經很少用了)調用print或printAll方法開始打印工作也可以通過javaawtprintPrinterJob的printDialog顯示打印對話框然後通過print方法開始打印在jdk中則可以通過javaxprintServiceUI的printDialog顯示打印對話框然後調用print方法開始一個打印工作
  
  打印機對話框
  
   Printable的打印對話框
  
  開始打印工作之前可以通過PrinterJobprintDialog來顯示一個打印對話框它給用戶一個機會以選擇應該打印的頁碼范圍並可供用戶改變打印設置它是一個本地對話框
  
  事實上當從一個Printable對象進行一個打印工作時打印對象並不知道需要打印多少頁它只是不停地調用print方法只要print方法返回PrintablePAGE_EXISTS值打印工作就不停地產生打印頁直到print方法返回PrintableNO_SUCH_PAGE時打印工作才停止
  
  由於打印工作只有在打印完成後才進行准確的頁數計算所以在對話框上的頁碼范圍是尚未初始化的[]我們可以通過構建一個javaawtprintBook對象傳遞給打印對象也可以通過指定的格式計算需要打印的頁數並傳遞給打印對象使其准確地知道要打印多少頁
  
   ServiceUI的打印對話框
  
  與Printable的對話框不同的是在jdk提供ServiceUI的打印機對話框的缺省行為已經用新的 API 更改了缺省情況下對話框不顯示我們必須使用ServiceUI類調用printDialog方法創建如下所示的打印對話框
  
  Java打印程序設計實例
  打印文本
  
   應用場景
  
  假設我們需要打印一個窗體的某個文本編輯域(可能只有幾行也可能包含多頁)的內容並且每頁最多打印如何實現呢?
  
   解決方法
  
  基本思路如下首先我們需要實現Printable接口然後按照每頁最多行的格式計算共需要打印多少頁當打印文本的按鈕被點擊時執行相應的打印動作打印文本的具體操作可通過GraphicsD的drawString方法來實現
  
  ) 實現Printable接口
  
  /*Graphic指明打印的圖形環境PageFormat指明打印頁格式(頁面大小以點為計量單位點為英寸的/英寸為毫米A紙大致為×點)page指明頁號*/
  
  public int print(Graphics g PageFormat pf int page) throws PrinterException {
  GraphicsD g = (GraphicsD)g;
  gsetPaint(Colorblack); //設置打印顏色為黑色
  if (page >= PAGES) //當打印頁號大於需要打印的總頁數時打印工作結束
  return PrintableNO_SUCH_PAGE;
  gtranslate(pfgetImageableX() pfgetImageableY());//轉換坐標確定打印邊界
  drawCurrentPageText(g pf page); //打印當前頁文本
  return PrintablePAGE_EXISTS; //存在打印頁時繼續打印工作
  }
  
  /*打印指定頁號的具體文本內容*/
  private void drawCurrentPageText(GraphicsD g PageFormat pf int page) {
  String s = getDrawText(printStr)[page]; //獲取當前頁的待打印文本內容
  //獲取默認字體及相應的尺寸
  FontRenderContext context = ggetFontRenderContext();
  Font f = areagetFont();
  String drawText;
  float ascent = ; //給定字符點陣
  int k i = fgetSize() lines = ;
  while(slength() > && lines < ) //每頁限定在行以內
  {
  k = sindexOf(\n); //獲取每一個回車符的位置
  if (k != ) //存在回車符
  {
  lines += ; //計算行數
  drawText = ssubstring( k); //獲取每一行文本
  gdrawString(drawText ascent); //具體打印每一行文本同時走紙移位
  if (ssubstring(k + )length() > ) {
  s = ssubstring(k + ); //截取尚未打印的文本
  ascent += i;
  }
  }
  else //不存在回車符
  {
  lines += ; //計算行數
  drawText = s; //獲取每一行文本
  gdrawString(drawText ascent); //具體打印每一行文本同時走紙移位
  s = ; //文本已結束
  }
  }
  }
  
  /*將打印目標文本按頁存放為字符串數組*/
  public String[] getDrawText(String s) {
  String[] drawText = new String[PAGES]; //根據頁數初始化數組
  for (int i = ; i < PAGES; i++)
  drawText[i] = ; //數組元素初始化為空字符串
  int k suffix = lines = ;
  while (slength() > ) {
  if (lines < ) //不夠一頁時
  {
  k = sindexOf(\n);
  if (k != ) //存在回車符
  {
  lines += ; //行數累加
  //計算該頁的具體文本內容存放到相應下標的數組元素
  drawText[suffix] = drawText[suffix] + ssubstring( k + );
  if (ssubstring(k + )length() > )
  s = ssubstring(k + );
  }
  else
  {
  lines += ; //行數累加
  //將文本內容存放到相應的數組元素
  drawText[suffix] = drawText[suffix] + s;
  s = ;
  }
  }
  else //已滿一頁時
  {
  lines = ; //行數統計清零
  suffix++; //數組下標加
  }
  }
  return drawText;
  }
  
  ) 計算需要打印的總頁數
  
  public int getPagesCount(String curStr) {
  int page = ;
  int position count = ;
  String str = curStr;
  while(strlength() > ) //文本尚未計算完畢
  {
  position = strindexOf(\n); //計算回車符的位置
  count += ; //統計行數
  if (position != )
  str = strsubstring(position + ); //截取尚未計算的文本
  else
  str = ; //文本已計算完畢
  }
  if (count > )
  page = count / + ; //以總行數除以獲取總頁數
  return page; //返回需打印的總頁數
  }
  
  以jdk以前的版本實現打印動作按鈕監聽並完成具體的打印操作
  
  private void printTextAction() {
  printStr = areagetText()trim(); //獲取需要打印的目標文本
  if (printStr != null && printStrlength() > ) //當打印內容不為空時
  {
  PAGES = getPagesCount(printStr); //獲取打印總頁數
  PrinterJob myPrtJob = PrinterJobgetPrinterJob(); //獲取默認打印作業
  PageFormat pageFormat = myPrtJobdefaultPage(); //獲取默認打印頁面格式
  myPrtJobsetPrintable(this pageFormat); //設置打印工作
  if (myPrtJobprintDialog()) //顯示打印對話框
  {
  try {
  myPrtJobprint(); //進行每一頁的具體打印操作
  }
  catch(PrinterException pe) {
  peprintStackTrace();
  }
  }
  }
  else { //如果打印內容為空時提示用戶打印將取消
  JOptionPaneshowConfirmDialog(null Sorry Printer Job is Empty Print Cancelled! Empty JOptionPaneDEFAULT_OPTION JOptionPaneWARNING_MESSAGE);
  }
  }
  
  以jdk新版本提供的API實現打印動作按鈕監聽並完成具體的打印操作
  
  private void printTextAction() {
  printFlag = ; //打印標志清零
  printStr = areagetText()trim();
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26650.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.