java 列印例子(字串換行問題)

來源:互聯網
上載者:User


1.列印例子

java列印中最關鍵的就是每一個繪圖函數 g2.drawString(str, x, y ) 中的起點座標(x,y)

import java.awt.BasicStroke;import java.awt.Color;import java.awt.Component;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Toolkit;import java.awt.print.Book;import java.awt.print.PageFormat;import java.awt.print.Paper;import java.awt.print.Printable;import java.awt.print.PrinterException;import java.awt.print.PrinterJob;/** * 列印圖片和文字 *  * @author wfg *  */public class PrintSalesSlip implements Printable {/** *//** * @param Graphic指明列印的圖形環境 * @param *            PageFormat指明列印頁格式(頁面大小以點為計量單位,1點為1英才的1/72,1英寸為25.4毫米。A4紙大致為595×842點) * @param pageIndex指明頁號(80毫米:226.7點,58毫米:164.4) */public int print(Graphics gra, PageFormat pf, int pageIndex)throws PrinterException {Component c = null;// print string// 轉換成Graphics2DGraphics2D g2 = (Graphics2D) gra;// 設定列印顏色為黑色g2.setColor(Color.black);// 列印起點座標double x = pf.getImageableX();//返回與此 PageFormat 相關的 Paper 對象的可成像地區左上方點的 x 座標。double y = pf.getImageableY();switch (pageIndex) {case 0:// 設定列印字型(字型名稱、樣式和點大小)(字型名稱可以是物理或者邏輯名稱)// Java平台所定義的五種字型系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInputFont font = new Font("宋體", Font.PLAIN, 12);g2.setFont(font);// 設定字型// BasicStroke bs_3=new BasicStroke(0.5f);float[] dash1 = { 2.0f };// 設定列印線的屬性。// 1.線寬 2、3、不知道,4、空白的寬度,5、虛線的寬度,6、位移量g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));// g2.setStroke(bs_3);//設定線寬float fontHeigth1 = font.getSize2D();// -1- 用Graphics2D直接輸出// 首字元的基準(右下部)位於使用者空間中的 (x, y) 位置處 //g2.drawLine(10,10,200,300); String str1 ="xxxxxxxxxxxxxxxxxx";g2.drawString(str1, (int)x, (int)y + fontHeigth1);String str2 = "139";g2.drawString(str2, (int)x, (int)y + fontHeigth1*2+10);Font font2 = new Font("宋體", Font.PLAIN, 9);g2.setFont(font2);// 設定字型g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));float fontHeigth2 = (int)font.getSize2D();int tempHeight = (int) (fontHeigth1*2+10);String str3 ="行行行行行行惺惺惜惺惺";g2.drawString(str3, (int)x, (int)y + fontHeigth2+10 +tempHeight);String str4 ="xxxxxxxxxxxxxx嘻嘻嘻";g2.drawString(str4, (int)x, (int)y + fontHeigth2*2+10 +tempHeight);String str5 ="新行行行行行行行行行";g2.drawString(str5, (int)x, (int)y + fontHeigth2*3+10 +tempHeight);String str6 ="惺惺相惜休息休息想";g2.drawString(str6, (int)x, (int)y + fontHeigth2*4+20 +tempHeight);String str7 ="xxxxxxxx";g2.drawString(str7, (int)x, (int)y + fontHeigth2*5+20 +tempHeight);String str8 ="xxxxxxxxxxxxxxxxx";g2.drawString(str8, (int)x, (int)y + fontHeigth2*6+20 +tempHeight);Image src = Toolkit.getDefaultToolkit().getImage("f:/barcode2.jpg");g2.drawImage(src, (int) x, (int)( y + fontHeigth2*6+50 +tempHeight+10),150,70, c);//列印條碼int img_Height = src.getHeight(c);int img_width = src.getWidth(c);return PAGE_EXISTS;default:return NO_SUCH_PAGE;}}public static void main(String[] args) {// 通俗理解就是書、文檔Book book = new Book();// 設定成豎打PageFormat pf = new PageFormat();pf.setOrientation(PageFormat.PORTRAIT);/*static int LANDSCAPE         原點位於紙張的左下方,x 的方向從下到上,y 的方向從左至右。 static int PORTRAIT         原點在紙張的左上方,x 指向右方,y 指向下方。 static int REVERSE_LANDSCAPE         原點位於紙張的右上方,x 的方向從上到下,y 的方向從右至左。 *///(頁面大小以點為計量單位,1點為1英寸的1/72,1英寸為25.4毫米。A4紙大致為595×842點)// 通過Paper設定頁面的空白邊距和可列印範圍。必須與實際列印紙張大小相符。Paper p = new Paper();///System.out.println("1高:"+p.getHeight()+"-寬:"+p.getWidth());p.setSize(227, 300);// 紙張大小 設定此 Paper 對象的寬和高,它表示要用來列印的頁面的屬性p.setImageableArea(10, 10, 227, 300);//設定此 Paper 的可成像地區。 //A4(595 X 842)設定列印範圍,其實0,0應該是72,72,因為A4紙的預設X,Y邊距是72System.out.println("2高:"+p.getHeight()+"-寬:"+p.getWidth());pf.setPaper(p);// 把 PageFormat 和 Printable 添加到書中,組成一個頁面book.append(new PrintSalesSlip(), pf);// 擷取列印服務物件PrinterJob job = PrinterJob.getPrinterJob();// 設定列印類job.setPageable(book);try {// 可以用printDialog顯示列印對話方塊,在使用者確認後列印;也可以直接列印boolean a=job.printDialog();if(a){//System.out.println(a);job.print(); }} catch (Exception e) {e.printStackTrace();}}}

2.列印中字串換行

思路:按像素來判斷是否要換行,按字串長度換行的話會有英文和漢子的問題,寬度不一樣。

int StrPixelWidth = metrics.stringWidth(str); //字串長度(像素) str要列印的字串int lineSize =(int) Math.ceil(StrPixelWidth*1.0/width);//要多少行//FontMetrics metrics = new FontMetrics(font) {};// Rectangle2D bounds = metrics.getStringBounds(str, null);  // int widthInPixels = (int) bounds.getWidth(); //System.out.println(StrPixelWidth+"---:");if(width < StrPixelWidth){//頁面寬度(width)小於 字串長度lineNum = (int) Math.ceil(StrPixelWidth*1.0/lineSize);//算出行數StringBuilder sb =new StringBuilder();//儲存每一行的字串 int j=0; int tempStart = 0; String tempStrs[] =new String[lineSize];//儲存換行之後每一行的字串for(int i1 =0;i1<str.length();i1++){char ch = str.charAt(i1);sb.append(ch); Rectangle2D bounds2 = metrics.getStringBounds(sb.toString(), null);   int tempStrPi1exlWi1dth = (int) bounds2.getWidth();  if(tempStrPi1exlWi1dth > width){ tempStrs[j++] = str.substring(tempStart,i1); tempStart = i1; sb.delete(0, sb.length()); sb.append(ch); } if(i1 ==  str.length()-1){//最後一行 tempStrs[j] = str.substring(tempStart); }}




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.