java 仿百度文库源码_网页文档在线浏览(仿百度文库设计)

本文档详细介绍了如何使用Java、OpenOffice.org、SWFTools和FlexPaper实现网页上的文档在线预览功能。首先,通过配置开发环境,如Tomcat和JDK,然后介绍了OpenOffice.org的安装和作为服务启动。接着,利用JODConverter将Office文档转换为PDF,再通过SWFTools将PDF转换为SWF,以便于FlexPaper播放。文章提供了Java代码示例,包括DOC2PDFUtil和PDF2SWFUtil,以及在JSP中执行转换的步骤。最后,提到了FlexPaper在线浏览SWF文档的实现,并警告了flexpaper对中文路径支持的问题和二次开发的需求。
摘要由CSDN通过智能技术生成

openoffice.org3+swftools+flexpaper(一)之tomcat6.0+jdk1.6环境配置

仿百度文库设计,是笔者很早就想模仿实现的,刚好有一个项目,催促我学习开发。其实网上关类似的文章很多,但笔者想根据自己的开发经验,总结这次的成果。

首先,笔者的开发环境是Myeclipse+tomcat6.0+jdk1.6

其次,为了使doc、pdf等格式的文档能够在线浏览,需要一个插件,即felxpaper。它是一款flash的播放软件,即支持swf文件的在线播放。所以,我们需要把doc、pdf等文件转换为flash文件,然后再用flexpap在线浏览。openoffice的功能很强大,可以把doc文件转换为pdf、swf等格式。swftools可以把pdf文件转换为swf文件。

最后,通过耐心的编写代码,即可。

关于tomcat、jdk的配置,笔者不想过多阐述,这是每个开发人员具备的基础。

openoffice.org3+swftools+flexpaper(二)之openoffice.org的安装

安装openoffice.org

openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行。

主要模块有writer(文本文档),impress(演示文稿),Calc(电子表格),Draw(绘图),Math(公式),base(数据库)

笔者下载的是OpenOffice.org 3.4.0 Final.exe。下载完直接安装即可。

但是,我们还需要启动openoffice server。有两种做法:

1.以命令行方式启动openoffice server,缺点是每次系统重启,都需要手动去把openoffice server启动。

2.将openoffice server作为操作系统的服务启动,既然成为了系统服务,就可以设定开机自动启动了。

我们先来看第一种方式,

1.以命令行方式启动openoffice server

在cmd命令下,cd opeonofiice的安装路径/program 如:cd c:\program files\openoffice.org 3\program

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

2.以系统服务的方式启动

这里我们还需要Windows Resource Kit tools ,将openoffice server设为系统服务。

Windows Resource Kit tools 是微软专为管理人员、开发人员和高级用户开发的,包括管理活动目录、组策略、TCP/IP网络、注册表、系统安全、监测等涉及Windows Server 2003 操作系统的其它很多方面的非常规安装的工具组件。Resource Kit Tools for XP的发布使得XP用户也能使用Resource Kit Tools对这些问题进行处理。

下载windows resource kit tools,我们进行默认安装。

1.打开Windows Resource Kit Tools

在Command Shell执行以下命令:

"C:\Program Files\Windows Resource Kits\Tools\instsrv" OpenOfficeUnoServer "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

打开 管理工具->服务 可以找到以 OpenOfficeUnoServer 命名的服务

2.打开注册表寻找以下路径

HKEY_LOCAL_MACHINE -> SYSTEM ->ControlSet001 ->Services ->OpenOfficeUnoServer

新建项 Parameters,在该项下添加两个字符串值:

key:Application

value:C:\Program Files\OpenOffice.org 3\program\soffice.exe

key:AppParameters

value:-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard

3.在服务控制台,启动 openoffice 服务

4.在CMD中用以下命令查看8100是否已被监听:netstat -anop tcp

这样OpenOffice3.0就以服务方式运行在Windows系统上了。(使用cmd命令:netstat -anp tcp查看8100端口是否工作)

然後可以通过socket方式连接openOffice,以使用openoffice提供的某些服务,如文件转换服务,ms office转pdf等等。

开源项目 JODConverter 就是结合openoffice来进行文档转换的java组件。

另外有一个命令行工具swftools,该工具可以将pdf转换为swf格式的文档,提供给ie客戶端流览。

另外,我们可以将该配置用bat文件来快速实现,运行前请先修改相应目录参数:

openoffice service.bat文件

