【问题标题】:Creating pdf document in memory在内存中创建 pdf 文档
【发布时间】:2017-08-30 12:17:42
【问题描述】:

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

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

public PDDocument generatePDF(String name, String v1, String v2, String v3, String v4) {
        PDPageContentStream contentStream = null;
        PDDocument document = null;
        try {
            document = new PDDocument();
            PDPage page = new PDPage();
            document.addPage(page);
            contentStream = new PDPageContentStream(document, page);


            fillDataInPDF(...);
            corpPDF(page);
        } catch (IOException err) {
            LOG.error("Error occured .");
        } finally {
            if (contentStream != null) {
                try {
                    contentStream.close();
                } catch (IOException e) {
                    LOG.error("Error occured .");
                }
            }
        }
        return document;
    }

【问题讨论】:

  • 好的。我同意你在记忆中创造它的愿望。你真的做到了还是没有做某事?
  • 我已经在磁盘上创建了,不知道如何在内存中进行。
  • 您的代码示例中没有任何内容表明它是在光盘上创建的。
  • 您可以将 PDF 保存到 ByteArrayOutputStream 中,并且可以将其转换为字节数组。也许这就是你想要的?
  • @singhal 如果您需要,请点击答案上的绿色复选标记,或者如果您在此问题上需要进一步/不同的帮助,请发表评论。

标签: java pdf-generation pdfbox


【解决方案1】:

@M.Prokhorov 已经在对您的问题的评论中指出,您的代码示例中没有任何内容表明它是在光盘上创建的。 特别是您在此处使用的 PDDocument 构造函数

document = new PDDocument();

的简写形式
document = new PDDocument(MemoryUsageSetting.setupMainMemoryOnly());

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

因此,除非 fillDataInPDFcorpPDF 中隐藏了写入文件的内容,否则您的方法会在内存中创建一个 PDF 对象模型。

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

PDDocument doc = generatePDF(name, v1, v2, v3, v4);
doc.save("SOME_FILE_PATH_ON_DISC");

正如@TilmanHausherr 指出的那样您可以将 PDF 保存到 ByteArrayOutputStream 中,并且可以将其转换为字节数组, 例如而不是上面你应该使用

PDDocument doc = generatePDF(name, v1, v2, v3, v4);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
doc.save(baos);
byte[] pdfBytes = baos.toByteArray();

因此也将序列化的 PDF 文件保存在内存中。

【讨论】:

    【解决方案2】:

    我能够在内存中创建 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();
    

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多