How to print Jasper Reports in a specified printer?

前端 未结 4 1497
慢半拍i
慢半拍i 2021-01-02 05:22

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:

相关标签:
4条回答
  • 2021-01-02 05:45

    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.

    0 讨论(0)
  • 2021-01-02 05:51

    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();
    }
    
    0 讨论(0)
  • 2021-01-02 05:57

    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.

    0 讨论(0)
  • 2021-01-02 06:02

    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
    
    0 讨论(0)
提交回复
热议问题