How To Print A Text File In Java

You will learn the following in this tutorial.

  • - How to read the file content (text) from a file using BufferedReader
  • - How to get a PrinterJob
  • - How to create a PrintBook and append the Printable Page and Page Format to the book
  • - How to show/hide the Print Dialog Box
  • - How to set the text color for printing
  • - How To Implement A Printable Interface that does the real printing.
  • - Some idea about imageable area.
/**
 * @author KushalP
 * www.sanjaal.com/java
 * Last Modified On 2009-05-19
 */
package com.kushal.utils;

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.text.*;

/**
 * Using JAVA to print simple text file to a printer
 */

public class PrintFileToPrinter implements Printable {

	static AttributedString myStyledText = null;

	public static void main(String args[]) {
		/**Location of a file to print**/
		String fileName = "C:/Temp/abc.txt";

		/**Read the text content from this location **/
		String mText = readContentFromFileToPrint(fileName);

		/**Create an AttributedString object from the text read*/
		myStyledText = new AttributedString(mText);

		printToPrinter();

	}

	/**
	 * This method reads the content of a text file.
	 * The location of the file is provided in the parameter
	 */
	private static String readContentFromFileToPrint(String fileName) {
		String dataToPrint = "";

		try {
			BufferedReader input = new BufferedReader(new FileReader(fileName));
			String line = "";
			/**Read the file and populate the data**/
			while ((line = input.readLine()) != null) {
				dataToPrint += line + "\n";
			}
		} catch (Exception e) {
			return dataToPrint;
		}
		return dataToPrint;
	}

	/**
	 * Printing the data to a printer.
	 * Initialization done in this method.
	 */
	public static void printToPrinter() {
		/**
		 * Get a Printer Job
		 */
		PrinterJob printerJob = PrinterJob.getPrinterJob();

		/**
		 * Create a book. A book contains a pair of page painters
		 * called printables. Also you have different pageformats.
		 */
		Book book = new Book();
		/**
		 * Append the Printable Object (this one itself, as it
		 * implements a printable interface) and the page format.
		 */
		book.append(new PrintFileToPrinter(), new PageFormat());
		/**
		 * Set the object to be printed (the Book) into the PrinterJob. Doing this
		 * before bringing up the print dialog allows the print dialog to correctly
		 * display the page range to be printed and to dissallow any print settings not
		 * appropriate for the pages to be printed.
		 */
		printerJob.setPageable(book);

		/**
		 * Calling the printDialog will pop up the Printing Dialog.
		 * If you want to print without user confirmation, you can directly call printerJob.print()
		 *
		 * doPrint will be false, if the user cancels the print operation.
		 */
		boolean doPrint = printerJob.printDialog();

		if (doPrint) {
			try {
				printerJob.print();
			} catch (PrinterException ex) {
				System.err.println("Error occurred while trying to Print: "
						+ ex);
			}
		}
	}

	/**
	 * This method comes from the Printable interface.
	 * The method implementation in this class
	 * prints a page of text.
	 */
	public int print(Graphics g, PageFormat format, int pageIndex) {

		Graphics2D graphics2d = (Graphics2D) g;
		/**
		 * Move the origin from the corner of the Paper to the corner of the imageable
		 * area.
		 */
		graphics2d.translate(format.getImageableX(), format.getImageableY());

		/** Setting the text color**/
		graphics2d.setPaint(Color.black);
		/**
		 * Use a LineBreakMeasurer instance to break our text into lines that fit the
		 * imageable area of the page.
		 */
		Point2D.Float pen = new Point2D.Float();
		AttributedCharacterIterator charIterator = myStyledText.getIterator();
		LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator,
				graphics2d.getFontRenderContext());
		float wrappingWidth = (float) format.getImageableWidth();
		while (measurer.getPosition() < charIterator.getEndIndex()) {
			TextLayout layout = measurer.nextLayout(wrappingWidth);
			pen.y += layout.getAscent();
			float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout
					.getAdvance());
			layout.draw(graphics2d, pen.x + dx, pen.y);
			pen.y += layout.getDescent() + layout.getLeading();
		}
		return Printable.PAGE_EXISTS;
	}

}

Here is the printer dialog box that popped up on my screen when I tried to run this program. And of course, it did print the file that I specified.

Share
Tagged , , , , , , , , , , , , , , , . Bookmark the permalink.

Leave a Reply