在线阅读
一、 功能所需工具
下载工具
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
二、 搭建所需环境及实现
第一步:安装OpenOffice。从上述下载地址得到可执行安装文件,直接双击执行,安装过程较为人性化,只需选择下一步即可。此处注意下安装路径,文件转换之前需在Windows命令行窗口打开安装根目录,然后执行开启服务命令。
第二步:解压JodConverter。解压目录结构如下图:
打开lib文件夹,
将其中的jar包复制到Web工程的WebRoot/WEB-INF/lib下。
第三步:安装Swftools。从下载的压缩包中解压得到可执行安装文件,直接双击执行。该转换工具用来将pdf文件转换成swf文件。改工具既可以安装使用实现文件转换,也拷贝安装后Program Files下的Swftools文件夹放到工程中,以绿色软件方式来使用。转换命令将在FileConverterUtil.java中特别指明。
第四步:使用Flexpaper。Flexpaper就是一个播放swf文件的播放器。解压后目录如下:
其中Paper.swf、所有的txt文件、php文件夹和example文件夹都可以删掉。清理完之后,新建readFile.jsp(jsp页面代码在后面附加),然后将flexpaper文件夹拷贝到WebRoot下即可。
FileConverterUtil.java代码如下:
package com.sdjt.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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;
/**
* Title:
* desc: 档案Action类
*
Copyright: Copyright(c)shundesoft 2011
* company:济南舜德竟天软件有限公司
* @author 温中伟
* @date 2011-10-14
* @version 1.0
* @since
*/
public class FileConverterUtil{
/**
* 实现文件格式转换
* @param sourceFilePath //源文件路径
* @param fullFileName //源文件名称
* @param converterFlag //源文件转换标志
* @throws Exception
*/
public String convertFile(String sourceFilePath, String fullFileName, String swfToolsPath, String converterFlag) throws Exception{
File sourceFile; //转换源文件
File pdfFile; //PDF媒介文件
File swfFile; //SWF目标文件
File createPath; //创建文件存放目录
Runtime rt; //转换命令执行类
String converFileName = ""; //转换之后的SWF文件名称
String middleFilePath = sourceFilePath.substring(0, sourceFilePath.length()-1);
String filePath = (middleFilePath.substring(0, middleFilePath.lastIndexOf("\\"))).substring(0, (middleFilePath.substring(0, middleFilePath.lastIndexOf("\\"))).lastIndexOf("\\"));
String fileName = PinYinUtil.getPinYinFirstOrAllLetter(fullFileName.substring(0, fullFileName.lastIndexOf(".")), false)[0];
String fileType = fullFileName.substring(fullFileName.lastIndexOf(".")+1);
String folderName = middleFilePath.substring(middleFilePath.lastIndexOf("\\")+1);
if(converterFlag.equals("1")){
converFileName = folderName+"/"+fileName+".swf";
}else{
if(fileType.equals("pdf")){
//PDF格式文件处理方式
rt = Runtime.getRuntime();
sourceFile = new File(sourceFilePath+fullFileName);
//创建SWF文件存放目录
createPath = new File(filePath+"\\swfFiles\\"+folderName);
if(!createPath.isDirectory()){
createPath.mkdir();
}
swfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".swf");
Process p = rt.exec(swfToolsPath+"/pdf2swf.exe " + sourceFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
//缓冲区读入内容清理
clearCache(p.getInputStream(), p.getErrorStream());
converFileName = folderName+"/"+fileName+".swf";
}else{
//非PDF格式文件处理方式
if(isLegal(fileType.toUpperCase())){
sourceFile = new File(sourceFilePath+fullFileName);
pdfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".pdf");
swfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".swf");
//获取连接对象
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
//取得连接
connection.connect();
//创建文件格式转换对象
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
//实现文件格式转换
converter.convert(sourceFile, pdfFile);
//生成已转换的PDF文件
pdfFile.createNewFile();
//释放连接
connection.disconnect();
rt = Runtime.getRuntime();
//执行PDF文件转换成SWF文件命令
Process p = rt.exec(swfToolsPath+"/pdf2swf.exe " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
//缓冲区读入内容清理
clearCache(p.getInputStream(), p.getErrorStream());
//删除中转PDF文件
if(pdfFile.exists()){
pdfFile.delete();
}
converFileName = folderName+"/"+fileName+".swf";
}
}
}
return converFileName;
}
/**
* 清理缓冲区
* @param isi
* @param ise
*/
public void clearCache(InputStream isi, InputStream ise){
try {
final InputStream is1 = isi;
//启用单独线程清空InputStream缓冲区
new Thread(new Runnable() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(is1));
try {
while(br.readLine() != null) ;
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//读入ErrorStream缓冲
BufferedReader br = new BufferedReader(new InputStreamReader(ise));
//保存缓冲输出结果
StringBuilder buf = new StringBuilder();
String line = null;
try {
line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
//循环等待进程结束
while(line != null)
buf.append(line);
is1.close();
ise.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 判断所转换文件类型是否合法
* @param getFileType //文件格式
* @param fileLegalFlag //是否合法标志 false:非法 true:合法
*/
public boolean isLegal(String getFileType){
boolean fileLegalFlag = false;
if(getFileType.equals("TXT")){
fileLegalFlag = true;
}else if(getFileType.equals("DOC")||getFileType.equals("DOCX")){
fileLegalFlag = true;
}else if(getFileType.equals("PPT")||getFileType.equals("PPTX")){
fileLegalFlag = true;
}else if(getFileType.equals("XLS")||getFileType.equals("XLSX")){
fileLegalFlag = true;
}
return fileLegalFlag;
}
}
readFile.jsp页面代码如下:
<%@ page language="java" import="java.lang.String" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String getFilePath = request.getParameter("recFileName");
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html 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>
[removed][removed]
</head>
<body>
'),
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'
}});
[removed]
</body>
</html>
Struts配置文件:
OpenOffice服务启动命令:
cd C:\Program Files\OpenOffice.org 3\program
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
需注意的问题
转换TXT时内容中文乱码问题
反编译jodconverter-2.2.2.jar,反编译好的已经放在在线阅读文件夹下。Jodconverter-2.2.1.jar不出现TXT乱码问题,但是不支持office2007格式的文件转换。
Flexpaper不支持中文路径
中文名称的文件转换成了汉语拼音.swf
参考资料
http://topic.csdn.net/u/20110712/18/4daf5746-e64e-434d-aeb0-77b05f6c9903.html
http://www.cnblogs.com/qinpeifeng107/archive/2011/08/29/2158879.html
http://blog.csdn.net/liuyuhua0066/article/details/6603493
http://blog.csdn.net/lyq123333321/article/details/6546104
http://www.cnblogs.com/compass/articles/2046311.html