flexpaper 在线观看 PPT,PDF,DOC等文档

0、安装环境。可以参考http://www.cnblogs.com/star-studio/archive/2011/12/09/2281807.html     百度关键字 仿百度文库方案

1、借用开源工具flexpaper

2、使用工具类,这个类是前人都已经做好的。在此借用一下!

  

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.zkhy.fw.core.util.FWLogger;
import com.zkhy.web.core.constants.Constants;
import com.zkhy.web.core.property.ApplicationConfig;

/**
 * doc docx格式转换
 * 
 * @see <a
 *      href="http://www.cnblogs.com/star-studio/archive/2011/12/12/2284417.html">http://www.cnblogs.com/star-studio/archive/2011/12/12/2284417.html</a>
 */
public class DocConverter {
    private static FWLogger logger = new FWLogger();

    // 环境1:windows 2:linux(涉及pdf2swf路径问题)
    private static final int SYSTEM_OS = Integer.valueOf(ApplicationConfig.Settings.SystemOs.getValue());
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;

    public DocConverter(String fileString) {
        ini(fileString);
    }

    /* 重新设置 file
     * 
     * @param fileString */
    public void setFile(String fileString) {
        ini(fileString);
    }

    /* 初始化
     * 
     * @param fileString */
    private void ini(String fileString) {
        fileName = fileString.substring(0, fileString.lastIndexOf("."));
        docFile = new File(fileString);
        pdfFile = new File(fileName + ".pdf");
        swfFile = new File(fileName + ".swf");
    }

    /* 转为PDF
     * 
     * @param file */
    private void doc2pdf() throws Exception {
        if (docFile.exists()) {
            if (!pdfFile.exists()) {
                OpenOfficeConnection connection =
                    new SocketOpenOfficeConnection(ApplicationConfig.Settings.OpenOfficeIp.getValue(),
                        Integer.valueOf(ApplicationConfig.Settings.OpenOfficePort.getValue()));
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile, pdfFile);
                    // close the connection
                    connection.disconnect();
                    logger.info("pdf转换成功,PDF输出:" + pdfFile.getPath());
                } catch (ConnectException e) {
                    logger.errorText("swf转换异常,openoffice服务未启动!");
                    throw e;
                } catch (OpenOfficeException e) {
                    logger.errorText("swf转换器异常,读取转换文件失败");
                    throw e;
                } catch (Exception e) {
                    logger.error(e);
                    throw e;
                }
            } else {
                logger.info("已经转换为pdf,不需要再进行转化");
            }
        } else {
            logger.errorText("swf转换器异常,需要转换的文档不存在,无法转换");
        }
    }

    
    /* 转换成swf */
    private void pdf2swf() throws Exception {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                if (SYSTEM_OS == Constants.SYSTEM_OS_WINDOWS)// windows环境处理
                {
                    try {
                        System.out.println(ApplicationConfig.Settings.Pdf2SwfPath.getValue()); 
                        Process p =
                            r.exec(ApplicationConfig.Settings.Pdf2SwfPath.getValue() + " "
                                + pdfFile.getPath() + " -o "
                                + swfFile.getPath() + " -T 9");
                        logger.info(loadStream(p.getInputStream()));
                        logger.errorText(loadStream(p.getErrorStream()));
                        logger.info(loadStream(p.getInputStream()));
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                        if(swfFile.exists())//add by gjf 
                        {
                            File contextFile = new File(Constants.swffilesPath.substring(0, Constants.swffilesPath.lastIndexOf(Constants.WEB_SEPARATOR)));
                            if (!contextFile.exists()) {
                                // 创建目录
                                contextFile.mkdirs();
                            }
                            File fnew = new File(Constants.swffilesPath); 
                            swfFile.renameTo(fnew);//移到项目目录下
                            swfFile.delete();
                            logger.info("swf转换成功,文件输出:" + fnew.getPath());

                        }                   //end add
                    } catch (Exception e) {
                        logger.error(e);
                        throw e;
                    }
                } else if (SYSTEM_OS == Constants.SYSTEM_OS_LINUX)// linux环境处理
                {
                    try {
                        Process p = r.exec("pdf2swf " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
                        logger.info(loadStream(p.getInputStream()));
                        logger.errorText(loadStream(p.getErrorStream()));
                        logger.info("swf转换成功,文件输出:" + swfFile.getPath());
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                        if(swfFile.exists())//add by gjf 。。。这些是特殊处理,在转换成SWF文件时,文件名和路径中不能有空格,故需要将建好的SWF文件移到TOMCAT目录下。
                        {
                            File contextFile = new File(Constants.swffilesPath.substring(0, Constants.swffilesPath.lastIndexOf(Constants.WEB_SEPARATOR)));
                            if (!contextFile.exists()) {
                                // 创建目录
                                contextFile.mkdirs();
                            }
                            File fnew = new File(Constants.swffilesPath); 
                            swfFile.renameTo(fnew);//移到项目目录下
                            swfFile.delete();
                            logger.info("swf转换成功,文件输出:" + fnew.getPath());

                        }    
                    } catch (Exception e) {
                        logger.error(e);
                        throw e;
                    }
                }
            } else {
                logger.errorText("pdf不存在,无法转换");
            }
        } else {
            logger.info("swf已存在不需要转换");
        }
    }

    static String loadStream(InputStream in) throws IOException {
        int ptr = 0;
        in = new BufferedInputStream(in);
        StringBuffer buffer = new StringBuffer();

        while ((ptr = in.read()) != -1) {
            buffer.append((char) ptr);
        }
        return buffer.toString();
    }

    /* 转换主方法 */
    public boolean conver() throws Exception {
        if (swfFile.exists()) {
            logger.info("swf转换器开始工作,该文件已经转换为swf");
            return true;
        }

        if (SYSTEM_OS == Constants.SYSTEM_OS_WINDOWS) {
            logger.debug("swf转换器开始工作,当前设置运行环境windows");
        } else if (SYSTEM_OS == Constants.SYSTEM_OS_LINUX)  {
            logger.debug("swf转换器开始工作,当前设置运行环境linux");
        }

        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
            logger.error(e);
            throw e;
        }
        if (swfFile.exists()) {
            return true;
        } else {
            return false;
        }
    }

    /* 返回文件路径
     * 
     * @param s */
    public String getSwfPath() {
        if (swfFile.exists()) {
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            return tempString;
        } else {
            return "";
        }
    }

    /* 设置输出路径 */
    public void setOutputPath(String outputPath) {
        if (!outputPath.equals("")) {
            String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf("."));
            if (outputPath.charAt(outputPath.length()) == '/') {
                swfFile = new File(outputPath + realName + ".swf");
            } else {
                swfFile = new File(outputPath + realName + ".swf");
            }
        }
    }
}

 3、后台调用

    在考虑到多用户或者当用户并发操作时,可能会尝试系统响应缓慢,因为要多开转换进程。故这里我采用了一个单例模式,即使用一个队列,每次从来个请求放入队列,后天一个线程监视这个队列,有数据时,就转换。这样的好处,虽然速度慢了,但是减小了服务器的并发压力。

    代码如下:

