java仿百度文库、豆丁在线阅读

来源:互联网 发布:华为软件流程 编辑:程序博客网 时间:2024/04/27 23:16

转:http://blog.csdn.net/sunny_sailor/article/details/7311411

个人感觉写的比较好!!!

由于项目需求,需要开发一个类似百度文库和豆丁那样的在线阅读功能。刚开始不知道如何下手,在百度和谷歌上面搜了下,相关帖子很多,不是内容相互抄袭就是肤浅的空谈(最痛恨的就是这种不负责任行为),没有一点儿参考价值。因为我没少纠结,没少碰到问题,所以就将心得分享下,希望能给看到本文的朋友些许帮助。

实现方式

①   

Txt/Word/Excel/PPT=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览

②   

Txt/Word/Excel/PPT=>PDF(MSOffice+JACOB)=>SWF(pdf2swf)=>FlexPaper浏览

③   

Txt/Word/Excel/PPT=>SWF (FlashPaper)=> FlexPaper浏览

④   

Txt/Word/Excel/PPT=>SWF(print2flash)=> FlexPaper浏览

前两种方式比较麻烦,都是先转成PDF,再转成SWF,最后用FlexPaper浏览。后两种比较快捷,可直接将源文件转为SWF,用FlexPaper浏览。由于FlashPaper不是开源工具,加之Win7系统不兼容(我现在用的系统),所以就没采用第三种实现方式。Print2flash是开源工具,即使公司产品中用到也不会出现版权纠纷,遗憾的是没找到如何用程序控制该工具转换文件的命令。第二种方式转PDF的时候相当复杂,也淘汰掉了。最后直接用的第一种方式。

下载工具

OpenOffice

http://zh.openoffice.org/new/zh_cn/downloads.html

JodConverter

http://dldx.csdn.net/fd.php?i=992314146801277&s=08dbee95a6e2dda1a95aa8cbf4df197b

Swftools(pdf2swf)

http://dldx.csdn.net/fd.php?i=389133735472350&s=2f7430ad3c00cca78ada8b4671a50b24

FlexPaper

http://flexpaper.googlecode.com/files/FlexPaper_1.4.5_flash.zip

① 、打开MyEclipse,新建WEB工程。我的Demo如下图:

示例工程结构

② 、将下载的JodConverter压缩包中lib目录下的jar包放到工程WEB-INF/lib中。

JodConverter压缩包lib下的jar包

③ 、在WebRoot下新建flexpaper文件夹,把下载的FlexPaper解压缩后的内容放到该文件夹中。

FlexPaper压缩包中的文件

④ 、新建ConvertServlet类,下附该类代码。

 

package 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;

importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;

import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;

importcom.artofsolving.jodconverter.openoffice.converter.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("D:/tomcat7/webapps/readonline/swfFile/s.ppt");

       pdfFile = new File("D:/tomcat7/webapps/readonline/swfFile/s.pdf");

       swfFile = new File("D:/tomcat7/webapps/readonline/swfFile/s.swf");

       System.out.println("第一步:生成文件对象,准备转换");

    }

   

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       doPost(req, resp);

    }

 

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       //转换成pdf文件

       if(sourceFile.exists()) {

           if(!pdfFile.exists()) {

              OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

              try {

                  connection.connect();

                  DocumentConverter converter = newOpenOfficeDocumentConverter(connection);  

                  converter.convert(sourceFile, pdfFile);

                  pdfFile.createNewFile();

                  connection.disconnect(); 

                  System.out.println("第二步:转换为PDF格式 路径" + pdfFile.getPath());

              } catch (java.net.ConnectException e) {

                  e.printStackTrace();

                  System.out.println("OpenOffice服务未启动");

                  throw e;

              } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeExceptione) {

                  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();

       if(!swfFile.exists()){

           if(pdfFile.exists()) {

              try {

                  Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T9");

                  p.waitFor();

                  swfFile.createNewFile();

                  System.out.println("第三步:转换为SWF格式 路径:" + swfFile.getPath());

                  System.out.println("第si步:转换为SWF格式mingcheng:" + swfFile.getName());

                  if(pdfFile.exists()) {

                     pdfFile.delete();

                  }

              } catch (Exception e) {

                  e.printStackTrace();

                  try {

                     throw e;

                  } catch (Exception e1) {

                     // TODO Auto-generatedcatch block

                     e1.printStackTrace();

                  }

              }

           } else {

              System.out.println("PDF文件不存在,无法转换");

           }

       } else {

           System.out.println("已经转为SWF文件,无需再次转换");

       }

       HttpSession session = req.getSession();

       session.setAttribute("fileName", swfFile.getName());

       resp.sendRedirect(req.getContextPath()+"/flexpaper/readFile.jsp");

    }

}

