<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    沙漠中的魚

    欲上天堂,先下地獄
    posts - 0, comments - 56, trackbacks - 0, articles - 119
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    java定位打印(如:超市,票據打印)

    Posted on 2009-07-21 11:25 沙漠中的魚 閱讀(1335) 評論(1)  編輯  收藏 所屬分類: Java

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

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

      Java打印最大的改變來自于J2SE1.4的發布帶來的Java打印服務API。這個第三代Java打印支持接口突破了先前提到的局限性。因為新的API就是以前兩種舊的打印機制定義的功能函數的一個父集。

    下面是我通過這些API寫的定位打印示例代碼,希望對用java實現打印的朋友有一定的幫助!
    在CentOS4.4,jdk1.6下測試通過。

    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定位打印,把打印內容打到指定的地方。 

    @author lyb 

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

        
    private String printStr; 

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

        
    // 打印內容到指定位置 
        public void printContent() 
            printStr 
    = "打印測試內容";// 獲取需要打印的目標文本 
            if (printStr != null && printStr.length() > 0// 當打印內容不為空時 
            
                PAGES 
    = 1// 獲取打印總頁數 
                
    // 指定打印輸出格式 
                DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; 
                
    // 定位默認的打印服務 
                PrintService printService = PrintServiceLookup 
                        .lookupDefaultPrintService(); 
                
    // 創建打印作業 
                DocPrintJob job = printService.createPrintJob(); 
                
    // 設置打印屬性 
                PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
                
    // 設置紙張大小,也可以新建MediaSize類來自定義大小 
                pras.add(MediaSizeName.ISO_A4); 
                DocAttributeSet das 
    = new HashDocAttributeSet(); 
                
    // 指定打印內容 
                Doc doc = new SimpleDoc(this, flavor, das); 
                
    // 不顯示打印對話框,直接進行打印工作 
                try 
                    job.print(doc, pras); 
    // 進行每一頁的具體打印操作 
                }
     catch (PrintException pe) 
                    pe.printStackTrace(); 
                }
     
            }
     else 
                
    // 如果打印內容為空時,提示用戶打印將取消 
                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(); 
        }
     

    }
     

    評論

    # re: java定位打印(如:超市,票據打印)  回復  更多評論   

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

    怎么通過新建MediaSize類來自定義大小呢?

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

    怎么通過新建MediaSize類來自定義大小 啊?
    主站蜘蛛池模板: 亚洲日韩区在线电影| 亚洲成?Ⅴ人在线观看无码| 亚洲av日韩av不卡在线观看 | 精品国产一区二区三区免费看| 亚洲性猛交xx乱| 免费做爰猛烈吃奶摸视频在线观看 | 91成人免费观看网站| 亚洲免费一级视频| 国产四虎免费精品视频| 亚洲高清不卡视频| 日韩精品福利片午夜免费观着| 亚洲人成网网址在线看| 国产日本一线在线观看免费| 国产精品亚洲精品青青青| 免费看国产成年无码AV片| 亚洲国产AV无码一区二区三区| 在线观看亚洲免费| 成年免费a级毛片免费看无码| 亚洲va久久久噜噜噜久久狠狠| 亚洲精品免费在线观看| 亚洲av午夜精品无码专区| 成年女人色毛片免费看| 黄色一级毛片免费看| 亚洲国产另类久久久精品小说 | 91香蕉国产线观看免费全集| 亚洲AV无码专区在线亚| 免费国产在线观看不卡| 精品一卡2卡三卡4卡免费视频| 337p欧洲亚洲大胆艺术| 国产精品酒店视频免费看| 一边摸一边爽一边叫床免费视频| 亚洲国产精品乱码一区二区 | 国产精品免费福利久久| 国产亚洲精品影视在线| 亚洲人成电影网站国产精品| 无码少妇精品一区二区免费动态| 亚洲一区在线视频观看| 亚洲国产精品无码久久九九| 6080午夜一级毛片免费看6080夜福利 | 精品免费久久久久国产一区| 亚洲精品国产肉丝袜久久|