"C:\Program Files\Windows Resource Kits\Tools\instsrv" OpenOfficeUnoServer "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /ve /d

reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /v Application /t REG_SZ /d "C:\Program Files\OpenOffice.org 3\program\soffice.exe"

reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /v AppParameters /t REG_SZ /d "-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard"

openoffice.org3+swftools+flexpaper(三)之使用JODConverter将office文档转换为pdf

JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用

OpenOffice来进行转换工作,它能进行以下的转换工作:

1.Microsoft Office格式转换为OpenDucument,以及OpenDucument转换为Microsoft Office

2.OpenDucument转换为PDF,Word、Excel、PowerPoint转换为PDF,RTF转换为PDF等。

它是一个开源项目。

下载最新版的jodconverter-2.2.2,把lib文件夹的包导入到你的DocConverter项目的lib文件夹内。

(假设你的项目是DocConverter)

新建DOC2PDFUtil.java

代码:package com.iori.webapp.util;

import java.io.File;

import java.io.IOException;

import java.net.ConnectException;

import java.util.Date;

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;

public class DOC2PDFUtil extends java.lang.Thread {

private File inputFile;//需要转换的文件private File outputFile;//输出的文件public DOC2PDFUtil(File inputFile, File outputFile) {

this.inputFile = inputFile;

this.outputFile = outputFile;

}

public void docToPdf() {

Date start = new Date();

OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

try {

connection.connect();

DocumentConverter converter = new OpenOfficeDocumentConverter(connection);

converter.convert(inputFile, outputFile);

} catch (ConnectException cex) {

cex.printStackTrace();

} finally {

//close the connectionif (connection != null) {

connection.disconnect();

connection = null;

}

}

}

/*** 由于服务是线程不安全的,所以……需要启动线程*/

public void run() {

this.docToPdf();

}

public File getInputFile() {

return inputFile;

}

public void setInputFile(File inputFile) {

this.inputFile = inputFile;

}

public File getOutputFile() {

return outputFile;

}

public void setOutputFile(File outputFile) {

this.outputFile = outputFile;

}

/*** 测试main方法

*@paramargs*/

public static void main(String[] args) {

File inputFile = new File("c://temp//333.xls");

File outputFile = new File("c://temp//333.pdf");

DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);

dp.start();

}

}

在DOC2PDFUtil.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。

在jsp中执行

新建MyDOC2PDFTest.jsp

File inputFile = new File("c://temp//333.xls");

File outputFile = new File("c://temp//333.pdf");

DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);

dp.start();

%>

Simple jsp page

在项目DocConverter根目录,右键属性 - >Run as - >MyEclipse Server Application

发布到之前安装的Tomcat 6.0的根目录,然后用url路径访问:Http://localhost:8080/DocConverter/MyDOC2PDFTest.jsp 进行测试。

JODConverter将office文档转换pdf,用到的代码如下:

File inputFile = new File("c://temp//333.xls");

File outputFile = new File("c://temp//333.pdf");

//链接 一个运行在8100端口的OpenOffice.org 实例OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

connection.connect();

//创建一个converter对象并转换格式DocumentConverter converter = new OpenOfficeDocumentConverter(connection);

converter.convert(inputFile, outputFile);

//关闭连接connection.disconnect();

openoffice.org3+swftools+flexpaper(四)之使用swftools将pdf转换为swf

建议下载swftools-0.9.1,笔者起先下载的是最新版的swftools-1.0版。貌似转换时出错,缺少什么组件。

注意:使用此软件会出现转换中文文档时乱码。

下面是一些常用的解决办法:

1.txt转换swf,发生中文乱码。

txt转换为utf-8编码,或txt格式手动改为odt,上传就不会发生乱码。从根源上解决,暂时就算了...暂时不想去纠结这些鸡毛。

2.加密的pdf可能导致转换为swf失败。

3.Microsoft Excel在公式运算中支持文本型的数值,而OpenOffice.org Calc不支持

此问题暂无解,请手动将Excel中文本型的数值修改为数值型的数值。

4.部分Excel存在过于丰富的样式(大部分指没有数据的单元格也填充了各种样式),即使用专业Adobe Acrobat 7(或9) Pro来进行转换,

本来可能预计将产生20-30分页的pdf,结果却产生800-900分页的pdf。此类文档在线转换,难以避免的将导致转换死锁。

请在你的Excel文档中删除多余的,毫无必要的样式,或者你有更灵活的做法。

