手机版

NET实现了三种在网页中预览Office文件的方法

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

最近公司想做一个日常文档管理,可以上传下载各种文件。如果是office文件,还必须支持预览功能。其他的都好说,但是只有办公预览功能比较麻烦,但是做不到。我们不要胡说八道,一步一步来。分析了网易邮箱的文件预览功能。他用的是微软组件,最初叫Office online,现在叫Word online、Excel online等。效果很酷,功能很强大。但是在查看api的描述后,发现对服务器的要求苛刻,配置复杂,不适合。然后看到腾讯用了永中第三方组件。效果自然比不上微软,但是可以用。互联网上的一些信息可能是通过几种方式实现的

1.使用微软的Office组件直接将文件转换成html文件(优点:代码实现最简单,工作强度最小。缺点:效果极差)

2.使用微软的Office组件将文件转换成PDF格式的文件,再使用pdf2swf转换成swf文件,即使用FlexPaper显示flash文件(优点:预览效果可以接受,缺点:代码量大)

效果如图3360所示

3.在线使用Office(优点:性能完善,缺点:不适合中小企业)

综合考虑后,我决定用第二种方法。经过反复波折,我终于能用上了。然而,有一个问题至今没有解决。有时在调用Office组件时会出现以下异常:

未能在COM类工厂中检索到CLSID为{ 000209 ff-0000-0000-C000-00000046 }的组件,原因是出现以下错误: 8000401a,由于配置ID不正确,系统无法启动服务器进程。请检查用户名和密码。(异常来自HRESULT:0x8000401A),但查阅无数数据都无法解决。最不能接受的是,办公文件必须标准化,没有容错性。转换ppt文件时,会弹出转换进度框!

好吧。那我们就改进一下。

使用ASPOSE pdf2swf FlexPaper

关于ASPOSE,你可以去官网了解一下,它是一款商业充电产品,但也可以免费使用

1.参考dll

2.编写转换帮助类

复制代码如下:使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;使用Aspose。细胞;使用Aspose。文字;使用Aspose。幻灯片;使用系统。文本。正则表达式;使用系统。IO;

