实现类似百度文库在线观看功能笔记
(*.*文件-pdf文件-swf文件)
实现方式调研:
网上大致看了下实现的方式(借鉴了前人的文档,在此谢过),发现还是蛮多资料的。大体上有四种转换的方式:
1. Txt/Word/Excel/PPT=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览
2. Txt/Word/Excel/PPT=>PDF(MSOffice+JACOB)=>SWF(pdf2swf)=>FlexPaper浏览
3. Txt/Word/Excel/PPT=>SWF (FlashPaper)=> FlexPaper浏览
4. Txt/Word/Excel/PPT=>SWF(print2flash)=> FlexPaper浏览
上面1,2两种实现方式相对比较复杂,需要先将其他类型转换为PDF类型,再转成SWF类型在容器中显示。所以先看了下后2种,先说说flashpaper吧,此款软件确实是转换格式的神器,可
惜是收费的。不过可以试用30天,对于这种小型的可试用的软件,我一般是装在虚拟机中,一直试用,到期了再恢复快照即可。说实话,效果不错,但不适合开发用,因为木有买的冲动,只能忍痛割爱了!再说说print2flash,这款软件是开源的,也能实现转换swf的功能,但是上网了半天,关于它的代码资料很是匮乏。Java的更是凤毛麟角,无从下手,只好先晾着。希望某位大虾有关于这个的代码资料可以共享,本人感激不尽啊!剩下的只有相对复杂的2种,不多说了,鉴于经典案例及网上资料的丰富性,我最终还是“屈服”在了第一种的组合上了。
资料和工具准备:
工具
OpenOffice
/new/zh_cn/downloads.html
JodConverter
dldx.csdn/fd.php?i=992314146801277&s=08dbee95a6e2dda1a95aa8cbf4df197b
Swftools(pdf2swf)
dldx.csdn/fd.php?i=389133735472350&s=2f7430ad3c00cca78ada8b4671a50b24
FlexPaper
lecode/files/FlexPaper_1.4.5_flash.zip
资料方面,大致搜索了百度文库和开源中国上的一些资料,其实都大同小异。前辈们已经为我们做了很多了,再次谢过各位分享的前辈。
项目目录及源码:
工程目录大致如下:
另外,在lib下需要加入JodConverter压缩包中lib目录下的jar包,全部复制进去即可。
ConvertServlet的servlet处理类代码如下:
package st.servlet;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.tion.OpenOfficeConnection;
import com.artofsolving.tion.SocketOpenOfficeConnection;
import com.artofsolving.verter.OpenOfficeDocumentConverter;
public class ConvertServlet extends HttpServlet {
    private File sourceFile;        //转换源文件
    private File pdfFile;            //PDF目标文件
    private File swfFile;            //SWF目标文件
    private Runtime r;               
   
