请参阅下面的更新问题(不是最上面的问题)。
我尝试使用此功能在 Liferay 上打开任何文档类型(尤其是 PDF)。但我总是收到Awt Desktop is not supported!
功能上所述的消息。如何启用 Awt 桌面?我尝试在互联网上搜索,但一无所获。有人帮忙吗?谢谢。
public void viewFileByAwt(String file) {
try {
File File = new File(getPath(file));
if (File.exists()) {
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().open(File);
} else {
System.out.println("Awt Desktop is not supported!");
}
} else {
//File is not exists
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
来源:http ://www.mkyong.com/java/how-to-open-a-pdf-file-in-java/
更新
正如您在下面的代码中看到的,两种模式(1
用于下载和2
预览)都运行良好,但不幸的是第二种模式(预览模式)仅适用于 PDF。
现在我要做的是,当用户单击preview
按钮时,必须先将 PDF 以外的文件(仅限扩展名:DOC、DOCX、XLS、XLSX、ODT、ODS)转换为 PDF,然后在浏览器上显示与以下代码解释的方式相同。有可能这样做吗?如果将所有转换器都放在一个函数上太难了,那么在一个单独的函数上,每个扩展都可以。
public StreamedContent getFileSelected(final StreamedContent doc, int mode) throws Exception {
//Mode: 1-download, 2-preview
try {
File localfile = new File(getPath(doc.getName()));
FileInputStream fis = new FileInputStream(localfile);
if (mode == 2 && !(doc.getName().substring(doc.getName().lastIndexOf(".") + 1)).matches("pdf")) {
localfile = DocumentConversionUtil.convert(doc.getName(), fis, doc.getName().substring(doc.getName().lastIndexOf(".") + 1), "pdf");
fis = new FileInputStream(localfile.getPath());
}
if (localfile.exists()) {
try {
PortletResponse portletResponse = (PortletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
HttpServletResponse res = PortalUtil.getHttpServletResponse(portletResponse);
if (mode == 1) res.setHeader("Content-Disposition", "attachment; filename=\"" + doc.getName() + "\"");
else if (mode == 2) res.setHeader("Content-Disposition", "inline; filename=\"" + doc.getName() + "\"");
res.setHeader("Content-Transfer-Encoding", "binary");
res.setContentType(getMimeType(localfile.getName().substring(localfile.getName().lastIndexOf(".") + 1)));
res.flushBuffer();
OutputStream out = res.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
buffer = new byte[4096];
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}