开发者社区> 余二五> 正文

Java模拟实现百度文档在线浏览

简介:
+关注继续查看

这个思路是我参考网上而来,代码是我实现。

采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览。

ok,

A、下载OpenOffice (转换资源文件)

B、下载JodConverter(调用OpenOffice)

C、下载Swftools(Pdf2Swf)

D、下载 FlexPaper(浏览swf文件)


这里我已经全部下载好了,大家只需要下载:http://down.51cto.com/data/1980603


下载之后,先别急安装,请看完这篇博文


1、先看我们的MyEclipse工程结构

wKiom1TPOomBqJi9AAI16KIMH8Y013.jpg


2、

将我们下载下来的wKiom1TPOwCAE5YQAAAZW7nJ3Nk933.jpg解压之后将所有的jar文件拷贝到baiduDoclib下面去

wKioL1TPPA2was0bAAEC_rTHC-k842.jpg


3、  WebRoot下面新建wKioL1TPPFKQcG8VAAAO_BfzbDc134.jpg文件夹,将解压后的wKiom1TPO5Piigy_AAAg5uWVZqM672.jpg全部拷贝到FlexPaper中去


4、新建BaiDuServlet.java文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package com.baidu.util;
 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
 
import javax.imageio.stream.FileImageInputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
 
/**
 * @Author:NuoYan
 * @Date:2015-2-2 下午2:24:58 
 * TODO: 1、第一步,首先获取到需要查看的文件
 *       2、第二部,将获取的文件(doc,xls,txt,ppt,03/07版本转化为PDF),这一步需要调用OpenOffice
 *       3、第三部,将资源文件转换好的PDF文件转换为swf文件,使用FlexPaperViewer.swf进行浏览查看
 */
public class BaiDuServlet extends HttpServlet {
    private File sourceFile;// 要转化的源文件
    private File pdfFile;// pdf中间文件对象
    private File swfFile;// swf目标文件对象
    private String filePath;// 用来保存文件路径
    private String fileName;// 不包括后缀名的文件名
 
    public File getSourceFile() {
        return sourceFile;
    }
 
    public void setSourceFile(File sourceFile) {
        this.sourceFile = sourceFile;
    }
 
    public File getPdfFile() {
        return pdfFile;
    }
 
    public void setPdfFile(File pdfFile) {
        this.pdfFile = pdfFile;
    }
 
    public File getSwfFile() {
        return swfFile;
    }
 
    public void setSwfFile(File swfFile) {
        this.swfFile = swfFile;
    }
 
    public String getFilePath() {
        return filePath;
    }
 
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
 
    public String getFileName() {
        return fileName;
    }
 
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String saveFileName = request.getParameter("savFile");
        System.out.println(saveFileName);
        String webPath = request.getRealPath("/");
        filePath = webPath + "reader\\" + saveFileName;
        fileName = filePath.substring(0, filePath.lastIndexOf("."));
        // 创建三个文件对象
        sourceFile = new File(filePath);
        pdfFile = new File(fileName + ".pdf");
        swfFile = new File(fileName + ".swf");
        System.out.println(pdfFile);
        System.out.println(swfFile);
        // 1、将源文件转化为pdf格式文件
        src2pdf();
        try {
            // 2、将pdf文件转化为swf文件
            pdf2swf();
        catch (Exception e) {
            e.printStackTrace();
        }
        // 将转化好的文件绑定到session上去
        request.getSession().setAttribute("swfName", swfFile.getName());
        System.out.println(swfFile.getName());
        // 重定向到预览页面
        response.sendRedirect(request.getContextPath() + "/reader/baseFile.jsp");
    }
 
