J'ai un fichier texte et je dois l'imprimer sur une imprimante réseau spécifique. Je connais le nom de l'imprimante.Imprimer le texte Fichier vers une imprimante spécifique en Java
Jusqu'à présent, j'ai fait une classe imprimable pour imprimer mon fichier (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;
}
}
Je l'appelle TicketPrintPage ainsi:
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);
}
Il fonctionne pas si mal, mais:
- Je ne travaille pas pour plus d'une page de texte (trouvé quelques algorithmes pour cela, mais bien)
- Je n'arrive pas à savoir quand l'impression est terminée et si j'essaie d'imprimer deux tickets ou plus à la suite, l'imprimante retournera un message Imprimante pas prête. Donc, la question est encore: est-il pas un moyen simple d'imprimer un fichier texte à une imprimante?
Cela me permet d'imprimer la page (je n'ai pas utilisé printDialog), mais le PrintRequestAttributeSet n'est pas pris en compte. Je demande le paysage et il imprime le portrait ... Je pense que c'est parce que j'utilise PrintServiceLookup.lookupPrintServices (null, null). Si je spécifie une saveur ou des attributs, je n'ai pas de liste d'imprimantes. Peut-être parce que ce sont des imprimantes réseau, je ne peux pas interagir avec eux de cette façon? – Icegras
Peut-être, j'ai eu quelques problèmes avec l'impression en réseau. Comme je n'avais besoin que d'imprimer un fichier (le contrat de licence), j'ai formaté le fichier texte pour ne pas avoir à modifier les paramètres d'impression. Je n'ai aucune expérience avec essayer de changer les paramètres sur une imprimante réseau. Pardon. – Allan
à quoi sert une asette? J'ai essayé d'exécuter votre code, mais j'ai rencontré une erreur de variable aset indisponible. –