将office文档转换为pdf并在浏览器上显示

时间:2013-06-15 02:19:49

标签: jsf pdf liferay converter fileinputstream

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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)

上面的代码将返回inputstream。完成此转换后,您可以在浏览器中显示pdf 希望这可以帮助你!!