0

请参阅下面的更新问题(不是最上面的问题)。

我尝试使用此功能在 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;
}
4

2 回答 2

2

Liferay 是一个门户服务器;它的用户界面在浏览器中运行。AWT 是桌面 UI 的 Java 1.0 基础。

我不认为 AWT 是显示它的方式。

为什么不能使用 application/pdf MIME 类型打开文件并将字节流式传输到 portlet?

于 2013-06-15T02:26:12.050 回答
1

你必须先在你的机器上安装 openoffice http://www.liferay.com/documentation/liferay-portal/6.1/user-guide/-/ai/openoffice

使用 liferay 配置 openoffice 后,您可以使用 liferay 中的 DocumentConversionUtil 类来转换文档。

DocumentConversionUtil.convert(String id, InputStream is, String sourceExtension,String targetExtension)

上面的代码将返回输入流。转换后,您可以在浏览器中显示 pdf 希望这对您有帮助!!

于 2013-06-17T06:06:22.690 回答