5.有些中文PDF文件转换为SWF后,出现乱码(特别一些专业期刊)

1.下载XPDF:xpdf-chinese-simplified.tar.gz

2.下载字体:gkai00mp.rar

3.修改xpdf-chinese-simplified目录下的add-to-xpdfrc文件。将里面的路径设为自己的路径:

#----- begin Chinese Simplified support package (2011-sep-02)

cidToUnicode Adobe-GB1    C:\xpdf-chinese-simplified\Adobe-GB1.cidToUnicode

unicodeMap   ISO-2022-CN C:\xpdf-chinese-simplified\ISO-2022-CN.unicodeMap

unicodeMap   EUC-CN         C:\xpdf-chinese-simplified\EUC-CN.unicodeMap

unicodeMap   GBK              C:\xpdf-chinese-simplified\GBK.unicodeMap

cMapDir        Adobe-GB1    C:\xpdf-chinese-simplified\CMap

toUnicodeDir                     C:\xpdf-chinese-simplified\CMap

fontDir                             C:\WINDOWS\Fonts

displayCIDFontTT Adobe-GB1 C:\xpdf-chinese-simplified\CMap\gkai00mp.ttf

#fontFileCC Adobe-GB1 /usr/..../gkai00mp.ttf

#----- end Chinese Simplified support package

4.参照上面的代码,在调用pdf2swf命令中加入“ -s languagedir=D:\\xpdf\\xpdf-chinese-simplified ”参数。

PDF2SWFUtil.java

String cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/" + fileName + ".swf\" -T 9 -s languagedir=c:\\xpdf-chinese-simplified";

这样乱码的问题就解决了。

继续笔者的DocConverter项目。笔者使用的开发环境是MyEclipse 9.0。

新建PDF2SWFUtil.java

package com.iori.webapp.util;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

