Streaming Merge PDF

Felipe Regalgo :

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 :)

gurbieta :

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;
  }

}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=145310&siteId=1