Java 连续地将数据从内存写入响应流

Java 连续地将数据从内存写入响应流,java,servlets,response,pdfbox,Java,Servlets,Response,Pdfbox,因此,我使用PDFBox根据现有模板自动生成PDF文档。我使用PDFMergerUtility实现了某种解决方案: PDFMergerUtility finalDoc = new PDFMergerUtility(); for (StudentEN student : students) { PDDocument document = PDDocument.load("template.pdf"); PDPage page = (PDPage) document.getDocu

因此,我使用PDFBox根据现有模板自动生成PDF文档。我使用PDFMergerUtility实现了某种解决方案:

PDFMergerUtility finalDoc = new PDFMergerUtility(); 
for (StudentEN student : students) {
    PDDocument document = PDDocument.load("template.pdf");
    PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(0);
    PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true);

    contentStream.beginText();
    // Draw stuff
    contentStream.endText();

    contentStream.close();

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    document.save(out);
    finalDoc.addSource(new ByteArrayInputStream(out.toByteArray()));
    document.close();
}

response.setContentType("application/pdf");
finalDoc.setDestinationStream(response.getOutputStream());
finalDoc.mergeDocuments();

问题是整个文档(可能非常大)直接从内存提供,因此根据其大小,可能会发生OutOfMemory错误。我提出的一个有效的解决方案是将文件保存在磁盘上,并为每个循环附加文件,然后使用IOUtils流式传输生成的文件,但我想知道是否有某种方法可以将循环中的每个文档从内存连续写入响应流,而不必写入磁盘。当我尝试从循环中写入响应时,客户机只接收第一个文档,而忽略所有后续循环。非常感谢您的帮助。

我认为您所做的是正确的做法。首先合并文件,然后对合并后的文件进行流式处理。我会阅读文档以确定为什么您只看到一个文档。PDFBox的体系结构通常不支持在构建文档的同时编写PDF的最终部分。我唯一想到的例外是编辑现有的PDF文件,并以增量更新的方式编写。在这种情况下,您可以在仍在内存中编辑的情况下发送以前的修订。