为了账号安全,请及时绑定邮箱和手机立即绑定

流式合并 PDF

流式合并 PDF

凤凰求蛊 2023-06-14 14:32:39
    我正在寻找一个 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 的堆内存。换句话说,当我从 rest 获得“contentBytes pdf”时,我现在想将它作为流媒体发送给用户。希望可以有人帮帮我 :)
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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

  }


}



查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信