在内存中创建pdf文档

时间:2017-08-30 12:17:42

标签: java pdf-generation pdfbox

我需要在Memory中创建PDF文档我正在使用pdfbox。

这是我的代码,但它会在磁盘上创建文档。

strerror

2 个答案:

答案 0 :(得分:1)

正如@ M.Prokhorov在对你的问题的评论中已经说过的那样,你的代码示例中没有任何内容表明它是在光盘上创建的。特别是{{1你在这里使用的构造函数

PDDocument

的简短形式
document = new PDDocument();

设置缓冲内存使用量,仅使用不受大小限制的主内存(无临时文件)。

因此,除非document = new PDDocument(MemoryUsageSetting.setupMainMemoryOnly()); fillDataInPDF中隐藏有写入文件的内容,否则您的方法会在内存中创建PDF对象模型。

由于我不认为您会隐藏这样一个明显的文件写入,您声称文档在磁盘上创建的可能性很可能意味着您的方法corpPDF的调用方序列化了该模型作为PDF文件到磁盘,,例如像这样

generatePDF

@TilmanHausherr指出你可以将你的PDF保存到PDDocument doc = generatePDF(name, v1, v2, v3, v4); doc.save("SOME_FILE_PATH_ON_DISC"); ,并且可以将其转换为字节数组,,例如而不是上面你应该使用

ByteArrayOutputStream

所以将序列化的PDF文件保存在内存中。

答案 1 :(得分:0)

我能够在内存中创建PDF并使用PDFBox在新标签页中打开。 我已经编写了此资源处理程序方法。只需编写以下代码即可。

HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDDocument doc = new PDDocument();

PDPage page = new PDPage();
doc.addPage(page);

PDPageContentStream contentStream = new PDPageContentStream(doc, page);

// Your logic for adding content in PDF goes here

contentStream.close();

doc.save(baos);

response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public");
response.setContentType("application/pdf"); 
response.setContentLength(baos.size()); 
ServletOutputStream out = response.getOutputStream(); 
baos.writeTo(out); 
out.flush();