我正在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());
工作得很漂亮!
答案 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版本中存在一个错误,其中临时文件无法正常工作。