首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web开发 >

最近实现了双平台上仿豆丁网百度文库阅读doc等文档的例子,分享给大家

2012-12-22 
最近实现了双平台下仿豆丁网百度文库阅读doc等文档的例子,分享给大家http://blog.csdn.net/aimsam/article

最近实现了双平台下仿豆丁网百度文库阅读doc等文档的例子,分享给大家
http://blog.csdn.net/aimsam/article/details/6600983

上张效果图


Java平台要实现类似豆丁百度文科的文档在线阅读,总体思路是讲doc docx等文件格式利用openoffice转换成pdf再用swftools转为swf。再用flexpaper组件显示swf。
 
此过程涉及软件(实测)
openoffice3.2(window) 
swftools-2011-01-23-1815.exe(window)
openoffice3.1.1(linux)
swftools-2011-01-23-1815.tar.gz(linux)
jar包jodconverter-2.2.2(里面lib目录下含多个要用到的jar文件)
flexpaper1.4.0 (直接复制过来,项目上运行成功,本地运行还没成功)
FlexPaper_1.4.5_flash(网上下载的最新版本没试过, 二选一即可)
附上自己写的java转换Demo DocConverter.java
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 connection   
connection.disconnect(); 
System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath() + "****");
} catch (java.net.ConnectException e) {
// TODO Auto-generated catch block
e.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("D:/TOOLS/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 (IOException 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 block
e.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("D:/data/FTP/midlongforecast/midweatherforecast/20010202.xml");
d.conver();
}
}


以上即是所有用到的转换需要用到的文件

windows安装过程省略,linux下安装swftools命令
解压到目录后
./configure 
make 
make install

无论在哪个平台安装完以上两个软件后
需要在将openoffice以服务方式启动
Window 启动方式
cd C:\Program Files\OpenOffice.org 3\program 
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
Linux启动
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &


以上是实现两个平台下的转换,但是会有openoffice解析不了的字体乱码问题,或者显示字体变形等
更高级的web文档应用可以参考QQ邮件,邮件实现了在线预览excel doc pdf等格式文件并可以用鼠标点击选取复制,期待高手解决.

[最优解释]
两次转换不会影响性能吗?
[其他解释]
能发个可执行文件吗,一直想找个这样的软降,如果有一定的文档管理功能就更好了,哈哈哈哈
[其他解释]

引用:
两次转换不会影响性能吗?

文档只要第一次的时候转换就好了,然后存储swf文件以后读取
[其他解释]
引用:
能发个可执行文件吗,一直想找个这样的软降,如果有一定的文档管理功能就更好了,哈哈哈哈

发了你也用不了的.因为jar文件是基于openoffice和swftools这两个软件安装了的情况下才能使用的
[其他解释]
Paper2Flash有直接的接口可以转,只是不知道大规模应用的话效率如何。
[其他解释]
先利用openoffice转换成pdf,再用swftools转为swf!
能不能直接转换成swf?
[其他解释]
引用:
Paper2Flash有直接的接口可以转,只是不知道大规模应用的话效率如何。


这个应该不能在linux下运行啊
[其他解释]
我用的是flashpaper,省得还得先将文件转成pdf。
[其他解释]
引用:
我用的是flashpaper,省得还得先将文件转成pdf。

还是那个问题嘛.没找到Linux版本的 flashpaper
[其他解释]
支持一把,很实用的功能。
[其他解释]
顶lz
[其他解释]
虽然没有。NET和C#的,但是也表示支持!
曾经想解决此类问题,但是一直不曾有过突破。资料也不好查!
继续关注!
[其他解释]
期待c#版的源码……应该跟java差不多,回头试试 ……
[其他解释]
想请假一下楼主,您这个生成的SWF文件是一个文件还是切成多个小的SWF文件了?
[其他解释]
生成的是多个小的swf文件

[其他解释]
引用:
想请假一下楼主,您这个生成的SWF文件是一个文件还是切成多个小的SWF文件了?
每个doc文档对应一个swf文件
------其他解决方案--------------------


您好我看了您做的这个,真的非常的棒,能不能使用php来实现这个功能
[其他解释]
doc很多大文件,转成一个文件的话,会出问题的。
[其他解释]
我的相关实现
http://blog.log4ic.com/docviewer.html
[其他解释]

引用:
您好我看了您做的这个,真的非常的棒,能不能使用php来实现这个功能

php 和 C#的话我都不太了解不过从原理上来看都是没问题的
[其他解释]
怎么打不开页面啊!
[其他解释]
引用:
我的相关实现
http://blog.log4ic.com/docviewer.html


呵呵,你都封装起来了。。当时要得比较急,我也就是简单的实现了。
我看了下原理都很像,用的一样的工具。大家如果需求比较急的话可以采用这位兄弟的解决方案,应该是比我给出的要完整很多了~
[其他解释]
 应该做出来个项目可以下载的zip!
[其他解释]
其实,看了那么多关于仿百度文档,我是很想知道一个问题,action是什么时候调用的....因为我发现前台根本就没有调用action啊,这样的话action是怎么工作的?
[其他解释]
问一下,在利用flexPaper实现swf格式文件的预览时,如果在swfFile 中输入的中文路径的名称为什么不显示,flexPaper是否支持中文呢,希望楼主帮忙解答。在这里先谢过楼主了
[其他解释]
引用:
其实,看了那么多关于仿百度文档,我是很想知道一个问题,action是什么时候调用的....因为我发现前台根本就没有调用action啊,这样的话action是怎么工作的?

居然又被人搜索出来了。是要掉action的,然后action里执行转换的java代码。我的资料整理的就是java怎么转换文档的
[其他解释]
但愿楼主还在。我现在在文档转换成swf格式时还没遇到太大问题。但是在jsp里写
SwfFile : '3333.swf',时遇到了麻烦。
就是'3333.swf'必须是在object下显示的文件,比如我把新生成的swf文件存进workspace的相关目录里,这时候在object下还没显示出来这个新的swf文件,用SwfFile : '3333.swf'就打不开这个文件。当我刷新一下object使新的swf文件显示出来后,再用SwfFile : '3333.swf'就能正常打开,这是为什么啊?怎么解决啊?
真是跪求了,弄了好多天了。。。。。。
[其他解释]
引用:
问一下,在利用flexPaper实现swf格式文件的预览时,如果在swfFile 中输入的中文路径的名称为什么不显示,flexPaper是否支持中文呢,希望楼主帮忙解答。在这里先谢过楼主了


这个问题...我还真回答不了..年代久远了我也试不了不好意思..PS:http里面最好不要用中文路径,http的地址理论上是没有中文的有也是经过转义的.你转义过后试试吧

热点排行