public static Queue<SwfForm> taskQueue = null; //单例  ,SwfForm是根据具体业务,我这里存放的是PPT文件的路径和目标SWF的路径

///调用处
  if (taskQueue == null) {
                taskQueue = new LinkedList<>();
                new fileThread().start();
            }
            if (!taskQueue.offer(swfForm)){// 队列已满
                throw new Exception("SWF任务队列已满");// 回滚事务
            }

//一个内部类,监视线程


    class fileThread extends Thread {

        @Override
        public void run() {
            while (true) {
                if (!taskQueue.isEmpty()) {
                    SwfForm swfForm = taskQueue.poll();
                    File file = new File(swfForm.getPath());
                    try {
                        Constants.swffilesPath =
                         ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/")
                                + swfForm.getSwfPath();//为重命名使用。
                        new DocConverter(file.getPath()).conver();
                    } catch (Exception e) {
                        taskQueue.offer(swfForm);// 失败后,仍将之前的放入队列
                        e.printStackTrace();
                    }
                }
                try {
                    Thread.sleep(10000);//休眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

4、前台代码

showSwf = function(swfFile) {
    if (!swfFile) {
        return;
    }
    $('#documentViewer').FlexPaperViewer(//div ID
            { config : {
                jsDirectory : courseware.swfDirectory,//配置文件路径
                SWFFile :swfFile,//要显示的SWF文件
                Scale : 0.6,
                ZoomTransition : 'easeOut',
                ZoomTime : 0.5,
                ZoomInterval : 0.2,
                FitPageOnLoad : true,
                FitWidthOnLoad : false,
                FullScreenAsMaxWindow : false,
                ProgressiveLoading : false,
                MinZoomSize : 0.2,
                MaxZoomSize : 5,
                SearchMatchAll : false,
                InitViewMode : 'Portrait',
                RenderingOrder : 'flash',
                StartAtPage : '',
                ViewModeToolsVisible : false,
                ZoomToolsVisible : true,
                NavToolsVisible : false,
                CursorToolsVisible : false,
                SearchToolsVisible : true,
                WMode : 'window',
                localeChain: 'zh_CN'
            }}
    );

};

5、注意事项

   特别注意,这里的文件,只能是PDF ,DOC ,DOCX,PPT,PPTX,xls,xlsx等,千万不能用其它软件更改,我之前就用来WPS改了一个文件,导致我浪费了1个下午的时间。

   另外需要注意,文件中,不能有空格。当然这个程序可以处理掉

 

 

posted @ 2014-06-02 17:18  shenghaishiweini  阅读(378)  评论(0编辑  收藏  举报