Иллюстрированный самоучитель по Java

Печать файла

Печать текстового файла заключается в размещении его строк в графическом контексте методом drawstring (). При этом необходимо проследить за правильным размещением строк в области печати и разбиением файла на страницы.

В листинге 18.9 приведен упрощенный пример печати текстового файла, имя которого задается в командной строке. Из файла читаются готовые строки, программа не сравнивает их длину с шириной области печати, не выделяет абзацы. Вывод производится в локальной кодировке.

Листинг 18.9. Печать текстового файла.

import java.awt.*;
import java.awt.print.*;
import java.io.*;
public class Print2File{
public static void main(String[] args){
if (args.length < 1){
System.err.println("Usage: Print2File path");
System, exit(0);
}
PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat pf = pj.pageDialog(pj.defaultPage());
pj.setPrintable(new FilePagePainter(args[0]), pf);
if (pj.printDialog()){
try{
pj.print();
}catch(PrinterException e){}
)
System, exit(0);
}
}
class FilePagePainter implements Printable{
private BufferedReader br;
private String file;
private int page = -1;
private boolean eof;
private String[] line;
private int numLines;
public FilePagePainter(String file){
this.file = file;
try{
br = new BufferedReader(new FileReader(file));
}catch(IOException e){ eof = true; }
}
public int print(Graphics g, PageFormat pf, int ind)
throws PrinterException(
g.setColor(Color.black);
g.setFont(new Font("Serif", Font.PLAIN, 10));
int h = (int)pf.getlmageableHeight();
int x = (int)pf.getlmageableX() + 10;
int у = (int)pf.getlmageableY() + 12;
try{
// Если система печати запросила эту страницу первый раз
if (ind!= page){
if (eof) return Printable.NO_SUCH_PAGE;
page = ind;
line = new String[h/12]; // Массив строк на странице
numLines =0; // Число строк на странице
// Читаем строки из файла и формируем массив строк
while (у + 48 < pf.getlmageableY() + h){
line[numLines] = br.readLine();
if (line[numLines] == null){
eof = true; break; }
numLines++;
У += 12;
}
}
// Размещаем колонтитул
у = (int)pf.getImageableY() + 12;
g.drawstring("Файл: " + file + ", страница " +
(ind + 1), x, у);
// Оставляем две пустые строки
у += 36;
// Размещаем строки текста текущей страницы
for (int i = 0; i < numLines; i++){
g.drawString(line[i], x, y);
у += 12;
}
return Printable.PAGE_EXISTS;
}catch(lOException e){
return Printable.NO_SUCH_PAGE;
}
}
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.