【问题标题】:Streaming Merge PDF流合并 PDF
【发布时间】:2019-12-25 23:03:07
【问题描述】:

我正在寻找一种 Java PDF Merger 解决方案,在该解决方案中,我可以在从 REST API 获取(例如来自 REST API 的示例)PDF 页面部分时流式传输合并的 pdf。 伪代码应该是这样的:

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

我的观点是在开始将其发送给用户之前,不要将内存中的所有 PDF 浪费在堆内存中。换句话说,当我从休息中获得“contentBytes pdf”时,我想现在将其作为流媒体发送给用户。

希望有人可以帮助我:)

【问题讨论】:

    标签: java pdf merge itext pdfbox


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 2016-11-20
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多