Flex实现浏览器在线显示Word文档(不能实现Word在线编辑).
思想:生成Word->pdf->swf->flexpaper显示.oh ,my god!
用开源Itext.jar生成Word文档;
通过开源jacob.jar实现Word转换成PDF;
通过软件Pdf2Swf转换PDF成Swf文件;
通过开源FlexPaper.swf组件显示Swf文件.
(有点繁琐,但是我没找到解决的办法,貌似有个OpenOffice,但是收费...)
第一步:生成Word文档(用到的Jar包在文件附录)
// 第一步:创建一个document对象。
Document document = new Document(PageSize.A4);
// 第二步:将文件输出流指向一个文件。
RtfWriter2.getInstance(document, new FileOutputStream("C:\\mmmmm.doc"));
// 第三步:打开文档。
document.open();
//字体
Font font = new Font(Font.NORMAL, 14,Font.BOLD, new Color(0, 0, 0));
// 第四步:在文档中增加一个段落。
Paragraph paragraph = new Paragraph("xxxxxxxxxxxxx", font);
paragraph .setAlignment(Element.ALIGN_CENTER);
document.add(paragraph );
// 第五步:关闭文档。
document.close();
Itext是个好东西,可以在word里面画表格
第二步:Word转换成PDF文件(用到的Jar包在文件附录)
package com.sddl.dao.dky.Utils;
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
public class Word2PdfUtil {
int wdDoNotSaveChanges = 0;// 不保存待定的更改。
int wdFormatPDF = 17;// PDF 格式
public String word2PdfUtil(String fileName) {
System.out.println(fileName);
String toFilename = fileName + ".pdf";
System.out.println("启动Word");
ActiveXComponent app = null;
try {
app = new ActiveXComponent("Word.Application");
app.setProperty("Visible", false);
Dispatch docs = app.getProperty("Documents").toDispatch();
System.out.println("打开文档" + fileName);
Dispatch doc = Dispatch.call(docs,//
"Open", //
fileName,// FileName
false,// ConfirmConversions
true // ReadOnly
).toDispatch();
System.out.println("转换文档到PDF" + toFilename);
File tofile = new File(toFilename);
if (tofile.exists()) {
tofile.delete();
}
Dispatch.call(doc,//
"SaveAs", //
toFilename, // FileName
wdFormatPDF);
Dispatch.call(doc, "Close", false);
} catch (Exception e) {
System.out.println("========Error:文档转换失败:" + e.getMessage());
} finally {
if (app != null)
app.invoke("Quit", wdDoNotSaveChanges);
}
System.out.println(toFilename);
return toFilename;
}
}
如果安装的是Office2010,运行这个方法应该是没有问题的,如果是Office2007,那需要安装Office组件(SaveAsPDFandXPS2007).
注意:用Jacob包,需要在系统盘C:\Windows\System32添加一个jacob-1.17-M2-x64.dll文件(我的系统是64位的,32位系统就添加jacob-1.17-M2-x32.dll,文件见附录)
第三步:Pdf转换成Swf文件(用到的Jar包在文件附录)
package com.sddl.dao;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
public static int convertPDF2SWF(String sourcePath, String destPath,
String fileName) throws IOException {
// 目标路径不存在则建立目标路径
File dest = new File(destPath);
if (!dest.exists())
dest.mkdirs();
// 源文件不存在则返回
File source = new File(sourcePath);
if (!source.exists())
return 0;
// 调用pdf2swf命令进行转换
String command = "\"D:\\Program Files (x86)\\SWFTools\\pdf2swf.exe\" -s open \""
+ sourcePath + "\" -o \"" + fileName + "\" -s flashversion=9";
Process pro = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(pro.getInputStream()));
System.out.println("MMMMMMMmmmmm");
while (bufferedReader.readLine() != null)
;
try {
pro.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(pro.toString());
return pro.exitValue();
}
public static void main(String[] args) throws IOException {
String sourcePath = "c:\\test.pdf";
String destPath = "c:\\";
String fileName = "c:\\test.swf";
test.convertPDF2SWF(sourcePath, destPath, fileName);
}
}
需要安装工具swftools-0.9.2.exe,文件太大,请百度"swftools-0.9.2.exe"下载,转换成功的swf文件,是可以用播放器打开的.我做的时候,碰到一个很头疼的问题,转换的过程没报错,出异常,但是在页面显示(第四步)的时候就是不显示swf文件.
建议:以上步骤用我给的JAR包,DLL文件,还有flexpaper,可以避免版本问题,以及系统(我的是win7_64位系统)兼容问题等.
第四步:页面显示Swf文件(用到的开源.swf在文件附录)
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:supportClasses="com.esri.ags.skins.supportClasses.*"
width="100%" height="100%" xmlns:flexpaper="com.devaldi.controls.flexpaper.*">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<s:RemoteObject id="pgbgDao" destination="pgbgDao"
fault="pgbgDao_resultHandler(event)">
<s:method name="checkEstimate" result="checkEstimate_resultHandler(event)"/>
<s:method name="checkFiles" result="checkFiles_resultHandler(event)"/>
<s:method name="pgbgAction" result="pgbgAction_resultHandler(event)"/>
</s:RemoteObject>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.StringUtil;
[Bindable]
public var swfName:String = "";//Swf名称
public var deptId:int = 200000656;
public var deptName:String = "滨州供电公司";
public var evaluationId:int = 200000111;
public var evaluationDate:String = "2011/5/23";
public var guideline_planId:int = 1;
[Bindable]
public var swfFlag:Boolean = false;
/**click事件*/
protected function doActionForDoc_clickHandler(event:MouseEvent):void
{
// }
protected function checkEstimate_resultHandler(event:ResultEvent):void
{
if(event.result as Boolean==false){
Alert.show("没有评估得分!","提示!");
}else{
/**检查swf文件是否存在*/
pgbgDao.checkFiles(deptId,evaluationId,guideline_planId);
}
}
protected function checkFiles_resultHandler(event:ResultEvent):void
{
if((event.result as Boolean)==false){
pgbgDao.pgbgAction(deptId,deptName,evaluationId,evaluationDate,guideline_planId);
}else{
//swfName = deptId+""+evaluationId+evaluationDate+".swf"
}
}
/**开始生成评估报告*/
protected function pgbgAction_resultHandler(event:ResultEvent):void{
swfName = event.result as String;
if(StringUtil.trim(swfName).length!=0){
swfFlag = true;
}
}
protected function pgbgDao_resultHandler(event:FaultEvent):void
{
Alert.show("----"+event.message);
}
]]>
</fx:Script>
<mx:VBox width="100%" height="100%">
<mx:Spacer width="30"/>
<mx:Button label="doActionForDoc" id="doActionForDoc"
cornerRadius="0" height="25"
click="doActionForDoc_clickHandler(event)"/>
<mx:HBox width="100%" height="100%" visible="{swfFlag}" includeInLayout="{swfFlag}">
<flexpaper:FlexPaperViewer Scale="1.5" id="flexPaper"
width="100%" height="100%" SwfFile="{swfName}">
</flexpaper:FlexPaperViewer>
</mx:HBox>
</mx:VBox>
</s:Application>
word->pdf->swf,最后的Swf文件,存放的位置是Tomcat 7.0\webapps\项目名称\;否则就会不显示swf文件(反正我是碰到了这个问题).注:以上代码,我已经实现效果,可以删除一些多余的代码,直接修改测试.