[java]
import java.awt.*;
import java.awt.print.*;
import java.io.*;
import java.util.Vector;
public class Splesson implements Pageable, Printable {
// Constants for font name, size, style and line spacing
public static String FONTFAMILY = "Monospaced";
public static int FONTSIZE = 10;
public static int FONTSTYLE = Font.PLAIN;
public static float LINESPACEFACTOR = 1.1f;
PageFormat format; // The page size, margins, and orientation
Vector lines; // The text to be printed, broken into lines
Font font; // The font to print with
int linespacing; // How much space between lines
int linesPerPage; // How many lines fit on a page
int numPages; // How many pages required to print all lines
int baseline = -1; // The baseline position of the font
/** Create a Splesson object for a string of text */
public Splesson(String text, PageFormat format) throws IOException {
this(new StringReader(text), format);
}
/** Create a Splesson object for a file of text */
public Splesson(File file, PageFormat format) throws IOException {
this(new FileReader(file), format);
}
/** Create a Splesson object for a stream of text */
public Splesson(Reader stream, PageFormat format) throws IOException {
this.format = format;
BufferedReader in = new BufferedReader(stream);
lines = new Vector();
String line;
while((line = in.readLine()) != null)
lines.addElement(line);
// Create the font we will use, and compute spacing between lines
font = new Font(FONTFAMILY, FONTSTYLE, FONTSIZE);
linespacing = (int) (FONTSIZE * LINESPACEFACTOR);
// Figure out how many lines per page and how many pages
linesPerPage = (int)Math.floor(format.getImageableHeight()/linespacing);
numPages = (lines.size()-1)/linesPerPage + 1;
}
// These are the methods of the Pageable interface.
// Note that the getPrintable() method returns this object, which means
// that this class must also implement the Printable interface.
public int getNumberOfPages() { return numPages; }
public PageFormat getPageFormat(int pagenum) { return format; }
public Printable getPrintable(int pagenum) { return this; }
/* This is the print() method of the Printable interface.*/
public int print(Graphics g, PageFormat format, int pagenum) {
// Tell the PrinterJob if the page number is not a legal one
if ((pagenum = numPages))
return NO_SUCH_PAGE;
// figure out the baseline for our font.
// We couldn't do this earlier because we needed a Graphics object.
if (baseline == -1) {
FontMetrics fm = g.getFontMetrics(font);
baseline = fm.getAscent();
}
g.setColor(Color.white);
g.fillRect((int)format.getImageableX(), (int)format.getImageableY(),
(int)format.getImageableWidth(),
(int)format.getImageableHeight());
// Note that you cannot assume that black is the default color!
g.setFont(font);
g.setColor(Color.black);
// Figure out which lines of text we will print on this page
int startLine = pagenum * linesPerPage;
int endLine = startLine + linesPerPage - 1;
if (endLine >= lines.size())
endLine = lines.size()-1;
// Compute the position on the page of the first line
int x0 = (int) format.getImageableX();
int y0 = (int) format.getImageableY() + baseline;
// Loop through the lines, drawing them all to the page
for(int i=startLine; i 0)
g.drawString(line, x0, y0);
// Move down the page to the next line
y0 += linespacing;
}
// Tell the PrinterJob that we have successfully printed the page
return PAGE_EXISTS;
}
/* This is a test program that demonstrates the use of Splesson*/
public static void main(String[] args) throws IOException, PrinterException {
// Get the PrinterJob object that coordinates everything
PrinterJob job = PrinterJob.getPrinterJob();
// Get the default page format, then ask the user to customize it
PageFormat format = job.pageDialog(job.defaultPage());
// Create our Splesson object, and tell the PrinterJob about it
job.setPageable(new Splesson(new File(args[0]), format));
// Ask the user to select a printer, and if not canceled, print!
if (job.printDialog())
job.print();
}
}[/java]
Output