命名空间souxuexiao.common {///Summary///第三方组件ASPOSE Office/WPS文件转换///writer 3360 Helen Joe///date :2014-09-24////Summary公共类asposeutils {///summary///pfd转换器位置////Summary private string _ exe filename=system。web.httpcontext.current!=null?系统。web . httpcontext . current . server . mappath('/pdf F2 swf/pdf F2 swf . exe '): System。输入输出路径组合。current domain . base directory ' \ \ pdf F2 swf \ \ pdf F2 swf . exe ');

#region 1.01 Wrod文档转换为pdf文件convertdoctoppdf(字符串源文件名,String target filename)///summary////WROD文档转换为PDF文件/////summary///Param name=' source filename '要转换的Word的完整路径/param ///Param name=' target filename '目标文件的完整路径/Param///返回转换是否成功/返回公共静态bool convertdoctopdf(字符串源文件名,String target filename){ souxuexiao . API . logger . error(String . format(')。尝试使用{系统。流流=新系统。输入输出文件流(源文件名,系统。输入输出。文件模式。打开,系统。输入输出文件访问读取系统。IO.FileShare.ReadWrite)) {文档文档=新文档(source filename);医生。保存(目标文件名,文件名。word . save format . Pdf);} } catch(exception ex){ souxuexiao . API . logger . error(string . format(' wrod文档转换为PDF文件,ConvertDocToPdF异常。原因是:{0},例如。消息));}返回系统。输入输出文件存在(目标文件名);} #endregion

#区域1.02 Excel文件转换为超文本标记语言文件(字符串源文件名,字符串目标文件名,字符串guid) ///摘要////Excel文件转换为超文本标记语言文件////summary////param name=' source filename ' excel文件路径/param ///param名称='目标文件名'目标路径/param /返回转换是否成功/返回公共静态bool ConvertExcelToHtml(字符串来源文件名,字符串目标文件名){搜雪消.记录器信息(字符串。格式('准备执行超过文件转换为超文本标记语言文件,源文件名={0},目标文件名={1},源文件名,目标文件名));尝试使用{系统。流流=新系统。输入输出文件流(源文件名,系统。输入输出。文件模式。打开,系统。输入输出文件访问读取系统IO。文件共享。读写){ Aspose .单元格。工作簿=新工作簿(流);工作簿。保存(目标文件名,文件名细胞。保存格式。html);} } catch(异常ex){ Souxuexiao .错误(字符串。格式(' Excel文件转换为超文本标记语言文件ConvertExcelToHtml异常原因是:{0},例如。消息));}返回系统。输入输出文件存在(目标文件名);} #endregion

#区域1.03将文稿演示软件文件转换为PDF ConvertPowerPointToPdf(字符串源文件名,字符串目标文件名)///摘要///将文稿演示软件文件转换为PDF////summary///param name=' source filename ' PPT/PPTX文件路径/param ///param名称='目标文件名'目标文件路径/param /返回转换是否成功/返回公共静态bool ConvertPowerPointToPdf(字符串来源文件名,字符串目标文件名){搜雪消.记录器信息(字符串。格式('准备执行文稿演示软件转换PDF,源文件名={0},目标文件名={1},源文件名,目标文件名));尝试使用{系统。流流=新系统。输入输出文件流(源文件名,系统。输入输出。文件模式。打开,系统。输入输出文件访问读取系统IO。文件共享。读写){ Aspose .幻灯片。Pptx。presentationex pptx=new Asfose .幻灯片。Pptx.PresentationEx(流);pptx .保存(目标文件名,文件名。幻灯片{ catch(Exception ex){ Souxuexiao .错误(字符串。格式('将文稿演示软件文件转换为PDFConvertExcelToHtml异常原因是:{0},例如。消息));}返回系统。输入输出文件存在(目标文件名);} #endregion

#区域2.01读取可移植文档格式文件的扩展名(可移植文档格式的缩写)文件的总页数GetPageCount(字符串pdf_filename) ///summary //读取可移植文档格式文件的扩展名(可移植文档格式的缩写)文件的总页数////摘要////参数名='pdf_filename'pdf文件/param///returns/returns public static int GetPageCountByPDF(string pdf _ filename){ int page count=0;如果(系统。存在文件(pdf _ filename)){ 0尝试{ byte[]缓冲=系统。文件读取所有字节;如果(缓冲!=空缓冲区。长度0){页数=-1;字符串pdfText=编码默认。GetString(缓冲区);Regex regex=新regex(@'/type\s*/page[^s]');concollection=regex .匹配(PdfText);页面计数=集合.计数;} } catch(异常ex){ Souxuexiao .错误(字符串。格式('读取可移植文档格式文件的扩展名(可移植文档格式的缩写)文件的总页数执行GetPageCountByPowerPoint函数发生异常原因是:{0},例如。消息));} }返回页数;} #endregion

#区域2.02转换便携文档格式文件为单身白人女性格式PDFConvertToSwf(字符串pdfPath,字符串swfPath,int page) ///summary ///转换便携文档格式文件为单身白人女性格式////摘要///param name=' PdF路径' PdF文件路径/param///param name=' SWFpath ' SWF生成目标文件路径/param ///param名称='页面' PDF页数/param /返回生成是否成功/返回公共静态bool PDFConvertToSwf(字符串pdfPath,字符串swfPath,int page){ StringBuilder sb=new StringBuilder();某人(某人的简写)追加(“\ " PDFpath \ "”);某人(某人的简写)追加('-o \ ' ' SWFpath ' \ ');某人(某人的简写)追加('-z ');//flash版某人.追加('-s flashversion=9 ');//禁止便携文档格式里面的链接某人(某人的简写)追加('-s disablelink ');//PDF页数某人(某人的简写)追加('-p ' ' \ ' 1 ' '-' page ' \ ');//SWF中的图片质量某人(某人的简写)追加('-j 100 ');字符串命令=某人.ToString();系统。诊断。过程p=空;尝试使用{ p=新系统诊断。Process()){ p . startinfo。filename=_ EXEFILENAMEp . StartInfo。参数=命令开始信息工作目录=系统IO。路径。getdirectory name(_ EXEPFILENAME);//不使用操作系统外壳程序启动线程p . startinfouseshellexecute=false//p . startinfo。redirectstandard输入=true//p . startinfo。redirectstandard输出=true

//把外部程序错误输出写到标准错误流中(pdf2swf.exe的所有输出信息,都为错误输出流,用标准输出是捕获不到任何消息的.p . startinforedirectstandardererror=true//不创建进程窗口p . startinfocreatenowindow=false//启动进程开始();//开始异步读取p . BeginErrorReadLine();//等待完成p . WaitForExit } } catch(异常ex){ Souxuexiao .错误(字符串。格式('转换便携文档格式文件为单身白人女性格式执行PDFConvertToSwf函数发生异常原因是:{0},例如。消息));}最后{ if (p!=null) { //关闭进程关闭();//释放资源p。处置();} }返回文件。存在(SWFPath);} #endregion }}Office格式转换

3、将可移植文档格式文件的扩展名(可移植文档格式的缩写)文件转冲击波闪光的转换器放到站点根目录下新建文件夹pdf2swf(我就是这么配置的,您随意)

4、配置FlexPaper

预览页面引用

复制代码代码如下:脚本src=' http :/flex paper/js/swf对象。js ' type=' text/JavaScript '/script script type=' text/JavaScript ' src=' http :/flex paper/js/flex paper _ flash。js '/脚本

控件容器以及设置项

复制代码代码如下: div style=' margin :0 auto;宽度width :980 px ' div id=' FlashContent ' style=' display : none;p要查看此页面,请确保安装了Adobe Flash Player 10。0 .0或更高版本/p .脚本类型=' text/JavaScript ' var page host=((文档。位置。协议==' https : ')?'https://' : 'http://');文件。write(' a href=' http://www。土坯。com/go/getflashplayer ' img src=' page host ' www .土坯。com/images/shared/download _ buttons/Get _ Flash _ player。gif ' alt='获取Adobe Flash player '/a ');/script/div script type=' text/JavaScript ' var _ filename=document。getelementbyid(' _ filename ').价值;var swf versionstr=' 9。0 .0 ';var xiSwfUrlStr=' player产品安装。' swf ';var flashvars={ swffile : escape(_ filename),Scale: 0.6,ZoomTransition: 'easeOut ',ZoomTime: 0.5,ZoomInterval: 0.1,FitPageOnLoad: false,FitWidthOnLoad: true,PrintEnabled: true,fullsscreenas max window 3360 false,ProgressiveLoading: true,

PrintToolsVisible: true,ViewModeToolsVisible: true,ZoomToolsVisible: true,FullScreenVisible: true,NavToolsVisible: true,CursorToolsVisible: true,SearchToolsVisible: true,SearchMatchAll:true,

区域设置链: ' zh _ CN ' };var params={ quality: 'high ',bgcolor: '#ffffff ',allowscriptaccesss : '同域',允许全屏: ' true ' } var attributes={ id : ' flex paper viewer ',name : ' flex paper viewer ' };swf对象。embeddeswf('/flex paper/flex paper view er。swf ',' flashContent ',' 980 ',' 620 ',swfVersionStr,xiSwfUrlStr,flashvars,params,attributes);swf对象。创建CSS(' # FlashContent ',' display:block '文本左对齐:');/script /div

文件。getelementbyid ('_ filename ')。值是预览文件的路径。好了,你完成了。我将省略如何上传和如何保存上传文件的逻辑。但是,有一个建议是,在用户上传文件后,调用转换api生成预览文件是一个耗时的操作。

文件越大,时间越长,这意味着生成预览文件需要时间,所以我使用异步方法生成预览文件。

版权声明:NET实现了三种在网页中预览Office文件的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。