Flex实现在线显示Word文档,FlexPaper

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文件(反正我是碰到了这个问题).注:以上代码,我已经实现效果,可以删除一些多余的代码,直接修改测试.

你可能感兴趣的:(java,Flex)