在Java EE中存储生成的PDF的位置

时间:2013-12-16 12:09:56

标签: java java-ee pdf file-io

我正在Java EE Web应用程序中生成PDF,目的是将用户链接到它。我的理解是,由于分布式系统上的可访问性可能存在问题,因此不建议从Java EE访问文件系统。这应该不是问题,因为这将始终在单个服务器上运行。但是,我想知道实现我的目标的最好方法。

我之后不需要保留文件,它可以是临时文件,也可以是任何性质的文件。我只需要知道如何处理我生成的文件。

我正在使用PDFBox生成PDF。

我已经尝试将它存储在相对于root的文件系统上,但是我正在使用NetBeans进行Windows操作,因此证明存在问题。服务器当然是基于Linux的,我还没有测试过。它可能在服务器上工作,我只是很难理解为什么这不适用于Windows。 “不工作”是指当我存储文件时,我正在使用此代码:

myDocument.save("/var/PDFTEST2.pdf");

并将文件保存在 C:/var/PDFTEST2.pdf 中,但是正在运行的应用程序无法识别。

我的问题是:

在Java EE应用程序中存储和显示生成的文件的可接受方式是什么?如果这是我正在做的事情(我怀疑),那么是否有可能在Windows中使用它?

谢谢你的时间。

解决方案: 由于建议将文件流式传输到响应,我解决了这个问题。 PDFBox允许您直接“保存”到输出流:

ByteArrayOutputStream output = new ByteArrayOutputStream(); 
PDDocument myDocument = new PDDocument();

//Populate PDDocument...

myDocument.save(output);
myDocument.close();

response.setContentType("application/pdf");

//response.addHeader("Content-Type", "application/force-download"); //--< Use this if you want the file to download rather than display
response.addHeader("Content-Disposition", "inline; filename=\"yourFile.pdf\"");
response.getOutputStream().write(output.toByteArray());

工作得很漂亮!

2 个答案:

答案 0 :(得分:3)

它不可访问,因为它不是Web根文件夹的一部分,因此Web服务器/容器无法通过Web服务该文件。但您可以自由添加一个servlet,它从光盘读取PDF并将其流式传输到响应中。 Google的'FileServlet'或'ImageServlet'将为您提供无数的复制/粘贴示例。

常见示例:http://balusc.blogspot.nl/2009/02/fileservlet-supporting-resume-and.html

答案 1 :(得分:2)

如何使用File.createTempFile()创建临时文件?以下是here

的示例
public void parse(
        InputStream stream, ContentHandler handler,
        Metadata metadata, ParseContext context)
        throws IOException, SAXException, TikaException {
    File tmpFile = File.createTempFile("pdfbox-", ".tmp", null);
    RandomAccess scratchFile = new RandomAccessFile(tmpFile, "rw");

    PDDocument pdfDocument =
        PDDocument.load(new CloseShieldInputStream(stream), scratchFile, true);

    try {
        if (pdfDocument.isEncrypted()) {
            try {
                String password = metadata.get(PASSWORD);
                if (password == null) {
                    password = "";
                }
                pdfDocument.decrypt(password);
            } catch (Exception e) {
                // Ignore
            }
        }
        metadata.set(Metadata.CONTENT_TYPE, "application/pdf");
        extractMetadata(pdfDocument, metadata);
        PDF2XHTML.process(pdfDocument, handler, metadata, extractAnnotationText, enableAutoSpace);
    } finally {
        pdfDocument.close();
        scratchFile.close();
        tmpFile.delete();
    }
}

查看temp.deleteOnExit();

P.S。:1.7.0_25和1.7.0_45之间的Java版本中存在一个错误,其中临时文件无法正常工作。