⑤   、web.xml

 

<?xml version="1.0"encoding="UTF-8"?>

<web-app version="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

  <servlet>

    <servlet-name>convertUtil</servlet-name>

    <servlet-class>servlet.ConvertServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>convertUtil</servlet-name>

    <url-pattern>/convertUtil</url-pattern>

  </servlet-mapping>

</web-app>

⑥   、readFile.jsp

 

<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>

<%

String path =request.getContextPath();

String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">

<html xmlns="http://www.w3.org/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="js/flexpaper_flash.js"></script>

  </head>

 

  <body>

    <div style="position:absolute;left:200px;top:10px;">

            <a id="viewerPlaceHolder" style="width:1000px;height:800px;display:block"></a>

           

            <script type="text/javascript">

                varfp = new FlexPaperViewer(  

                      'FlexPaperViewer',

                      'viewerPlaceHolder', { config : {

                      SwfFile : escape('http://localhost:8080/readonline/swfFile/<%=(String)session.getAttribute("fileName")%>'),

                      Scale : 0.6,

                      ZoomTransition: 'easeOut',

                      ZoomTime : 0.5,

                      ZoomInterval : 0.2,

                      FitPageOnLoad: true,

                      FitWidthOnLoad: false,

                      PrintEnabled : false,

                      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>

需要注意的问题

①   

ConvertServlet中的p.waitFor();很重要,如果没有改行代码,可能出现PDF不能成功转换成SWF的情况。

②   

新建readFile.jsp的时候一定要把<head>标签中间的<base href="<%=basePath%>">删掉,否则FlexPaper不能浏览文件。

③   

FlexPaper不能正常浏览文件的时候,可以试试在官网添加信任。网址http://www.cnblogs.com/qinpeifeng107/archive/2011/08/29/2158879.html

④   

readFile.jsp中动态显示文件名称的写法:第一种SwfFile : escape('http://localhost:8080/readonline/swfFile/<%=(String)session.getAttribute("fileName")%>'); 第二种:escape('../swfFile/<%=(String)session.getAttribute("fileName")%&gt;')

⑤   

项目执行需要启动OpenOffice服务,在系统命令窗口执行命令。

cd C:\Program Files\OpenOffice.org 3\program

 

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

实现效果图


第三种实现方式

http://blog.csdn.net/liuyuhua0066/article/details/6603493

安装上FlashPaper之后,将上面网址中的代码替换ConvertServlet中的转换代码即可。FlexPaper用法同上面介绍。

FlashPaper序列号FPD200-59917-97447-41275

如果仍有问题或者想获取Demo或者提出改进请加QQ:897259924

参考资料

http://topic.csdn.net/u/20110712/18/4daf5746-e64e-434d-aeb0-77b05f6c9903.html

http://guojun2sq.blog.163.com/blog/static/643308612011328115516368/

http://www.cnblogs.com/qinpeifeng107/archive/2011/08/29/2158879.html

http://yanjingying1986.iteye.com/blog/713187

http://www.cnblogs.com/compass/articles/2046311.html



0 0
原创粉丝点击