    public void init() throws ServletException {
        sourceFile = new File("G:\\tomcat6\\webapps\\readonline\\swfFile\\1.doc");
        pdfFile = new File("G:\\tomcat6\\webapps\\readonline\\swfFile\\1.pdf");
        swfFile = new File("G:\\tomcat6\\webapps\\readonline\\swfFile\\Paper.swf");
        System.out.println("第一步:生成文件对象,准备转换");
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    /**
    * The doPost method of the servlet. <br>
    *
    * This method is called when a form has its tag value method equals to post.
    *
    * @param request the request send by the client to the server
    * @param response the response send by the server to the client
    * @throws ServletException if an error occurred
    * @throws IOException if an error occurred
    */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        //转换成pdf文件
        if(sourceFile.exists()) {
            if(!pdfFile.exists()) {
                OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
                try {
                    t();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
                    vert(sourceFile, pdfFile);
                    pdfFile.createNewFile();
                    connection.disconnect(); 
                    System.out.println("第二步:转换为PDF格式    路径" + pdfFile.getPath());
                } catch (java.ConnectException e) {
                    e.printStackTrace();
                    System.out.println("OpenOffice服务未启动");
                    throw e;
                } catch (com.artofsolving.tion.OpenOfficeException e) {
                    e.printStackTrace();
                    System.out.println("读取文件失败");
                    throw e;
                } catch (Exception e){
                    e.printStackTrace();
                    try {
                        throw e;
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            } else {
                System.out.println("已转换为PDF,无需再次转换");
            }
        } else {
            System.out.println("要转换的文件不存在");
        }
        //转换成swf文件
        r = Runtime.getRuntime();
       
        new Thread(){
            @Override
            public void run() {
                if(!swfFile.exists()){
                   
                    if(pdfFile.exists()) {
                        try {
                            System.out.println("E:/ " + pdfFile.getPath() +
                                    " -o " + swfFile.getPath() + " -T 9");
                           
                            Process p = r.exec("E:/ " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
                            p.waitFor();
                            swfFile.createNewFile();
                            System.out.println("第三步:转换为SWF格式    路径:" + swfFile.getPath());
                            System.out.println("第si步:转换为SWF格式mingcheng:" + swfFile.getName());
//                            ists()) {
//                                pdfFile.delete();
//                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            try {
                                throw e;
                            } catch (Exception e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                        }
                    } else {
                        System.out.println("PDF文件不存在,无法转换");
                    }
                } else {
                    System.out.println("已经转为SWF文件,无需再次转换");
                }
            }
           
        }.start();
       
        HttpSession session = Session();
        session.setAttribute("fileName", swfFile.getName());
        System.out.println("我是测试:"+Attribute("fileName"));
        response.ContextPath()+"/readFile.jsp");
    }pdf转html
    }
Readfile.Jsp显示界面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = ContextPath();
String basePath = Scheme()+"://"+ServerName()+":"+ServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="/1999/xhtml" lang="en" xml:lang="en">   
  <head>
   
    <title>在线阅读</title>
        <style type="text/css" media="screen">
            html, body    { height:100%; }
            body { margin:0; padding:0; overflow:auto; } 
            #flashContent { display:none; }
        </style>
        <script type="text/javascript" src="flexpaper/js/flexpaper_flash_debug.js"></script>
        <script type="text/javascript" src="flexpaper/js/jquery.js"></script>
        <script type="text/javascript" src="flexpaper/js/flexpaper_flash.js"></script>
  </head>
 
  <body>
    <div style="position:absolute;left:200px;top:10px;">
   
          <center> <a id="viewerPlaceHolder" style="width:1000px;height:800px;display:block">努力加载中............</a></center>
            <script type="text/javascript">
            $(document).ready(function(){
            var fp = new FlexPaperViewer(   
                        'flexpaper/FlexPaperViewer',
                        'viewerPlaceHolder', { config : {
                        SwfFile : escape('http:\/\/192.168.0.13:8080\/readonline\/swfFile\/<%=Attribute("fileName")%>'),
                        Scale : 0.6,
                        ZoomTransition : 'easeOut',
                        ZoomTime : 0.5,
                        ZoomInterval : 0.2,
                        FitPageOnLoad : true,
                        FitWidthOnLoad : false,
                        PrintEnabled : true,
                        FullScreenAsMaxWindow : false,
                        ProgressiveLoading : true,
                        MinZoomSize : 0.2,
                        MaxZoomSize : 5,
                        SearchMatchAll : false,
                        InitViewMode : 'Portrait',
                       
                        ViewModeToolsVisible : true,
                        ZoomToolsVisible : true,
                        NavToolsVisible : true,
                        CursorToolsVisible : true,
                        SearchToolsVisible : true,
                         
                          localeChain: 'zh_CN'
                        }});
            });
               
            </script>
        </div>
       
  </body>
</html>
要特别注意的是:FlexPaperViewer的路径一定要正确,id对上。另外,可以用官方的Paper.swf作为测试,只需要将SwfFile的地址改掉即可。
大致显示效果如下:
除此之外,关于一直加载无法显示的问题和无法打开自有swf文件的问题,据说是adobe的信任问题,还在解决中!测试了一下,好像生成的速度还行,就是貌似有servlet请求超时导致请求中断的情况!反正基本差不多了,就差优化了!就这样吧。