/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cids.utils.jasperreports; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfCopyFields; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import org.apache.log4j.Logger; import org.openide.util.NbBundle; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; /** * DOCUMENT ME! * * @author daniel * @version $Revision$, $Date$ */ public class ReportHelper { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = org.apache.log4j.Logger.getLogger(ReportHelper.class); //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param streamOfPDFFiles DOCUMENT ME! * @param outputStream DOCUMENT ME! * @param paginate DOCUMENT ME! */ public static void concatPDFs(final List<InputStream> streamOfPDFFiles, final OutputStream outputStream, final boolean paginate) { int totalNumOfPages = 0; final List<PdfReader> pdfReaders = new ArrayList<PdfReader>(); try { // create the pdf reader and determine the total number of pages for (final InputStream pdf : streamOfPDFFiles) { final PdfReader pdfReader = new PdfReader(pdf); pdfReaders.add(pdfReader); totalNumOfPages += pdfReader.getNumberOfPages(); } final BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); final PdfCopyFields copy = new PdfCopyFields(outputStream); copy.open(); int currentPageNumber = 0; for (final PdfReader pdfReader : pdfReaders) { final ByteArrayOutputStream pdfOut = new ByteArrayOutputStream(); final PdfStamper stamper = new PdfStamper(pdfReader, pdfOut); int currentNumOfPages = 0; while (currentNumOfPages < pdfReader.getNumberOfPages()) { currentNumOfPages++; currentPageNumber++; final PdfContentByte canvas = stamper.getOverContent(currentNumOfPages); if (paginate) { // add the page number canvas.beginText(); canvas.setFontAndSize(baseFont, 9); canvas.showTextAligned( PdfContentByte.ALIGN_CENTER, currentPageNumber + NbBundle.getMessage( ReportHelper.class, "ReportHelper.concatPDFs.pageNumberSeparator") + totalNumOfPages, 520, 5, 0); canvas.endText(); } } stamper.close(); pdfOut.close(); final PdfReader modifiedPdfReader = new PdfReader(new ByteArrayInputStream(pdfOut.toByteArray())); String pageNOs = ""; final int noOfPages = modifiedPdfReader.getNumberOfPages(); if (noOfPages > 0) { pageNOs = getNumderOfPages(noOfPages); } copy.addDocument(modifiedPdfReader, pageNOs); modifiedPdfReader.close(); pdfReader.close(); } copy.close(); } catch (Exception ex) { LOG.error("error while merging pdfs", ex); } finally { try { if (outputStream != null) { outputStream.flush(); outputStream.close(); } } catch (IOException ex) { LOG.error("error while closing pdfstream", ex); } } } /** * Get comma separated page numbers as string. * * @param noOfPages DOCUMENT ME! * * @return DOCUMENT ME! */ private static String getNumderOfPages(final int noOfPages) { String pageNOs = ""; for (int i = 0; i < noOfPages; i++) { final Integer page = i; if (pageNOs.equals("")) { pageNOs = page.toString(); } else { pageNOs = pageNOs.concat("," + page.toString()); } } return pageNOs; } }