public class PDF2SWFUtil {

/*** 利用SWFTools工具将pdf转换成swf,转换完后的swf文件与pdf同名

*@authoriori

*@paramfileDir PDF文件存放路径(包括文件名)

*@paramexePath 转换器安装路径

*@throwsIOException*/

public static synchronized void pdf2swf(String fileDir, String exePath) throws IOException {

//文件路径String filePath = fileDir.substring(0, fileDir.lastIndexOf("/"));

//文件名,不带后缀String fileName = fileDir.substring((filePath.length() + 1), fileDir.lastIndexOf("."));

Process pro = null;

if (isWindowsSystem()) {

//如果是windows系统//命令行命令String cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/" + fileName + ".swf\"";

//Runtime执行后返回创建的进程对象pro = Runtime.getRuntime().exec(cmd);

} else {

//如果是linux系统,路径不能有空格,而且一定不能用双引号,否则无法创建进程String[] cmd = new String[3];

cmd[0] = exePath;

cmd[1] = fileDir;

cmd[2] = filePath + "/" + fileName + ".swf";

//Runtime执行后返回创建的进程对象pro = Runtime.getRuntime().exec(cmd);

}

//非要读取一遍cmd的输出,要不不会flush生成文件(多线程)new DoOutput(pro.getInputStream()).start();

new DoOutput(pro.getErrorStream()).start();

try {

//调用waitFor方法,是为了阻塞当前进程,直到cmd执行完pro.waitFor();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/*** 判断是否是windows操作系统

*@authoriori

*@return*/

private static boolean isWindowsSystem() {

String p = System.getProperty("os.name");

return p.toLowerCase().indexOf("windows") >= 0 ? true : false;

}

/*** 多线程内部类

* 读取转换时cmd进程的标准输出流和错误输出流,这样做是因为如果不读取流,进程将死锁

*@authoriori*/

private static class DoOutput extends Thread {

public InputStream is;

//构造方法public DoOutput(InputStream is) {

this.is = is;

}

public void run() {

BufferedReader br = new BufferedReader(new InputStreamReader(this.is));

String str = null;

try {

//这里并没有对流的内容进行处理,只是读了一遍while ((str = br.readLine()) != null);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (br != null) {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

/*** 测试main方法

*@paramargs*/

public static void main(String[] args) {

//转换器安装路径String exePath = "c:/Program Files/SWFTools/pdf2swf.exe";

try {

PDF2SWFUtil.pdf2swf("c:/temp/333.pdf", exePath);

} catch (IOException e) {

System.err.println("转换出错!");

e.printStackTrace();

}

}

}

在PDF2SWFUtil.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。

在jsp中执行

新建MyPDF2SWFTest.jsp

//转换器安装路径String exePath = "c:/Program Files/SWFTools/pdf2swf.exe";

try {

PDF2SWFUtil.pdf2swf("c:/temp/333.pdf", exePath);

} catch (IOException e) {

System.err.println("转换出错!");

e.printStackTrace();

}

%>

Simple jsp page

在项目DocConverter根目录,右键属性 - >Run as - >MyEclipse Server Application

发布到之前安装的Tomcat 6.0的根目录,然后用url路径访问:Http://localhost:8080/DocConverter/MyPDF2SWFTest.jsp 进行测试。

openoffice.org3+swftools+flexpaper(五)之转换pdf的同时,进一步转换为swf

新建DocConverter.java

package com.iori.webapp.util;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

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;

/** doc docx格式转换

* @author Administrator*/

public class DocConverter {

private static final int environment=1;//环境1:windows 2:linux(涉及pdf2swf路径问题)private String fileString;

private String outputPath="";//输入路径,如果不设置就输出在默认位置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)

{

this.fileString=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(8100);

try

{

connection.connect();

DocumentConverter converter=new OpenOfficeDocumentConverter(connection);

converter.convert(docFile,pdfFile);

//close the connectionconnection.disconnect();

System.out.println("****pdf转换成功,PDF输出:"+pdfFile.getPath()+"****");

}

catch(java.net.ConnectException e)

{

//ToDo Auto-generated catch blocke.printStackTrace();

System.out.println("****swf转换异常,openoffice服务未启动!****");

throw e;

}

catch(com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e)

{

e.printStackTrace();

System.out.println("****swf转换器异常,读取转换文件失败****");

throw e;

}

catch(Exception e)

{

e.printStackTrace();

throw e;

}

}

else

{

System.out.println("****已经转换为pdf,不需要再进行转化****");

}

}

else

{

System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");

}

}

/** 转换成swf*/

private void pdf2swf() throws Exception

{

Runtime r=Runtime.getRuntime();

if(!swfFile.exists())

{

if(pdfFile.exists())

{

if(environment==1)//windows环境处理{

try {

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

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.out.print(loadStream(p.getInputStream()));

System.err.println("****swf转换成功,文件输出:"+swfFile.getPath()+"****");

if(pdfFile.exists())

{

pdfFile.delete();

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

else if(environment==2)//linux环境处理{

try {

Process p=r.exec("pdf2swf "+pdfFile.getPath()+" -o "+swfFile.getPath()+" -T 9");

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.err.println("****swf转换成功,文件输出:"+swfFile.getPath()+"****");

if(pdfFile.exists())

{

pdfFile.delete();

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

}

else {

System.out.println("****pdf不存在,无法转换****");

}

}

else {

System.out.println("****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()

{

if(swfFile.exists())

{

System.out.println("****swf转换器开始工作,该文件已经转换为swf****");

return true;

}

if(environment==1)

{

System.out.println("****swf转换器开始工作,当前设置运行环境windows****");

}

else {

System.out.println("****swf转换器开始工作,当前设置运行环境linux****");

}

try {

doc2pdf();

pdf2swf();

} catch (Exception e) {

//TODO: Auto-generated catch blocke.printStackTrace();

return false;

}

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)

{

this.outputPath=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");

}

}

}

public static void main(String s[])

{

DocConverter d=new DocConverter("c:/temp/111.ppt");

d.conver();

}

}在DocConverter.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。笔者分别进行单个转换,及批量转换,都测试可行。openoffice.org3+swftools+flexpaper(六)之flexpaper在线浏览swf文档FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用,

使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持。它可以被当做Flex的库来使用。

另外你也可以通过将一些例如Word、PPT等文档转成PDF,然后实现在线浏览。

下载FlexPaper_1.2.4_flash(1).zip即可

解压后,文件如图:

44117652_1.jpg

FlexPaper项目中有演示demo,即打开FlexPaperViewer.html便可在线浏览文档Paper.swf,这里笔者不多述。

综上,一个完整的在线文档浏览方案。

但是需要注意一个问题,flexpaper不支持中文路径,若想使用中文路径,需要进行felxpaper的二次开发,有点麻烦。需要下载adobe flash bulider软件以及flexPaper源代码。读者可下载flexpaper二次开发教程,进行相应的修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值