Java Tutorial/SWT/Print

Материал из Java эксперт
Перейти к: навигация, поиск

17. Get the entire printable area of the page for the selected printer

   <source lang="java">

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.Shell; public class MainClass {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   PrintDialog dlg = new PrintDialog(shell);
   
   dlg.setScope(PrinterData.SELECTION);
   
   PrinterData printerData = dlg.open();
   if (printerData != null) {
      Printer printer = new Printer(printerData);
      System.out.println(printer.getClientArea());
      printer.dispose();
   }
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





17. Place one-inch margins on the page

If you need centimeters instead of inches, multiply each inch value by 2.54 to get the number of centimeters.



   <source lang="java">

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.Shell; public class MainClass {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   PrintDialog dlg = new PrintDialog(shell);
   dlg.setScope(PrinterData.SELECTION);
   PrinterData printerData = dlg.open();
   if (printerData != null) {
     Printer printer = new Printer(printerData);
     System.out.println(printer.getClientArea());
     Point dpi = printer.getDPI(); // Get the DPI
     Rectangle rect = printer.getClientArea(); // Get the printable area
     Rectangle trim = printer.ruputeTrim(0, 0, 0, 0); // Get the whole page
     int left = trim.x + dpi.x; // Set left margin one inch from left side of paper
     int top = trim.y + dpi.y; // Set top margin
     int right = (rect.width + trim.x + trim.width) - dpi.x; // 1st three
                                                             // values give
     // you the right side of the page
     int bottom = (rect.height + trim.y + trim.height) - dpi.y; // Set bottom
                                                                 // margin
     // use left, top, right, and bottom as the boundaries that govern where
     // you draw on the page.
     printer.dispose();
   }
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





17. Print DPI

   <source lang="java">

import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.printing.Printer; import org.eclipse.swt.printing.PrinterData; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class PrinterDPI{ public static void main (String [] args) {

 Display display = new Display();
 Shell shell = new Shell(display);
 shell.open ();
 PrinterData data = Printer.getDefaultPrinterData();
 if (data == null) {
   return;
 }
 Printer printer = new Printer(data);
 if (printer.startJob("SWT Printing Snippet")) {
   Rectangle trim = printer.ruputeTrim(0, 0, 0, 0);
   Point dpi = printer.getDPI();
   System.out.println(trim);
   System.out.println(dpi);
   printer.endJob();
   }
 printer.dispose();
 while (!shell.isDisposed ()) {
   if (!display.readAndDispatch ()) display.sleep ();
 }
 display.dispose();
 }

}</source>





17. Printing

Printer, PrinterData and PrintDialog are three main classes related to Printing.

Printer descends from Device. You can create a graphical context from it and draw on the graphical context.



   <source lang="java">

import org.eclipse.swt.graphics.GC; import org.eclipse.swt.printing.Printer; public class DrawTextToPrint {

 public static void main(String[] args) {
   Printer printer = new Printer();
   if (printer.startJob("Printing . . .")) {
     GC gc = new GC(printer);
     if (printer.startPage()) {
       gc.drawText("Hello, World!", 20, 20);
       printer.endPage();
     }
     gc.dispose();
   }
   printer.dispose();
 }

}</source>





17. Printing Graphics

scale any images according to the printer"s DPI to fit the page.



   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; 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.Shell; public class MainClass {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   Image image = new Image(display, "fileName.gif");
   ImageData imageData = image.getImageData();
   PrintDialog dialog = new PrintDialog(shell, SWT.NULL);
   PrinterData printerData = dialog.open();
   Printer printer = new Printer(printerData);
   Point screenDPI = display.getDPI();
   Point printerDPI = printer.getDPI();
   int scaleFactor = printerDPI.x / screenDPI.x;
   Rectangle trim = printer.ruputeTrim(0, 0, 0, 0);
   if (printer.startJob("fileName")) {
     if (printer.startPage()) {
       GC gc = new GC(printer);
       Image printerImage = new Image(printer, imageData);
       // Draw the image
       gc.drawImage(printerImage, 0, 0, imageData.width, imageData.height, -trim.x, -trim.y,
           scaleFactor * imageData.width, scaleFactor * imageData.height);
       // Clean up
       printerImage.dispose();
       gc.dispose();
       printer.endPage();
     }
   }
   // End the job and dispose the printer
   printer.endJob();
   printer.dispose();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





17. Printing Text

  1. Use GC.drawString() or GC.drawText() to print text.
  2. wrap text on word boundaries to fit the target printer and page.



   <source lang="java">

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.ruputeTrim(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);
 }

}</source>





17. Print out String

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.printing.Printer; import org.eclipse.swt.printing.PrinterData; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class StringPrint {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   shell.open();
   PrinterData data = Printer.getDefaultPrinterData();
   if (data == null) {
     System.out.println("Warning: No default printer.");
   }
   Printer printer = new Printer(data);
   if (printer.startJob("SWT Printing Snippet")) {
     Color black = printer.getSystemColor(SWT.COLOR_BLACK);
     GC gc = new GC(printer);
     if (printer.startPage()) {
       gc.setForeground(black);
       String testString = "Hello World!";
       gc.drawString(testString, 200, 200);
       printer.endPage();
     }
     gc.dispose();
     printer.endJob();
   }
   printer.dispose();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}</source>





17. Print text to printer, with word wrap and pagination

   <source lang="java">

/*******************************************************************************

* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

//package org.eclipse.swt.snippets; /*

* Printing example snippet: print text to printer, with word wrap and pagination
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*/

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.printing.PrintDialog; import org.eclipse.swt.printing.Printer; import org.eclipse.swt.printing.PrinterData; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class PrintTextWrapPagetation {

 Display display;
 Shell shell;
 Text text;
 Font font;
 Color foregroundColor, backgroundColor;
 Printer printer;
 GC gc;
 FontData[] printerFontData;
 RGB printerForeground, printerBackground;
 int lineHeight = 0;
 int tabWidth = 0;
 int leftMargin, rightMargin, topMargin, bottomMargin;
 int x, y;
 int index, end;
 String textToPrint;
 String tabs;
 StringBuffer wordBuffer;
 public static void main(String[] args) {
   new Snippet133().open();
 }
 void open() {
   display = new Display();
   shell = new Shell(display);
   shell.setLayout(new FillLayout());
   shell.setText("Print Text");
   text = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
   Menu menuBar = new Menu(shell, SWT.BAR);
   shell.setMenuBar(menuBar);
   MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
   item.setText("&File");
   Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
   item.setMenu(fileMenu);
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("&Open...");
   item.setAccelerator(SWT.CTRL + "O");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       menuOpen();
     }
   });
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("Font...");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       menuFont();
     }
   });
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("Foreground Color...");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       menuForegroundColor();
     }
   });
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("Background Color...");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       menuBackgroundColor();
     }
   });
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("&Print...");
   item.setAccelerator(SWT.CTRL + "P");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       menuPrint();
     }
   });
   new MenuItem(fileMenu, SWT.SEPARATOR);
   item = new MenuItem(fileMenu, SWT.PUSH);
   item.setText("E&xit");
   item.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       System.exit(0);
     }
   });
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   if (font != null)
     font.dispose();
   if (foregroundColor != null)
     foregroundColor.dispose();
   if (backgroundColor != null)
     backgroundColor.dispose();
   display.dispose();
 }
 void menuOpen() {
   final String textString;
   FileDialog dialog = new FileDialog(shell, SWT.OPEN);
   dialog.setFilterExtensions(new String[] { "*.java", "*.*" });
   String name = dialog.open();
   if ((name == null) || (name.length() == 0))
     return;
   try {
     File file = new File(name);
     FileInputStream stream = new FileInputStream(file.getPath());
     try {
       Reader in = new BufferedReader(new InputStreamReader(stream));
       char[] readBuffer = new char[2048];
       StringBuffer buffer = new StringBuffer((int) file.length());
       int n;
       while ((n = in.read(readBuffer)) > 0) {
         buffer.append(readBuffer, 0, n);
       }
       textString = buffer.toString();
       stream.close();
     } catch (IOException e) {
       MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
       box.setMessage("Error reading file:\n" + name);
       box.open();
       return;
     }
   } catch (FileNotFoundException e) {
     MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
     box.setMessage("File not found:\n" + name);
     box.open();
     return;
   }
   text.setText(textString);
 }
 void menuFont() {
   FontDialog fontDialog = new FontDialog(shell);
   fontDialog.setFontList(text.getFont().getFontData());
   FontData fontData = fontDialog.open();
   if (fontData != null) {
     if (font != null)
       font.dispose();
     font = new Font(display, fontData);
     text.setFont(font);
   }
 }
 void menuForegroundColor() {
   ColorDialog colorDialog = new ColorDialog(shell);
   colorDialog.setRGB(text.getForeground().getRGB());
   RGB rgb = colorDialog.open();
   if (rgb != null) {
     if (foregroundColor != null)
       foregroundColor.dispose();
     foregroundColor = new Color(display, rgb);
     text.setForeground(foregroundColor);
   }
 }
 void menuBackgroundColor() {
   ColorDialog colorDialog = new ColorDialog(shell);
   colorDialog.setRGB(text.getBackground().getRGB());
   RGB rgb = colorDialog.open();
   if (rgb != null) {
     if (backgroundColor != null)
       backgroundColor.dispose();
     backgroundColor = new Color(display, rgb);
     text.setBackground(backgroundColor);
   }
 }
 void menuPrint() {
   PrintDialog dialog = new PrintDialog(shell, SWT.NONE);
   PrinterData data = dialog.open();
   if (data == null)
     return;
   if (data.printToFile) {
     data.fileName = "print.out"; // you probably want to ask the user for a
                                   // filename
   }
   /*
    * Get the text to print from the Text widget (you could get it from
    * anywhere, i.e. your java model)
    */
   textToPrint = text.getText();
   /* Get the font & foreground & background data. */
   printerFontData = text.getFont().getFontData();
   printerForeground = text.getForeground().getRGB();
   printerBackground = text.getBackground().getRGB();
   /*
    * Do the printing in a background thread so that spooling does not freeze
    * the UI.
    */
   printer = new Printer(data);
   Thread printingThread = new Thread("Printing") {
     public void run() {
       print(printer);
       printer.dispose();
     }
   };
   printingThread.start();
 }
 void print(Printer printer) {
   if (printer.startJob("Text")) { // the string is the job name - shows up in
                                   // the printer"s job list
     Rectangle clientArea = printer.getClientArea();
     Rectangle trim = printer.ruputeTrim(0, 0, 0, 0);
     Point dpi = printer.getDPI();
     leftMargin = dpi.x + trim.x; // one inch from left side of paper
     rightMargin = clientArea.width - dpi.x + trim.x + trim.width; // one inch
                                                                   // from
                                                                   // right
                                                                   // side of
                                                                   // paper
     topMargin = dpi.y + trim.y; // one inch from top edge of paper
     bottomMargin = clientArea.height - dpi.y + trim.y + trim.height; // one
                                                                       // inch
                                                                       // from
                                                                       // bottom
                                                                       // edge
                                                                       // of
                                                                       // paper
     /* Create a buffer for computing tab width. */
     int tabSize = 4; // is tab width a user setting in your UI?
     StringBuffer tabBuffer = new StringBuffer(tabSize);
     for (int i = 0; i < tabSize; i++)
       tabBuffer.append(" ");
     tabs = tabBuffer.toString();
     /*
      * Create printer GC, and create and set the printer font & foreground
      * color.
      */
     gc = new GC(printer);
     Font printerFont = new Font(printer, printerFontData);
     Color printerForegroundColor = new Color(printer, printerForeground);
     Color printerBackgroundColor = new Color(printer, printerBackground);
     gc.setFont(printerFont);
     gc.setForeground(printerForegroundColor);
     gc.setBackground(printerBackgroundColor);
     tabWidth = gc.stringExtent(tabs).x;
     lineHeight = gc.getFontMetrics().getHeight();
     /* Print text to current gc using word wrap */
     printText();
     printer.endJob();
     /* Cleanup graphics resources used in printing */
     printerFont.dispose();
     printerForegroundColor.dispose();
     printerBackgroundColor.dispose();
     gc.dispose();
   }
 }
 void printText() {
   printer.startPage();
   wordBuffer = new StringBuffer();
   x = leftMargin;
   y = topMargin;
   index = 0;
   end = textToPrint.length();
   while (index < end) {
     char c = textToPrint.charAt(index);
     index++;
     if (c != 0) {
       if (c == 0x0a || c == 0x0d) {
         if (c == 0x0d && index < end && textToPrint.charAt(index) == 0x0a) {
           index++; // if this is cr-lf, skip the lf
         }
         printWordBuffer();
         newline();
       } else {
         if (c != "\t") {
           wordBuffer.append(c);
         }
         if (Character.isWhitespace(c)) {
           printWordBuffer();
           if (c == "\t") {
             x += tabWidth;
           }
         }
       }
     }
   }
   if (y + lineHeight <= bottomMargin) {
     printer.endPage();
   }
 }
 void printWordBuffer() {
   if (wordBuffer.length() > 0) {
     String word = wordBuffer.toString();
     int wordWidth = gc.stringExtent(word).x;
     if (x + wordWidth > rightMargin) {
       /* word doesn"t fit on current line, so wrap */
       newline();
     }
     gc.drawString(word, x, y, false);
     x += wordWidth;
     wordBuffer = new StringBuffer();
   }
 }
 void newline() {
   x = leftMargin;
   y += lineHeight;
   if (y + lineHeight > bottomMargin) {
     printer.endPage();
     if (index + 1 < end) {
       y = topMargin;
       printer.startPage();
     }
   }
 }

}</source>