Combining two Jasper reports

前端 未结 5 1661
迷失自我
迷失自我 2020-11-30 07:15

I have a web application with a dropdown from where user could select the type of report viz. report1, report2, report3, etc.

Based on the report selected, a Jasper

5条回答
  •  长情又很酷
    2020-11-30 07:33

    You can either merge reports before generating PDFs using JasperPrint or after generating PDFs using iText.

    For the JasperPrint solution: you will generate the 2 (or more) JasperPrints then get the content pages and concat them.

    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);
    

    For the iText solution after generating the PDFs:

    void concatPDFs(List streamOfPDFFiles, OutputStream outputStream, boolean paginate) {
    
        Document document = new Document();
        try {
          List pdfs = streamOfPDFFiles;
          List readers = new ArrayList();
          int totalPages = 0;
          Iterator 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 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();
          }
        }
      }
    

提交回复
热议问题