    /**
     * @Author:NuoYan
     * @Date:2015-2-2 下午2:28:22 TODO://源文件转化为PDF文件
     */
    private void src2pdf() {
        if (sourceFile.exists()) {
            // 如果不存在,需要转份为PDF文件
            if (!pdfFile.exists()) {
                // 启用OpenOffice提供的转化服务
                OpenOfficeConnection conn = new SocketOpenOfficeConnection(8100);
                // 连接OpenOffice服务器
                try {
                    conn.connect();
                    // 建立文件转换器对象
                    DocumentConverter converter = new OpenOfficeDocumentConverter(
                            conn);
                    converter.convert(sourceFile, pdfFile);
                    // 断开链接
                    conn.disconnect();
                    System.out.println("转换成功");
                catch (ConnectException e) {
                    e.printStackTrace();
                }
            else {
                System.out.println("已经存在PDF文件,不需要在转换!!");
            }
        else {
            System.out.println("文件路径不存在!!!");
        }
 
    }
 
    /**
     * @Author:NuoYan
     * @Date:2015-2-2 下午2:28:32
     * @throws Exception
     * TODO:PDF转化为SWF文件
     */
    private void pdf2swf() throws Exception {
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                String command = "C:\\Pdf2swf\\pdf2swf.exe "
                        + pdfFile.getPath() + " -o " + swfFile.getPath()
                        " -T 9";
                System.out.println("转换命令:" + command);
                // Java调用外部命令,执行pdf转化为swf
                Runtime r = Runtime.getRuntime();
                Process p = r.exec(command);
                System.out.println(loadStream(p.getInputStream()));
                System.out.println("swf文件转份成功!!!");
                System.out.println(swfFile.getPath());
            else {
                System.out.println("不存在PDF文件");
            }
        }
 
    }
     
    private static String loadStream(InputStream in) throws Exception {
        int len = 0;
        in = new BufferedInputStream(in);
        StringBuffer buffer = new StringBuffer();
        while ((len = in.read()) != -1) {
            buffer.append((char) len);
        }
        return buffer.toString();
    }
 
}


5、修改index.jsp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>百度文库在线预览</title>
   <meta http-equiv="pragma" content="no-cache">
   <meta http-equiv="cache-control" content="no-cache">
   <meta http-equiv="expires" content="0">    
   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
   <meta http-equiv="description" content="This is my page">
  </head>
  <body>
   <a href="<%=request.getContextPath()%>/BaiDuServlet?savFile=1234.xls">在线预览</a>
  </body>
</html>


6、编写baseFile.jsp文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>在线阅读</title>
<script type="text/javascript" src="../FlexPaper/js/flexpaper_flash.js"></script>
<style type="text/css">
html,body{height: 100%;}
body {
    margin: 0;padding: 0;overflow: auto;
}
#flashContent { display:none; }
</style>
</head>
<body>
<div style="position:absolute;left:10px;top:10px;">
            <a id="viewerPlaceHolder" style="width:1000px;height:480px;display:block"></a>
            <script type="text/javascript"
                var fp = new FlexPaperViewer(  
                         '../FlexPaper/FlexPaperViewer',
                         'viewerPlaceHolder', { config : {
                         SwfFile : escape('../reader/<%=(String)session.getAttribute("swfName")%>'),
                         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',
                         PrintPaperAsBitmap : false,
                          
                         ViewModeToolsVisible : true,
                         ZoomToolsVisible : true,
                         NavToolsVisible : true,
                         CursorToolsVisible : true,
                         SearchToolsVisible : true,
                           
                           localeChain: 'zh_CN'
                         }});
            </script>
        </div>
 
</body>
</html>


注意baseFile.jsp中的代码,不会你可以参考这里


wKiom1TPPH6w-eXHAADBd6XYdeo117.jpg


/**************************************************************************************/


7、到这里就完成,需要注意的是:

1、wKioL1TPPbDCQ7SOAAAj1OEioRA406.jpg文件安装路径不要太深,不然Java调用外部命令不能执行,我这里是C盘下

wKioL1TPPdeTPZf0AAAk56wHaeA554.jpg


2、wKioL1TPPfzR23txAACPHt6wVzY664.jpg

    2.1、红色1标记路径不能错,我就犯这个错误了        

    2.2、红色标记2还可以写http://127.0.0.1:8080/baiduDoc/reader/...


3、启动OpenOffice的命令,不是直接双击启动的。官网启动方式,使用cd命令打开安装目录!

安装完openoffice后

1.安装服务

cd C:\Program Files (x86)\OpenOffice4\program

这一步你可以看你的OpenOffice安装哪里

执行

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

2.查看是否安装成功

   2.1查看端口对应的pid

   netstat -ano|findstr "8100"

   2.2查看pid对应的服务程序名

   tasklist|findstr "ipd值"


效果图示:


wKiom1TQKE7xDqSxAAPNwcLtPA4361.jpg


源码地址:


http://down.51cto.com/data/1980608










本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1610836,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
141 0
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
298 0
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
209 0
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
183 0
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
298 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
197 0
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
137 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
102 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
109 0
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
73 0
+关注
余二五
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
JAVA开发手册1.5.0
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多