I also bought IText in Action A must have for the serious developer of PDF's in Java.
I've stripped out the company specific part of this code, but have not tried compiling this version. it should be pretty damn close to what you need though. Ask if you have any questions.
Of course this code is completely free to use and is released under the Academic Free License
**********************************
import javax.servlet.*; import javax.servlet.http.*; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import java.io.*; import java.net.URL; import java.util.*; public class PDFServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/pdf"); // Code 1 List<InputStream> pdfs = new ArrayList<InputStream>(); String prefix=http://myBirtServer?__report=report/"; String params="&oid="+request.getParameter("oid")+"&__format=pdf"; String [] URLs={ "myReport1.rptdesign", "myReport2.rptdesign", "myReport3.rptdesign", "myReport4.rptdesign", "myReport5.rptdesign", "myReport6.rptdesign" }; for(int x=0;x<URLs.length;x++){ URL u1=new URL(prefix+URLs[x]+params); System.out.println(u1); InputStream in=u1.openStream(); pdfs.add(in); } concatPDFs(pdfs,response.getOutputStream(),true); } /**
* Method written by Abhi
*/
public static void concatPDFs(List<InputStream> streamOfPDFFiles, OutputStream outputStream, boolean paginate, String watermark) { Document document = new Document(PageSize.LETTER.rotate()); try { List<InputStream> pdfs = streamOfPDFFiles; List<PdfReader> readers = new ArrayList<PdfReader>(); int totalPages = 0; Iterator<InputStream> iteratorPDFs = pdfs.iterator(); int x = 0; // Create Readers for the pdfs. while (iteratorPDFs.hasNext()) { System.out.println((++x) + " through the loop1"); try { InputStream pdf = iteratorPDFs.next(); PdfReader pdfReader = new PdfReader(pdf); readers.add(pdfReader); totalPages += pdfReader.getNumberOfPages(); } catch (Exception e) { e.printStackTrace(); } } // Create a writer for the outputstream PdfWriter writer = PdfWriter.getInstance(document, outputStream); if (!STR.isEmpty(watermark)) { writer.setPageEvent(new Watermark(watermark)); } 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(); } } } /** * Inner class to add a watermark to every page. */ static class Watermark extends PdfPageEventHelper { private String watermark; public Watermark(String wm) { watermark = wm; } Font FONT = new Font(Font.FontFamily.HELVETICA, 52, Font.BOLD, new GrayColor(0.75f)); public void onEndPage(PdfWriter writer, Document document) { ColumnText.showTextAligned(writer.getDirectContentUnder(), Element.ALIGN_CENTER, new Phrase(watermark, FONT), 421, 297.5f, writer.getPageNumber() % 2 == 1 ? 45 : -45); } } }
2 comments :
Great tip on concatenating BIRT reports via servlet. Can you also submit a link to your article on BIRT Exchange devshare (http://www.birt-exchange.org/org/devshare/) so more BIRT developers can benefit from it?
Done.
Post a Comment