Reputation: 123
I´m looking for a Java PDF Merger solution where I can streaming the merged pdf while I getting (example from a REST API) the PDF pages parts from a REST api. A pseudo code should be something like this:
public void doGet(HttpServletRequest req, HttpServletResponse res) throws Exception {
sOut = res.getOutputStream();
MergeDocument merger = MergeDocument.merge(sOut);
for (int i = 0; i < 1000; i++) {
byte[] contentPDF = restClient.get("http://mywebsite.com/files/mypdf"+i+".pdf");
merger.append(contentPDF);
sOut.flush(); // sending merged PDF bytes now
}
sOut.close();
}
My point is to not wast heap memory with all PDFs in memory before start sending it to user. In other words, when I get a "contentBytes pdf" from rest I want to send it to the user as a streaming now.
Hope someone can help me :)
Upvotes: 2
Views: 1041
Reputation: 896
Using itextpdf
package com.example.demo.controller;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pdf")
public class PdfMerger {
@GetMapping
public void merge(HttpServletResponse response) {
Document document = new Document(PageSize.LETTER);
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment; filename=\"merged.pdf\"");
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
PdfCopy copy = new PdfCopy(document, outputStream);
document.open();
for (InputStream file : getPdfs()) {
copy.addDocument(new PdfReader(file)); // writes directly to the output stream
}
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen()) {
document.close();
}
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
private List<InputStream> getPdfs() {
List<InputStream> list = new ArrayList<>();
for (int i = 0; i < 10; i++){
list.add(PdfMerger.class.getResourceAsStream("/pdf/1.pdf"));
list.add(PdfMerger.class.getResourceAsStream("/pdf/2.pdf"));
}
return list;
}
}
Upvotes: 2