簡體   English   中英

流式合並 PDF

[英]Streaming Merge PDF

我正在尋找一個 Java PDF 合並解決方案,我可以在我從 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”時,我想現在將它作為流發送給用戶。

希望可以有人幫幫我 :)

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM