jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          import java.awt.*;
          import java.awt.print.*;
          import java.io.*;

          /**
          * Utility class to print some lines of text to the default printer. Uses some
          * default font settings, and gets the page size from the PrinterJob object.
          *
          * Note: this little example class does not handle pagination. All the text must
          * fit on a single page.
          *
          * This class can also be used as a standalone utility. If the main method is
          * invoked, it reads lines of text from System.in, and prints them to the
          * default printer.
          */

          public class PrintGIF implements Printable {
          /**
          * Default font size, 12 point
          */
          public static final int DEFAULT_FONT_SIZE = 12;

          /**
          * Default type name, Serif
          */
          public static final String DEFAULT_FONT_NAME = "Serif";

          private PrinterJob job;

          private String typeName;

          private int typeSize;

          private Font typeFont;

          private Font typeFontBold;

          private String[] header;

          private String[] body;

          /**
          * Create a TextPrinter object with the default type font and size.
          */
          public PrintGIF() {
          this(DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE);
          }

          /**
          * Create a TextPrinter object ready to print text with a given font and
          * type size.
          */
          public PrintGIF(String name, int size) {
          if (size < 3 || size > 127) {
          throw new IllegalArgumentException("Type size out of range");
          }
          typeName = name;
          typeSize = size;
          typeFont = new Font(typeName, Font.PLAIN, typeSize);
          typeFontBold = new Font(typeName, Font.BOLD, typeSize);
          job = null;
          }

          /**
          * Initialize the printer job.
          */
          protected void init() {
          job = PrinterJob.getPrinterJob();
          }

          /**
          * Initialize the print job, and return the base number of characters per
          * line with the established font size and font. This is really just a
          * guess, because we can't get the font metrics yet.
          */
          public int getCharsPerLine() {
          if (job == null) {
          init();
          }
          PageFormat pf;
          pf = job.defaultPage();
          double width = pf.getImageableWidth(); // in 72nd of a pt
          double ptsize = typeFont.getSize();
          double ptwid = ptsize * 3 / 4;
          double cnt = (width / ptwid);
          return (int) (Math.round(cnt));
          }

          /**
          * Print some text. Headers are printed first, in bold, followed by the body
          * text, in plain style. If the boolean argument interactive is set to true,
          * then the printer dialog gets shown.
          *
          * Either array may be null, in which case they are treated as empty.
          *
          * This method returns true if printing was initiated, or false if the user
          * cancelled printer. This method may throw PrinterException if printing
          * could not be started.
          */
          public boolean doPrint(String[] header, String[] body, boolean interactive)
          throws PrinterException {
          if (job == null) {
          init();
          }
          if (interactive)
          try {
          if (job.printDialog()) {
          // we are going to print
          } else {
          // we are not going to print
          return false;
          }
          } catch (Exception pe) {
          System.err.println("Could not pop up print dialog");
          // assume user wants to print anyway...
          }

          job.setPrintable(this);
          this.header = header;
          this.body = body;
          job.print();
          job = null; // we are no longer initialized
          return true;
          }

          /**
          * Perform printing according to the Java printing model. NEVER CALL THIS
          * DIRECTLY! It will be called by the PrinterJob as necessary. This method
          * always returns Printable.NO_SUCH_PAGE for any page number greater than 0.
          */
          public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
          throws PrinterException {
          if (pageIndex != 0) {
          return NO_SUCH_PAGE;
          }
          FontMetrics fm;
          graphics.setFont(typeFont);
          graphics.setColor(Color.black);
          fm = graphics.getFontMetrics();

          // fill in geometric and rendering guts here
          int i;
          double x, y;
          x = pageFormat.getImageableX();
          y = pageFormat.getImageableY() + fm.getMaxAscent();

          // do the headings
          if (header != null) {
          graphics.setFont(typeFontBold);
          for (i = 0; i < header.length; i++) {
          graphics.drawString(header[i], (int) x, (int) y);
          y += fm.getHeight();
          }
          }

          // do the body
          if (body != null) {
          graphics.setFont(typeFont);
          for (i = 0; i < body.length; i++) {
          graphics.drawString(body[i], (int) x, (int) y);
          y += fm.getHeight();
          }
          }

          return PAGE_EXISTS;
          }

          /**
          * Main method for testing. This main method sets up a header of
          * "PRINTER TEST" and reads System.in to get body text.
          */
          public static void main(String[] args) {
          BufferedReader br;
          java.util.List lines;

          TextPrinter tp;
          tp = new TextPrinter();
          lines = new java.util.ArrayList();
          try {
          InputStreamReader isr;
          isr = new InputStreamReader(System.in);
          br = new BufferedReader(isr);
          String line;
          for (line = br.readLine(); line != null; line = br.readLine()) {
          lines.add(line);
          }
          br.close();

          System.out.println("chars per line: " + tp.getCharsPerLine());
          System.out.println("attempting to print...");
          String[] headers = new String[1];
          headers[0] = "PRINT TEST";
          String[] body = new String[lines.size()];
          for (int ix = 0; ix < lines.size(); ix++) {
          body[ix] = (String) (lines.get(ix));
          }
          boolean didit = tp.doPrint(headers, body, true);
          System.out.println("doPrint returns " + didit);
          } catch (Exception e) {
          System.err.println("Error printing: " + e);
          e.printStackTrace();
          }
          }
          }














          posted on 2008-08-05 17:13 jinfeng_wang 閱讀(275) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 寻乌县| 镇江市| 洪雅县| 武威市| 汝南县| 银川市| 凤城市| 大安市| 齐齐哈尔市| 吴堡县| 象山县| 砀山县| 安塞县| 调兵山市| 栖霞市| 鄂托克前旗| 买车| 陆河县| 甘孜| 开封市| 苍溪县| 兰西县| 隆回县| 星座| 北票市| 准格尔旗| 许昌市| 封丘县| 即墨市| 连云港市| 宁乡县| 武穴市| 西峡县| 呼伦贝尔市| 厦门市| 精河县| 永川市| 霍邱县| 富宁县| 宁安市| 宁强县|