Printing Text : Print « SWT « Java Tutorial






  1. Use GC.drawString() or GC.drawText() to print text.
  2. wrap text on word boundaries to fit the target printer and page.
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

public class MainClass {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);

    PrintDialog dialog = new PrintDialog(shell);
    PrinterData printerData = dialog.open();
    if (printerData != null) {
      // Create the printer
      Printer printer = new Printer(printerData);

      try {
        // Print the contents of the file
        new WrappingPrinter(printer).print();
      } catch (Exception e) {
        MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
        mb.setMessage(e.getMessage());
        mb.open();
      }

      // Dispose the printer
      printer.dispose();
    }

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }
}

/**
 * This class performs the printing, wrapping text as necessary Code revised
 * from /* The Definitive Guide to SWT and JFace by Robert Harris and Rob Warner
 * Apress 2004
 */

class WrappingPrinter {
  private Printer printer; // The printer

  private String fileName; // The name of the file to print

  private String contents; // The contents of the file to print

  private GC gc; // The GC to print on

  private int xPos, yPos; // The current x and y locations for print

  private Rectangle bounds; // The boundaries for the print

  private StringBuffer buf; // Holds a word at a time

  private int lineHeight; // The height of a line of text

  /**
   * WrappingPrinter constructor
   * 
   * @param printer
   *          the printer
   * @param fileName
   *          the fileName
   * @param contents
   *          the contents
   */
  WrappingPrinter(Printer printer) {
    this.printer = printer;
    this.fileName = "yourfilename.txt";
    this.contents = "long content to wrap";
  }

  /**
   * Prints the file
   */
  void print() {
    // Start the print job
    if (printer.startJob(fileName)) {
      // Determine print area, with margins
      bounds = computePrintArea(printer);
      xPos = bounds.x;
      yPos = bounds.y;

      // Create the GC
      gc = new GC(printer);

      // Determine line height
      lineHeight = gc.getFontMetrics().getHeight();

      // Determine tab width--use three spaces for tabs
      int tabWidth = gc.stringExtent(" ").x;

      // Print the text
      printer.startPage();
      buf = new StringBuffer();
      char c;
      for (int i = 0, n = contents.length(); i < n; i++) {
        // Get the next character
        c = contents.charAt(i);

        // Check for newline
        if (c == '\n') {
          printBuffer();
          printNewline();
        }
        // Check for tab
        else if (c == '\t') {
          xPos += tabWidth;
        } else {
          buf.append(c);
          // Check for space
          if (Character.isWhitespace(c)) {
            printBuffer();
          }
        }
      }
      printer.endPage();
      printer.endJob();
      gc.dispose();
    }
  }

  /**
   * Prints the contents of the buffer
   */
  void printBuffer() {
    // Get the width of the rendered buffer
    int width = gc.stringExtent(buf.toString()).x;

    // Determine if it fits
    if (xPos + width > bounds.x + bounds.width) {
      // Doesn't fit--wrap
      printNewline();
    }

    // Print the buffer
    gc.drawString(buf.toString(), xPos, yPos, false);
    xPos += width;
    buf.setLength(0);
  }

  /**
   * Prints a newline
   */
  void printNewline() {
    // Reset x and y locations to next line
    xPos = bounds.x;
    yPos += lineHeight;

    // Have we gone to the next page?
    if (yPos > bounds.y + bounds.height) {
      yPos = bounds.y;
      printer.endPage();
      printer.startPage();
    }
  }

  /**
   * Computes the print area, including margins
   * 
   * @param printer
   *          the printer
   * @return Rectangle
   */
  Rectangle computePrintArea(Printer printer) {
    // Get the printable area
    Rectangle rect = printer.getClientArea();
    // Compute the trim
    Rectangle trim = printer.computeTrim(0, 0, 0, 0);

    // Get the printer's DPI
    Point dpi = printer.getDPI();

    // Calculate the printable area, using 1 inch margins
    int left = trim.x + dpi.x;
    if (left < rect.x)
      left = rect.x;
    int right = (rect.width + trim.x + trim.width) - dpi.x;
    if (right > rect.width)
      right = rect.width;

    int top = trim.y + dpi.y;
    if (top < rect.y)
      top = rect.y;
    int bottom = (rect.height + trim.y + trim.height) - dpi.y;
    if (bottom > rect.height)
      bottom = rect.height;

    return new Rectangle(left, top, right - left, bottom - top);
  }
}








17.110.Print
17.110.1.Printing
17.110.2.Get the entire printable area of the page for the selected printer
17.110.3.Place one-inch margins on the page
17.110.4.Printing Text
17.110.5.Printing Graphics
17.110.6.Print DPI
17.110.7.Print out String
17.110.8.Print text to printer, with word wrap and pagination