沙漠中的魚

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理

          Java自從問(wèn)世以來(lái)在各方面發(fā)展迅速,但是一直以來(lái),打印輸出是java最弱的方面。事實(shí)上,java1.0不支持任何打印功能。Java1.1在 java.awt包里包含了一個(gè)叫做PrintJob的類,但是這個(gè)類提供的打印功能十分粗糙和不可靠。當(dāng)java1.2問(wèn)世,它圍繞 PrinterJob設(shè)計(jì)了一個(gè)完整獨(dú)立的打印機(jī)制(叫做java2D printing API),并且在java.awt.print包里定義了一些新的類和接口。這些使得基于PrintJob打印機(jī)制(就是AWT printing)基本荒廢,雖然PrintJob從未被抨擊而且至少在這篇文章里仍然是一個(gè)提供技術(shù)的類。

            在J2SE1.3里當(dāng)PrintJob的功能擴(kuò)展到可以通過(guò)在java.awt包里的JobAttributes 和PageAttributes兩個(gè)類設(shè)定工程和頁(yè)面的屬性時(shí)發(fā)生了一些額外的改變。隨著J2SE1.3的發(fā)布,打印功能相應(yīng)的得到了完善;但是在混合使用這兩種完全不同的打印機(jī)制的時(shí)候仍然存在一些問(wèn)題。比如,這兩種機(jī)制使用java.awt.Graphics這個(gè)類的一個(gè)接口來(lái)展現(xiàn)打印內(nèi)容,意味著所有要打印的東西都必須用一張圖片表示。另外,完善的PrintJob提供了很有限的工程相關(guān)屬性的設(shè)置;這兩種機(jī)制都沒(méi)有辦法通過(guò)程序來(lái)選擇目標(biāo)打印機(jī)。

            Java打印最大的改變來(lái)自于J2SE1.4的發(fā)布帶來(lái)的Java打印服務(wù)API。這個(gè)第三代Java打印支持接口突破了先前提到的局限性。因?yàn)樾碌腁PI就是以前兩種舊的打印機(jī)制定義的功能函數(shù)的一個(gè)父集。

          下面是我通過(guò)這些API寫的定位打印示例代碼,希望對(duì)用java實(shí)現(xiàn)打印的朋友有一定的幫助!
          在CentOS4.4,jdk1.6下測(cè)試通過(guò)。

          import java.awt.Color; 
          import java.awt.Font; 
          import java.awt.Graphics; 
          import java.awt.Graphics2D; 
          import java.awt.print.PageFormat; 
          import java.awt.print.Printable; 
          import java.awt.print.PrinterException; 

          import javax.print.Doc; 
          import javax.print.DocFlavor; 
          import javax.print.DocPrintJob; 
          import javax.print.PrintException; 
          import javax.print.PrintService; 
          import javax.print.PrintServiceLookup; 
          import javax.print.SimpleDoc; 
          import javax.print.attribute.DocAttributeSet; 
          import javax.print.attribute.HashDocAttributeSet; 
          import javax.print.attribute.HashPrintRequestAttributeSet; 
          import javax.print.attribute.PrintRequestAttributeSet; 
          import javax.print.attribute.standard.MediaSizeName; 
          import javax.swing.JOptionPane; 

          /** 
          * java定位打印,把打印內(nèi)容打到指定的地方。 

          @author lyb 

          */
           
          public class LocatePrint implements Printable 
              
          private int PAGES = 0

              
          private String printStr; 

              
          /* 
               * Graphic指明打印的圖形環(huán)境;PageFormat指明打印頁(yè)格式(頁(yè)面大小以點(diǎn)為計(jì)量單位, 
               * 1點(diǎn)為1英寸的1/72,1英寸為25.4毫米。A4紙大致為595×842點(diǎn));page指明頁(yè)號(hào) 
               
          */
           
              
          public int print(Graphics gp, PageFormat pf, int page) 
                      
          throws PrinterException 
                  Graphics2D g2 
          = (Graphics2D) gp; 
                  g2.setPaint(Color.black); 
          // 設(shè)置打印顏色為黑色 
                  if (page >= PAGES) // 當(dāng)打印頁(yè)號(hào)大于需要打印的總頁(yè)數(shù)時(shí),打印工作結(jié)束 
                      return Printable.NO_SUCH_PAGE; 
                  g2.translate(pf.getImageableX(), pf.getImageableY());
          // 轉(zhuǎn)換坐標(biāo),確定打印邊界 
                  Font font = new Font("宋體", Font.PLAIN, 24);// 創(chuàng)建字體 
                  g2.setFont(font); 
                  
          // 打印當(dāng)前頁(yè)文本 
                  int printFontCount = printStr.length();// 打印字?jǐn)?shù) 
                  int printFontSize = font.getSize();// Font 的磅值大小 
                  float printX = 595 / 2// 給定字符點(diǎn)陣,X頁(yè)面正中 
                  float printY = 842 / 2// 給定字符點(diǎn)陣,Y頁(yè)面正中 
                  float printMX = printX - (printFontCount * printFontSize / 2);// 打印到正中間 
                  float printMY = printY - printFontSize / 2;// 打印到正中間 
                  g2.drawString(printStr, printMX, printMY); // 具體打印每一行文本,同時(shí)走紙移位 
                  g2.drawString(printStr, printMX - printFontSize * printFontCount, 
                          printMY 
          + printFontSize); // 具體打印每一行文本,同時(shí)走紙移位 
                  g2.drawString(printStr, printMX + printFontSize * printFontCount, 
                          printMY 
          + printFontSize); // 具體打印每一行文本,同時(shí)走紙移位 
                  g2.drawString(printStr, printMX, printMY + printFontSize * 2); // 具體打印每一行文本,同時(shí)走紙移位 
                  return Printable.PAGE_EXISTS; // 存在打印頁(yè)時(shí),繼續(xù)打印工作 
              }
           

              
          // 打印內(nèi)容到指定位置 
              public void printContent() 
                  printStr 
          = "打印測(cè)試內(nèi)容";// 獲取需要打印的目標(biāo)文本 
                  if (printStr != null && printStr.length() > 0// 當(dāng)打印內(nèi)容不為空時(shí) 
                  
                      PAGES 
          = 1// 獲取打印總頁(yè)數(shù) 
                      
          // 指定打印輸出格式 
                      DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; 
                      
          // 定位默認(rèn)的打印服務(wù) 
                      PrintService printService = PrintServiceLookup 
                              .lookupDefaultPrintService(); 
                      
          // 創(chuàng)建打印作業(yè) 
                      DocPrintJob job = printService.createPrintJob(); 
                      
          // 設(shè)置打印屬性 
                      PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
                      
          // 設(shè)置紙張大小,也可以新建MediaSize類來(lái)自定義大小 
                      pras.add(MediaSizeName.ISO_A4); 
                      DocAttributeSet das 
          = new HashDocAttributeSet(); 
                      
          // 指定打印內(nèi)容 
                      Doc doc = new SimpleDoc(this, flavor, das); 
                      
          // 不顯示打印對(duì)話框,直接進(jìn)行打印工作 
                      try 
                          job.print(doc, pras); 
          // 進(jìn)行每一頁(yè)的具體打印操作 
                      }
           catch (PrintException pe) 
                          pe.printStackTrace(); 
                      }
           
                  }
           else 
                      
          // 如果打印內(nèi)容為空時(shí),提示用戶打印將取消 
                      JOptionPane.showConfirmDialog(null
                              
          "Sorry, Printer Job is Empty, Print Cancelled!"

                              
          "Empty", JOptionPane.DEFAULT_OPTION, 
                              JOptionPane.WARNING_MESSAGE); 
                  }
           
              }
           

              
          public static void main(String[] args) 
                  LocatePrint lp 
          = new LocatePrint(); 
                  lp.printContent(); 
              }
           

          }
           

          評(píng)論

          # re: java定位打印(如:超市,票據(jù)打印)  回復(fù)  更多評(píng)論   

          2010-06-25 16:13 by java打印
          // 設(shè)置紙張大小,也可以新建MediaSize類來(lái)自定義大小
          pras.add(MediaSizeName.ISO_A4);

          怎么通過(guò)新建MediaSize類來(lái)自定義大小呢?

          我新建了MediaSize類,但還是添加不到pras里!

          怎么通過(guò)新建MediaSize類來(lái)自定義大小 啊?
          主站蜘蛛池模板: 塔城市| 秀山| 景德镇市| 汕头市| 康保县| 民勤县| 策勒县| 凌云县| 鄂尔多斯市| 宣恩县| 平江县| 靖安县| 四会市| 微山县| 德兴市| 嘉定区| 鹤壁市| 湘乡市| 化隆| 平谷区| 牙克石市| 胶南市| 将乐县| 星子县| 潢川县| 芦溪县| 大兴区| 武鸣县| 田阳县| 阜新| 镇原县| 聂拉木县| 上饶县| 敦煌市| 巴里| 台中县| 鄄城县| 道真| 馆陶县| 泸溪县| 湘西|