java 文件打印,将文件打印到java中的特定打印机

I have a text file, and I need to print it to a specific network printer. I know the name of the printer.

Until now I have made a Printable class to print my file (ticket).

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;

}

}

I call this TicketPrintPage this way :

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);

}

It works not so bad but :

- I doesn't work for more than one page of text (found some algorithms for that but well)

- I can't get to know when the printer is done printing, and if I try printing two or more tickets in a row the printer will return a Printer not ready message.

So the question again is : Isn't there a simple way to print a text file to a printer ?

解决方案

I'm not sure if this solves your problem but I use the following to print a text file

FileInputStream textStream;

textStream = new FileInputStream(FILE_NAME);

DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

Doc mydoc = new SimpleDoc(textStream, flavor, null);

PrintService[] services = PrintServiceLookup.lookupPrintServices(

flavor, aset);

PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

if(services.length == 0) {

if(defaultService == null) {

//no printer found

} else {

//print using default

DocPrintJob job = defaultService.createPrintJob();

job.print(mydoc, aset);

}

} else {

//built in UI for printing you may not use this

PrintService service = ServiceUI.printDialog(null, 200, 200, services, defaultService, flavor, aset);

if (service != null)

{

DocPrintJob job = service.createPrintJob();

job.print(mydoc, aset);

}

}

You may not need the ServiceUI, but I think you could use PrintService[] services to get a list of printers available for printing. And using an input stream and the Doc class you can print a file to a printer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值