我有一個文本文件,我需要將其打印到特定的網絡打印機。我知道打印機的名稱。將文件打印到java中的特定打印機
到現在爲止,我製作了一個Printable類來打印我的文件(票據)。
public class TicketPrintPage implements Printable {
private File ticket;
public TicketPrintPage(File f) {
ticket = f;
}
public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
int interline = 12;
Graphics2D g2 = (Graphics2D) g;
g2.setFont(new Font("CourierThai", Font.PLAIN, 10));
int x = (int) pf.getImageableX();
int y = (int) pf.getImageableY();
try {
FileReader fr = new FileReader(ticket);
BufferedReader br = new BufferedReader(fr);
String s;
while ((s = br.readLine()) != null) {
y += interline;
g2.drawString(s, x, y);
}
} catch (IOException e) {
throw new PrinterException("File to print does not exist (" + ticket.getAbsolutePath() +") !");
}
return Printable.PAGE_EXISTS;
}
}
我把這個TicketPrintPage這樣:
public void printTicketFile(File ticket, int orientation) throws PrinterException {
if (!ticket.exists()) {
throw new PrinterException("Ticket to print does not exist (" + ticket.getAbsolutePath() + ") !");
}
PrinterJob pjob = PrinterJob.getPrinterJob();
// get printer using PrintServiceLookup.lookupPrintServices(null, null) and looking at the name
pjob.setPrintService(getPrintService());
// job title
pjob.setJobName(ticket.getName());
// page fomat
PageFormat pf = pjob.defaultPage();
// landscape or portrait
pf.setOrientation(orientation);
// Paper properties
Paper a4Paper = new Paper();
double paperWidth = 8.26;
double paperHeight = 11.69;
double margin = 16;
a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
a4Paper.setImageableArea(
margin,
//0,
margin,
//0,
a4Paper.getWidth()- 2 * margin,
//a4Paper.getWidth(),
a4Paper.getHeight()- 2 * margin
//a4Paper.getHeight()
); // no margin = no scaling
pf.setPaper(a4Paper);
// Custom class that defines how to layout file text
TicketPrintPage pages = new TicketPrintPage(ticket);
// adding the page to a book
Book book = new Book();
book.append(pages, pf);
// Adding the book to a printjob
pjob.setPageable(book);
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
// No jobsheet (banner page, the page with user name, job name, date and whatnot)
pras.add(JobSheets.NONE);
// Printing
pjob.print(pras);
}
它的工作原理沒有那麼糟糕,但:
- 我不會爲文本的多頁的工作(發現了一些算法這一點,但)
- 我無法知道打印機何時完成打印,並且如果我嘗試在一行中打印兩張或更多張票據,打印機將返回「打印機未準備就緒」消息。
所以問題再次是:是否有一種簡單的方法來打印文本文件到打印機?
這允許我打印頁面(我沒有使用printDialog),但PrintRequestAttributeSet沒有考慮在內。我問風景,它打印的肖像... 我認爲這是因爲我使用PrintServiceLookup.lookupPrintServices(null,null)。如果我指定一個風味或屬性,我不會獲得打印機列表。 也許是因爲他們是網絡打印機,我無法以這種方式與他們互動? – Icegras 2009-07-08 12:52:47
也許,我在網絡打印方面也遇到了一些麻煩。由於我只需要打印一個文件(許可證協議),因此我對文本文件進行了格式化,所以我不需要混淆打印設置。我沒有嘗試更改網絡打印機上的設置的任何經驗。抱歉。 – Allan 2009-07-08 13:25:47