Печать файла

Печать текстового файла заключается в размещении его строк в графическом контексте методом 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; 

}