[英]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.