2014-06-09 14 views
5

Ho un'applicazione Web con un menu a discesa da cui l'utente può selezionare il tipo di rendimento del report. report1, report2, report3, ecc.Combinazione di due rapporti Jasper

In base al report selezionato, un report Jasper viene compilato sul server e viene aperto come pop-up in formato PDF.

Sul lato server, sto implementando ciascun rapporto in un metodo separato utilizzando il seguente codice per es. per relazione1:

JRBeanCollectionDataSource report1DataSource = new JRBeanCollectionDataSource(resultSetBeanListReport1); 

InputStream inputStreamReport1 = new FileInputStream(request.getSession().getServletContext().getRealPath(jrxmlFilePath + "report1.jrxml")); 

JasperDesign jasperDesignReport1 = JRXmlLoader.load(inputStreamReport1); 

JasperReport jasperReportReport1 = JasperCompileManager.compileReport(jasperDesignReport1); 

bytes = JasperRunManager.runReportToPdf(jasperReportReport1, titleMapReport1, report1DataSource); 

Allo stesso modo, relazione2 è in un metodo separato con codice qui sotto:

JRBeanCollectionDataSource invstSummDataSource = new JRBeanCollectionDataSource(resultSetBeanListInvstOfSumm); 

InputStream inputStreamInvstSumm = new FileInputStream(request.getSession().getServletContext().getRealPath(jrxmlFilePath + "investSummary.jrxml")); 

JasperDesign jasperDesignInvstSumm = JRXmlLoader.load(inputStreamInvstSumm); 

JasperReport jasperReportInvstSumm = JasperCompileManager.compileReport(jasperDesignInvstSumm); 

bytes = JasperRunManager.runReportToPdf(jasperReportInvstSumm, titleMapInvstSumm, invstSummDataSource); 

Ora ho un requisito che, se relazione1 è selezionato dal menu a discesa, il PDF risultante dovrebbe contenere tutti i riporta uno dopo l'altro nello stesso PDF.

Come posso combinare sopra due righe di codici per generare un singolo PDF?

risposta

7

Ecco il codice di esempio per la combinazione di stampe multiple diaspro

List<JasperPrint> jasperPrints = new ArrayList<JasperPrint>(); 
// Your code to get Jasperreport objects 
JasperReport jasperReportReport1 = JasperCompileManager.compileReport(jasperDesignReport1); 
jasperPrints.add(jasperReportReport1); 
JasperReport jasperReportReport2 = JasperCompileManager.compileReport(jasperDesignReport2); 
jasperPrints.add(jasperReportReport2); 
JasperReport jasperReportReport3 = JasperCompileManager.compileReport(jasperDesignReport3); 
jasperPrints.add(jasperReportReport3); 

JRPdfExporter exporter = new JRPdfExporter(); 
//Create new FileOutputStream or you can use Http Servlet Response.getOutputStream() to get Servlet output stream 
// Or if you want bytes create ByteArrayOutputStream 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrints); 
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out); 
exporter.exportReport(); 
byte[] bytes = out.toByteArray(); 
1

È possibile unire i report prima di generare PDF utilizzando JasperPrint o dopo aver generato i PDF utilizzando iText.

Per la soluzione JasperPrint: verranno generati i 2 (o più) JasperPrint s quindi ottenere le pagine di contenuto e concatenarle.

JasperPrint jp1 = JasperFillManager.fillReport(url.openStream(), parameters, 
        new JRBeanCollectionDataSource(inspBean)); 
JasperPrint jp2 = JasperFillManager.fillReport(url.openStream(), parameters, 
        new JRBeanCollectionDataSource(inspBean)); 

List pages = jp2 .getPages(); 
for (int j = 0; j < pages.size(); j++) { 
    JRPrintPage object = (JRPrintPage)pages.get(j); 
    jp1.addPage(object); 
} 
JasperViewer.viewReport(jp1,false); 

Per la soluzione iText dopo la generazione dei file PDF:

void concatPDFs(List<InputStream> streamOfPDFFiles, OutputStream outputStream, boolean paginate) { 

    Document document = new Document(); 
    try { 
     List<InputStream> pdfs = streamOfPDFFiles; 
     List<PdfReader> readers = new ArrayList<PdfReader>(); 
     int totalPages = 0; 
     Iterator<InputStream> iteratorPDFs = pdfs.iterator(); 

     // Create Readers for the pdfs. 
     while (iteratorPDFs.hasNext()) { 
     InputStream pdf = iteratorPDFs.next(); 
     PdfReader pdfReader = new PdfReader(pdf); 
     readers.add(pdfReader); 
     totalPages += pdfReader.getNumberOfPages(); 
     } 
     // Create a writer for the outputstream 
     PdfWriter writer = PdfWriter.getInstance(document, outputStream); 

     document.open(); 
     BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
     PdfContentByte cb = writer.getDirectContent(); // Holds the PDF 
     // data 

     PdfImportedPage page; 
     int currentPageNumber = 0; 
     int pageOfCurrentReaderPDF = 0; 
     Iterator<PdfReader> iteratorPDFReader = readers.iterator(); 

     // Loop through the PDF files and add to the output. 
     while (iteratorPDFReader.hasNext()) { 
     PdfReader pdfReader = iteratorPDFReader.next(); 

     // Create a new page in the target for each source page. 
     while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) { 
      document.newPage(); 
      pageOfCurrentReaderPDF++; 
      currentPageNumber++; 
      page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF); 
      cb.addTemplate(page, 0, 0); 

      // Code for pagination. 
      if (paginate) { 
      cb.beginText(); 
      cb.setFontAndSize(bf, 9); 
      cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + " of " + totalPages, 520, 5, 0); 
      cb.endText(); 
      } 
     } 
     pageOfCurrentReaderPDF = 0; 
     } 
     outputStream.flush(); 
     document.close(); 
     outputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (document.isOpen()) 
     document.close(); 
     try { 
     if (outputStream != null) 
      outputStream.close(); 
     } catch (IOException ioe) { 
     ioe.printStackTrace(); 
     } 
    } 
    } 
+0

JasperRunManager.runReportToPdf restituisce un array di byte che sto restituendo dal mio metodo. C'è un modo per convertire l'elenco delle pagine JRPrint in array di byte? – Nik

+1

Attenzione a questa soluzione potrebbe non generare correttamente i segnalibri .... –

7

Questa risposta è quella di aiutare l'utente utilizza la versione più recente di Jasper -Rapporto. In @Sangram Jadhav accettare rispondere alla JRExporterParameter.JASPER_PRINT_LIST è deprecato

Il codice corrente sarebbe:

Map<String, Object> paramMap = new HashMap<String, Object>(); 
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>(); 
JasperPrint jasperPrint1 = JasperFillManager.fillReport(report1, paramMap); 
jasperPrintList.add(jasperPrint1); 
JasperPrint jasperPrint2 = JasperFillManager.fillReport(report2, paramMap); 
jasperPrintList.add(jasperPrint2); 

JRPdfExporter exporter = new JRPdfExporter(); 
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList)); //Set as export input my list with JasperPrint s 
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("pdf/output.pdf")); //or any other out streaam 
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration(); 
configuration.setCreatingBatchModeBookmarks(true); //add this so your bookmarks work, you may set other parameters 
exporter.setConfiguration(configuration); 
exporter.exportReport(); 
+0

C'è qualche possibilità di ricalcolare i numeri di pagina? L'ho provato e ogni rapporto inizia con il numero di pagina 1. – dur

+1

@dur Ho postato un Q/A su questo argomento [qui] (http://stackoverflow.com/questions/42426311/) –

0

Ecco il mio codice che uso sul codice graal così come java.Its mi dà due rapporto diverso in un pdf.

String reportDir = Util.getReportDirectory() // my report directory 
Map reportParams = new LinkedHashMap() 
Map reportParams1 = new LinkedHashMap() 

String outputReportName="Test_Output_copy" 

reportParams.put('parameter name',"parameter") 
reportParams1.put('copy',"Customer's Copy") 

JasperReportDef reportDef1 = new JasperReportDef(name: 'testBillReport.jasper', fileFormat: JasperExportFormat.PDF_FORMAT, 
      parameters: reportParams, folder: reportDir) 
JasperReportDef reportDef2 = new JasperReportDef(name: 'testBillReport.jasper', fileFormat: JasperExportFormat.PDF_FORMAT, 
      parameters: reportParams1, folder: reportDir) 

List<JasperReportDef> jasperPrintList = new ArrayList<JasperReportDef>(); 
    jasperPrintList.add(reportDef1); 
    jasperPrintList.add(reportDef2); 

ByteArrayOutputStream report1 = jasperService.generateReport(jasperPrintList); 
    response.setHeader("Content-disposition", "inline;filename="+outputReportName+'.pdf') 
    response.contentType = "application/pdf" 
    response.outputStream << report1.toByteArray() 
Problemi correlati