All I want, is to print a JasperReport without user selecting a printer. I searched for it but there is no good solution that works. This is the relevat part of my code:
//compile to .jasper
String report = JasperCompileManager.compileReportToFile(sourceFileName);
//fill the report
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameter, dataSource);
//print the report
JasperPrintManager.printReport(jasperPrint, true);
Instead of simple printReport i want to select a printer. is there any way to do this?
These codes are obsolete. JRPrintServiceExporter.setParameter became deprecated in JasperReports 5.6. They introduced new interface Exporter and retrofitted all exporters to have ExporterInput, ReportExportConfiguration, ExporterConfiguration,ExporterOutput. See below link
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/export/Exporter.html
This means that instead of setParameter, you need to create configuration:
private void PrintReportToPrinter(JasperPrint jasperPrint) throws JRException {
//Get the printers names
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
//Lets set the printer name based on the registered printers driver name (you can see the printer names in the services variable at debugging)
String selectedPrinter = "Microsoft XPS Document Writer";
// String selectedPrinter = "\\\\S-BPPRINT\\HP Color LaserJet 4700"; // examlpe to network shared printer
System.out.println("Number of print services: " + services.length);
PrintService selectedService = null;
//Set the printing settings
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(MediaSizeName.ISO_A4);
printRequestAttributeSet.add(new Copies(1));
if (jasperPrint.getOrientationValue() == net.sf.jasperreports.engine.type.OrientationEnum.LANDSCAPE) {
printRequestAttributeSet.add(OrientationRequested.LANDSCAPE);
} else {
printRequestAttributeSet.add(OrientationRequested.PORTRAIT);
}
PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
printServiceAttributeSet.add(new PrinterName(selectedPrinter, null));
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
SimplePrintServiceExporterConfiguration configuration = new SimplePrintServiceExporterConfiguration();
configuration.setPrintRequestAttributeSet(printRequestAttributeSet);
configuration.setPrintServiceAttributeSet(printServiceAttributeSet);
configuration.setDisplayPageDialog(false);
configuration.setDisplayPrintDialog(false);
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setConfiguration(configuration);
//Iterate through available printer, and once matched with our <selectedPrinter>, go ahead and print!
if(services != null && services.length != 0){
for(PrintService service : services){
String existingPrinter = service.getName();
if(existingPrinter.equals(selectedPrinter))
{
selectedService = service;
break;
}
}
}
if(selectedService != null)
{
try{
//Lets the printer do its magic!
exporter.exportReport();
}catch(Exception e){
System.out.println("JasperReport Error: "+e.getMessage());
}
}else{
System.out.println("JasperReport Error: Printer not found!");
}}
You can print by this code to a network shared printer too.
Here is a Simple Solution for printing jasper report on specific printer Create One Method for Select printer & print report
private void PrintReportToPrinter(JasperPrint jp) throws JRException {
// TODO Auto-generated method stub
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
// printRequestAttributeSet.add(MediaSizeName.ISO_A4); //setting page size
printRequestAttributeSet.add(new Copies(1));
PrinterName printerName = new PrinterName("Microsoft XPS Document Writer", null); //gets printer
PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
printServiceAttributeSet.add(printerName);
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printServiceAttributeSet);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE);
exporter.exportReport();
}
then call this method like
/* your code*/
Map parameters = new HashMap();
parameters.put("ckotid", kid);
try {
JasperDesign jsd = JRXmlLoader.load("report\\bill\\check_kot.jrxml");
JasperReport jr = JasperCompileManager.compileReport(jsd);
JasperPrint jp = JasperFillManager.fillReport(jr, parameters, con);
//JasperPrintManager.printPage(jp, 0, false);
//JasperPrint jp =reportEngine.fillReport() ;//it returns stream
PrintReportToPrinter(jp);//call method
This is how it's supposed to be:
try {
String report = JasperCompileManager.compileReportToFile(sourceFileName);
JasperPrint jasperPrint = JasperFillManager.fillReport(report, para, ds);
PrinterJob printerJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = PrinterJob.getPrinterJob().defaultPage();
printerJob.defaultPage(pageFormat);
int selectedService = 0;
AttributeSet attributeSet = new HashPrintServiceAttributeSet(new PrinterName(printerNameShort, null));
PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, attributeSet);
try {
printerJob.setPrintService(printService[selectedService]);
} catch (Exception e) {
System.out.println(e);
}
JRPrintServiceExporter exporter;
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(MediaSizeName.NA_LETTER);
printRequestAttributeSet.add(new Copies(1));
// these are deprecated
exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE, printService[selectedService]);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printService[selectedService].getAttributes());
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE);
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
Just Use this .no need to more code it handle jasper
JasperPrintManager.printReport(jasperPrint, false);
u use true it will show window
I tested it epson TM T82 It worked.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With