Skip to content

Instantly share code, notes, and snippets.

@baopham
Created May 9, 2012 22:37
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save baopham/2649430 to your computer and use it in GitHub Desktop.
Save baopham/2649430 to your computer and use it in GitHub Desktop.
Serve merged PDF on servlet
package testPackage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
/** A PDF merger using iText */
public class PDFMerger {
/**
* @param streamOfPDFFiles
* @param outputStream
* @param paginate
* @return a byte array of the merged PDF
*/
public static byte[] concatPDFs(List<InputStream> pdfs, ByteArrayOutputStream outputStream) {
Document document = new Document();
try {
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);
pdf.close();
totalPages += pdfReader.getNumberOfPages();
}
// Create a writer for the outputstream
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
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()) {
// Set document size based on the original PDF's size
document.setPageSize(pdfReader.getCropBox(++pageOfCurrentReaderPDF));
document.newPage();
currentPageNumber++;
page = writer.getImportedPage(pdfReader,
pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
}
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();
}
}
return outputStream.toByteArray();
}
}
package testPackage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import org.apache.tomcat.util.http.fileupload.IOUtils;
/** Simple servlet for displaying the merged PDF */
@WebServlet("/pdf")
public class TestServlet extends HttpServlet {
private static byte[] PDF;
static {
mergePDF();
}
// Replace this method's content with your PDFs
public static void mergePDF() {
try {
List<InputStream> pdfs = new ArrayList<InputStream>();
pdfs.add(new FileInputStream("test.pdf"));
pdfs.add(new FileInputStream("test2.pdf"));
ByteArrayOutputStream output = new ByteArrayOutputStream();
PDF = PDFMerger.concatPDFs(pdfs, output);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InputStream is = new ByteArrayInputStream(PDF);
// Set response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setContentLength(PDF.length);
OutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
os.flush();
os.close();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment