Created
May 9, 2012 22:37
-
-
Save baopham/2649430 to your computer and use it in GitHub Desktop.
Serve merged PDF on servlet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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