Je souhaite utiliser PDFBox pour imprimer PDF fichiers créés par iText. J'ai essayé avec succès avec la classe PDDocument et sa méthode print (). Vous pouvez trouver la documentation ici: http://pdfbox.Apache.org/apidocs/ .
(J'utilise ce code :)
public static void printPDF(String fileName)
throws IOException, PrinterException {
PDDocument doc = PDDocument.load(fileName);
doc.print();
}
La méthode print () fonctionne très bien, mais il y a un problème: lorsque je dois imprimer plusieurs fichiers, la méthode me demande de sélectionner une imprimante pour chacun des documents ..
Existe-t-il un moyen de configurer l’imprimante une seule fois?
Pour sélectionner une imprimante, je peux utiliser ce code par exemple:
public static PrintService choosePrinter() {
PrinterJob printJob = PrinterJob.getPrinterJob();
if(printJob.printDialog()) {
return printJob.getPrintService();
}
else {
return null;
}
}
Merci d'avance
public static PrintService choosePrinter() {
PrinterJob printJob = PrinterJob.getPrinterJob();
if(printJob.printDialog()) {
return printJob.getPrintService();
}
else {
return null;
}
}
public static void printPDF(String fileName, PrintService printer)
throws IOException, PrinterException {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(printer);
PDDocument doc = PDDocument.load(fileName);
doc.silentPrint(job);
}
PDDocument
propose également d'autres méthodes d'impression que la fonction print()
sans paramètre:
public void print(PrinterJob printJob) throws PrinterException;
public void silentPrint() throws PrinterException;
public void silentPrint(PrinterJob printJob) throws PrinterException;
Les méthodes silentPrint
n'affichent pas la boîte de dialogue.
Vous pouvez obtenir ce que vous voulez en sélectionnant d'abord une imprimante, puis appelez silentPrint
avec les instances PrinterJob
initialisées en conséquence.
import Java.awt.print.PrinterException;
import Java.io.IOException;
import org.Apache.pdfbox.pdmodel.PDDocument;
public class Print {
public static void main(String[] args) throws IOException, PrinterException
{
PDDocument pdf=PDDocument.load("d:\\filename.pdf");
pdf.print();
}
}
utilisez le code ci-dessus pour imprimer un pdf avec Apache Pdfbox
EDIT: version 2.0.0
import Java.awt.print.PrinterException;
import Java.awt.print.PrinterJob;
import Java.io.File;
import Java.io.IOException;
import org.Apache.pdfbox.pdmodel.PDDocument;
import org.Apache.pdfbox.printing.PDFPageable;
public class JPrint {
public static void main(String[] args) throws IOException, PrinterException {
String filename;
filename = "C:\\pdf.pdf";
try {
PDDocument pdf = PDDocument.load(new File(filename));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(pdf));
job.print();
} catch (Exception e) {
System.out.println(e);
}
}
}
PDDocument doc = PDDocument.load(new FileInputStream(System.getProperty("Java.io.tmpdir") + "\\pdf.pdf")); //read pdf file.
String printerNameDesired = "VENDOR THERMAL PRINTER";
javax.print.PrintService[] service = PrinterJob.lookupPrintServices();
DocPrintJob docPrintJob = null;
int count = service.length;
for (int i = 0; i < count; i++) {
if (service[i].getName().equalsIgnoreCase(printerNameDesired)) {
docPrintJob = service[i].createPrintJob();
i = count;
}
}
PrinterJob pjob = PrinterJob.getPrinterJob();
pjob.setPrintService(docPrintJob.getPrintService());
pjob.setJobName("job");
doc.silentPrint(pjob);
Vous pouvez utiliser la méthode setPrintService () sur le PrinterJob Object.
public static void main(String args[]) throws Exception {
PDDocument document = PDDocument.load(new File("C:/temp/example.pdf"));
PrintService myPrintService = findPrintService("My Windows printer Name");
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
job.setPrintService(myPrintService);
job.print();
}
private static PrintService findPrintService(String printerName) {
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
for (PrintService printService : printServices) {
if (printService.getName().trim().equals(printerName)) {
return printService;
}
}
return null;
}
Cela fonctionne bien pour moi. Mais est une ancienne version pdfbox. La nouvelle version ne supporte pas .load et .silentprint
public static void print(String nomImpresora, int cantVia) throws Exception {
String aux;
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
int selectedService = -1;
if (nomImpresora != null) {
for (int i = 0; i < services.length; i++) {
aux = services[i].getName();
Log.addLog(Log.tipoMensaje.ErrorGenerico, "El valor de aux: " + aux + ".");
if (services[i].getName().toUpperCase().contains(nomImpresora.toUpperCase())) {
/*If the service is named as what we are querying we select it */
selectedService = i;
}
}
}
if (selectedService == -1) {
new Exception("Impresora no encontrada " + nomImpresora);
}
File fileToPrint = new File(rutaNombreArchivo);
PDDocument load = PDDocument.load(fileToPrint.toString());
try {
PrinterJob printJob = PrinterJob.getPrinterJob();
Log.addLog(Log.tipoMensaje.ErrorSQL, "selected service" + selectedService);
printJob.setPrintService(services[selectedService]);
printJob.setJobName(fileToPrint.getName());
final HashPrintRequestAttributeSet printRequestAttributes = new HashPrintRequestAttributeSet();
printJob.print(printRequestAttributes);
for (int i = 1; i <= cantVia; i++) {
load.silentPrint(printJob);
}
} catch (final PrinterException e) {
e.printStackTrace();
} finally {
if (load != null) {
load.close();
}
}
}