java 如何在指定的打印机上打印 Jasper Reports?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31028896/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to print Jasper Reports in a specified printer?
提问by PRO_gramista
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:
我想要的只是在没有用户选择打印机的情况下打印 JasperReport。我搜索了它,但没有好的解决方案。这是我的代码的相关部分:
//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?
我想选择一台打印机,而不是简单的 printReport。有没有办法做到这一点?
采纳答案by PRO_gramista
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();
}
回答by CyberAbhay
Here is a Simple Solution for printing jasper report on specific printerCreate One Method for Select printer & print report
这是在特定打印机上打印 jasper 报告的简单解决方案创建选择打印机和打印报告的一种方法
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
回答by Linkman
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
这些代码已过时。JRPrintServiceExporter.setParameter 在 JasperReports 5.6 中被弃用。他们引入了新的 Exporter 接口,并将所有 exporter 改装为具有 ExporterInput、ReportExportConfiguration、ExporterConfiguration、ExporterOutput。见下面的链接
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/export/Exporter.html
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/export/Exporter.html
This means that instead of setParameter, you need to create configuration:
这意味着您需要创建配置而不是 setParameter:
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.
您也可以通过此代码打印到网络共享打印机。
回答by Zcon
Just Use this .no need to more code it handle jasper
只需使用这个。不需要更多的代码来处理碧玉
JasperPrintManager.printReport(jasperPrint, false);
u use true it will show window
你使用 true 它会显示窗口
I tested it epson TM T82 It worked.
我测试了 epson TM T82 它有效。