如何利用office文档预览 Online实现文档在线预览

.NET实现在网页中预览Office文件的3个方法
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了.NET实现在网页中预览Office文件的3个方法,本文最终采用了ASPOSE+pdf2swf+FlexPaper的方式解决了这个需求,需要的朋友可以参考下
近日公司要搞一个日常的文档管理的东东,可以上传、下载各种文件,如果是office文件呢还必须得支持预览功能,其他的都好说但是唯独office预览功能比较麻烦,但是不能不做,废话不多说了一步步来吧。分析了下网易邮箱的文件预览功能,他用的是微软的组件,最早叫Office online,现在分开了叫Word online、Excel online ....等等,效果十分炫酷功能十分强大,但是查看了下对api的说明发现对服务器的要求比较苛刻而且配置比较复杂不太适合。然后 又看了下腾讯用的是永中第三方组件,效果嘛自然比不上微软的但是能用,综合网上的一些资料大概也就那么几种方式实现
1.使用Microsoft的Office组件将文件直接转换为html文件(优点:代码实现最简单,工作强度最小。缺点:效果极差)
2.使用Microsoft的Office组件将文件转换为PDF格式文件,然后再使用pdf2swf转换为swf文件,也就是flash文件在使用FlexPaper展示出来(优点:预览效果能接受,缺点:代码量大)
3. 使用Office online(优点:表现完美,缺点:不适合中小企业应用)
综合考虑决定使用第二种方法,经过次次波折终于可以使用,但是有个问题至今没有得到解决,调用Office组件的时候有时候会出现如下异常:
检索 COM 类工厂中 CLSID 为 {000209FF--C000-} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。 (异常来自 HRESULT:0x8000401A),查阅无数资料还是不能解决,最让人不可接受的的是office文件必须标标准准毫无容错能力,当转换ppt文件时竟然会弹出转换进度框!!
好吧!那么我们改进它。
使用ASPOSE+pdf2swf+FlexPaper
关于ASPOSE大家可以到官网了解,这是款商业收费产品但是免费也可以使用
1、引用dll
2、编写转换帮助类
using System.Collections.G
using System.L
using System.T
using Aspose.C
using Aspose.W
using Aspose.S
using System.Text.RegularE
using System.IO;
&&& /// &summary&
&&& /// 第三方组件ASPOSE Office/WPS文件转换
&&& /// Writer:Helen Joe
&&& /// Date:
&&& /// &/summary&
&&& public class AsposeUtils
&&&&&&& /// &summary&
&&&&&&& /// PFD转换器位置
&&&&&&& /// &/summary&
&&&&&&& private static string _EXEFILENAME = System.Web.HttpContext.Current != null
&&&&&&&&&&&&&&& ? System.Web.HttpContext.Current.Server.MapPath("/pdf2swf/pdf2swf.exe")
&&&&&&&&&&&&&&& : System.bine(AppDomain.CurrentDomain.BaseDirectory + "\\pdf2swf\\pdf2swf.exe");
&&&&&&& #region 1.01 Wrod文档转换为PDF文件 +ConvertDocToPdF(string sourceFileName, string targetFileName)
&&&&&&& /// &summary&
&&&&&&& /// Wrod文档转换为PDF文件
&&&&&&& /// &/summary&
&&&&&&& /// &param name="sourceFileName"&需要转换的Word全路径&/param&
&&&&&&& /// &param name="targetFileName"&目标文件全路径&/param&
&&&&&&& /// &returns&转换是否成功&/returns&
&&&&&&& public static bool ConvertDocToPdF(string sourceFileName, string targetFileName)
&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("Wrod文档转换为PDF文件:sourceFileName={0},targetFileName={1}", sourceFileName, targetFileName));
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Document doc = new Document(sourceFileName);
&&&&&&&&&&&&&&&&&&& doc.Save(targetFileName, Aspose.Words.SaveFormat.Pdf);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch (Exception ex)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("Wrod文档转换为PDF文件执行ConvertDocToPdF发生异常原因是:{0}",ex.Message));
&&&&&&&&&&& }
&&&&&&&&&&& return System.IO.File.Exists(targetFileName);
&&&&&&& #endregion
&&&&&&& #region 1.02 Excel文件转换为HTML文件 +(string sourceFileName, string targetFileName, string guid)
&&&&&&& /// &summary&
&&&&&&& /// Excel文件转换为HTML文件
&&&&&&& /// &/summary&
&&&&&&& /// &param name="sourceFileName"&Excel文件路径&/param&
&&&&&&& /// &param name="targetFileName"&目标路径&/param&
&&&&&&& /// &returns&转换是否成功&/returns&
&&&&&&& public static bool ConvertExcelToHtml(string sourceFileName, string targetFileName)
&&&&&&&&&&& Souxuexiao.(string.Format("准备执行Excel文件转换为HTML文件,sourceFileName={0},targetFileName={1}",sourceFileName,targetFileName));
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Aspose.Cells.Workbook workbook = new Workbook(stream);
&&&&&&&&&&&&&&&&&&& workbook.Save(targetFileName, Aspose.Cells.SaveFormat.Html);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch (Exception ex)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("Excel文件转换为HTML文件ConvertExcelToHtml异常原因是:{0}", ex.Message));
&&&&&&&&&&& }
&&&&&&&&&&& return System.IO.File.Exists(targetFileName);
&&&&&&& #endregion
&&&&&&& #region 1.03 将PowerPoint文件转换为PDF +ConvertPowerPointToPdf(string sourceFileName, string targetFileName)
&&&&&&& /// &summary&
&&&&&&& /// 将PowerPoint文件转换为PDF
&&&&&&& /// &/summary&
&&&&&&& /// &param name="sourceFileName"&PPT/PPTX文件路径&/param&
&&&&&&& /// &param name="targetFileName"&目标文件路径&/param&
&&&&&&& /// &returns&转换是否成功&/returns&
&&&&&&& public static bool ConvertPowerPointToPdf(string sourceFileName, string targetFileName)
&&&&&&&&&&& Souxuexiao.(string.Format("准备执行PowerPoint转换PDF,sourceFileName={0},targetFileName={1}",sourceFileName,targetFileName));
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Aspose.Slides.Pptx.PresentationEx pptx = new Aspose.Slides.Pptx.PresentationEx(stream);
&&&&&&&&&&&&&&&&&&& pptx.Save(targetFileName, Aspose.Slides.Export.SaveFormat.Pdf);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch (Exception ex)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("将PowerPoint文件转换为PDFConvertExcelToHtml异常原因是:{0}", ex.Message));
&&&&&&&&&&& }
&&&&&&&&&&& return System.IO.File.Exists(targetFileName);
&&&&&&& #endregion
&&&&&&& #region 2.01 读取pdf文件的总页数 +GetPageCount(string pdf_filename)
&&&&&&& /// &summary&
&&&&&&& /// 读取pdf文件的总页数
&&&&&&& /// &/summary&
&&&&&&& /// &param name="pdf_filename"&pdf文件&/param&
&&&&&&& /// &returns&&/returns&
&&&&&&& public static int GetPageCountByPDF(string pdf_filename)
&&&&&&&&&&& int pageCount = 0;
&&&&&&&&&&& if (System.IO.File.Exists(pdf_filename))
&&&&&&&&&&& {
&&&&&&&&&&&&&&& try
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& byte[] buffer = System.IO.File.ReadAllBytes(pdf_filename);
&&&&&&&&&&&&&&&&&&& if (buffer != null && buffer.Length & 0)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& pageCount = -1;
&&&&&&&&&&&&&&&&&&&&&&& string pdfText = Encoding.Default.GetString(buffer);
&&&&&&&&&&&&&&&&&&&&&&& Regex regex = new Regex(@"/Type\s*/Page[^s]");
&&&&&&&&&&&&&&&&&&&&&&& MatchCollection conllection = regex.Matches(pdfText);
&&&&&&&&&&&&&&&&&&&&&&& pageCount = conllection.C
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& catch (Exception ex)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("读取pdf文件的总页数执行GetPageCountByPowerPoint函数发生异常原因是:{0}", ex.Message));
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& return pageC
&&&&&&& #endregion
&&&&&&& #region 2.02 转换PDF文件为SWF格式 +PDFConvertToSwf(string pdfPath, string swfPath, int page)
&&&&&&& /// &summary&
&&&&&&& /// 转换PDF文件为SWF格式
&&&&&&& /// &/summary&
&&&&&&& /// &param name="pdfPath"&PDF文件路径&/param&
&&&&&&& /// &param name="swfPath"&SWF生成目标文件路径&/param&
&&&&&&& /// &param name="page"&PDF页数&/param&
&&&&&&& /// &returns&生成是否成功&/returns&
&&&&&&& public static bool PDFConvertToSwf(string pdfPath, string swfPath, int page)
&&&&&&&&&&& StringBuilder sb = new StringBuilder();
&&&&&&&&&&& sb.Append(" \"" + pdfPath + "\"");
&&&&&&&&&&& sb.Append(" -o \"" + swfPath + "\"");
&&&&&&&&&&& sb.Append(" -z");
&&&&&&&&&&& //flash version
&&&&&&&&&&& sb.Append(" -s flashversion=9");
&&&&&&&&&&& //禁止PDF里面的链接
&&&&&&&&&&& sb.Append(" -s disablelinks");
&&&&&&&&&&& //PDF页数
&&&&&&&&&&& sb.Append(" -p " + "\"1" + "-" + page + "\"");
&&&&&&&&&&& //SWF中的图片质量
&&&&&&&&&&& sb.Append(" -j 100");
&&&&&&&&&&& string command = sb.ToString();
&&&&&&&&&&& System.Diagnostics.Process p =
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& using (p = new System.Diagnostics.Process())
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& p.StartInfo.FileName = _EXEFILENAME;
&&&&&&&&&&&&&&&&&&& p.StartInfo.Arguments =
&&&&&&&&&&&&&&&&&&& p.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(_EXEFILENAME);
&&&&&&&&&&&&&&&&&&& //不使用操作系统外壳程序 启动 线程
&&&&&&&&&&&&&&&&&&& p.StartInfo.UseShellExecute =
&&&&&&&&&&&&&&&&&&& //p.StartInfo.RedirectStandardInput =
&&&&&&&&&&&&&&&&&&& //p.StartInfo.RedirectStandardOutput =
&&&&&&&&&&&&&&&&&&& //把外部程序错误输出写到StandardError流中(pdf2swf.exe的所有输出信息,都为错误输出流,用 StandardOutput是捕获不到任何消息的...
&&&&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardError =
&&&&&&&&&&&&&&&&&&& //不创建进程窗口
&&&&&&&&&&&&&&&&&&& p.StartInfo.CreateNoWindow =
&&&&&&&&&&&&&&&&&&& //启动进程
&&&&&&&&&&&&&&&&&&& p.Start();
&&&&&&&&&&&&&&&&&&& //开始异步读取
&&&&&&&&&&&&&&&&&&& p.BeginErrorReadLine();
&&&&&&&&&&&&&&&&&&& //等待完成
&&&&&&&&&&&&&&&&&&& p.WaitForExit();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch (Exception ex)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& Souxuexiao.API.Logger.error(string.Format("转换PDF文件为SWF格式执行PDFConvertToSwf函数发生异常原因是:{0}", ex.Message));
&&&&&&&&&&& }
&&&&&&&&&&& finally
&&&&&&&&&&& {
&&&&&&&&&&&&&&& if (p != null)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& //关闭进程
&&&&&&&&&&&&&&&&&&& p.Close();
&&&&&&&&&&&&&&&&&&& //释放资源
&&&&&&&&&&&&&&&&&&& p.Dispose();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& return File.Exists(swfPath);
&&&&&&& #endregion
Office格式转换
3、将pdf文件转swf的转换器放到站点根目录下新建文件夹pdf2swf(我就是这么配置的,您随意)
4、配置FlexPaper
预览页面引用
& 代码如下:
&&script src="/FlexPaper/js/swfobject.js" type="text/javascript"&&/script&
&script type="text/javascript" src="/FlexPaper/js/flexpaper_flash.js"&&/script&
控件容器以及设置项
&div style="margin:0width:980"&
&&&&&&&&&&& &div id="flashContent" style="display:"&
&&&&&&&&&&&&&&& &p&
&&&&&&&&&&&&&&&&&&& To view this page ensure that Adobe Flash Player version
&&&&&&&&&&&&&&&&&&& 10.0.0 or greater is installed.
&&&&&&&&&&&&&&& &/p&
&&&&&&&&&&&&&&& &script type="text/javascript"&
&&&&&&&&&&&&&&&&&&& var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://");
&&&&&&&&&&&&&&&&&&& document.write("&a href='/go/getflashplayer'&&img src='" + pageHost + "/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /&&/a&");
&&&&&&&&&&&&&&& &/script&
&&&&&&&&&&& &/div&
&&&&&&& &script type="text/javascript"&
&&&&&&&&&&& var _filename = document.getElementById("_filename").
&&&&&&&&&&& var swfVersionStr = "9.0.0";
&&&&&&&&&&& var xiSwfUrlStr = "playerProductInstall.swf";
&&&&&&&&&&& var flashvars = {
&&&&&&&&&&&&&&& SwfFile: escape(_filename),
&&&&&&&&&&&&&&& Scale: 0.6,
&&&&&&&&&&&&&&& ZoomTransition: "easeOut",
&&&&&&&&&&&&&&& ZoomTime: 0.5,
&&&&&&&&&&&&&&& ZoomInterval: 0.1,
&&&&&&&&&&&&&&& FitPageOnLoad: false,
&&&&&&&&&&&&&&& FitWidthOnLoad: true,
&&&&&&&&&&&&&&& PrintEnabled: true,
&&&&&&&&&&&&&&& FullScreenAsMaxWindow: false,
&&&&&&&&&&&&&&& ProgressiveLoading: true,
&&&&&&&&&&&&&&& PrintToolsVisible: true,
&&&&&&&&&&&&&&& ViewModeToolsVisible: true,
&&&&&&&&&&&&&&& ZoomToolsVisible: true,
&&&&&&&&&&&&&&& FullScreenVisible: true,
&&&&&&&&&&&&&&& NavToolsVisible: true,
&&&&&&&&&&&&&&& CursorToolsVisible: true,
&&&&&&&&&&&&&&& SearchToolsVisible: true,
&&&&&&&&&&&&&&& SearchMatchAll:true,
&&&&&&&&&&&&&&& localeChain: "zh_CN"
&&&&&&&&&&& };
&&&&&&&&&&& var params = {
&&&&&&&&&&&&&&& quality: "high",
&&&&&&&&&&&&&&& bgcolor: "#ffffff",
&&&&&&&&&&&&&&& allowscriptaccess: "sameDomain",
&&&&&&&&&&&&&&& allowfullscreen: "true"
&&&&&&&&&&& }
&&&&&&&&&&& var attributes = { id: "FlexPaperViewer", name: "FlexPaperViewer" };
&&&&&&&&&&& swfobject.embedSWF("/FlexPaper/FlexPaperViewer.swf", "flashContent", "980", "620", swfVersionStr, xiSwfUrlStr, flashvars, params, attributes);
&&&&&&&&&&& swfobject.createCSS("#flashContent", "display:text-align:");
&&&&&&& &/script&
&&&&&&& &/div&
document.getElementById("_filename").value是预览文件的路径
OK& 大功告成& ,至于如何上传,怎么保存上传的文件等等那些逻辑我这里就省略了。。。。,但是有个建议,当用户上传文件之后调用转换api生成预览文件是个耗时的操作,
文件越大耗时越长,也就是说生成预览文件的时候是需要时间的,因此我使用异步方式生成预览文件。
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具如何利用Office Online实现文档在线预览_百度知道
如何利用Office Online实现文档在线预览
我有更好的答案
微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,网页中加载flexpaper免费开源工具(有广告)实现Flash文件的预览。 优点: 1、有效的保护的源文件及文件的复制,不可复制也是缺点。 2、源码是自己的,版权有保证。 缺点: 1、服务器上必须安装Office软件。 2、导出PDF文件本身是个打印过程,Excel页面格式未设置,会出现一张表格打印出多页来,阅读体验大大下降。 3、转换过程非常耗费资源,低配的CPU几乎能跑满,服务器卡死。转换时间也非常漫长,这个时间主要是卡在了转换PDF上面。 4、转换完成服务器会遗留大量Excel、Word进程无法正常退出,有一些折中的解决办法,可以在网上搜索。 5、设置非常麻烦,本身微软...
其他类似问题
为您推荐:
office的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何利用Office Online实现文档在线预览_百度知道
如何利用Office Online实现文档在线预览
微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,网页中加载flexpaper免费开源工具(有广告)实现Flash文件的预览。优点:1、有效的保护的源文件及文件的复制,不可复制也是缺点。2、源码是自己的,版权有保证。缺点:1、服务器上必须安装Office软件。2、导出PDF文件本身是个打印过程,Excel页面格式未设置,会出现一张表格打印出多页来,阅读体验大大下降。3、转换过程非常耗费资源,低配的CPU几乎能跑满,服务器卡死。转换时间也非常漫长,这个时间主要是卡在了转换PDF上面。4、转换完成服务器会遗留大量Excel、Word进程无法正常退出,有一些折中的解决办法,可以在网上搜索。5、设置非常麻烦,本身微软官方的说法Office软件是客户端程序,在与IIS交互的时候本身就未设计。所以很多程序员把精力浪费在了调试程序上面。有两点在调试的时候需要注意。一个是在web.config中设置 &identity impersonate=&true& userName=&administrator& password=&你的服务器管理员密码& /&,一个是在Office软件的设置中设置跟桌面交互。6、严重浪费磁盘空间,一个文件还需要一个PDF文件、一个SWF文件,是否每次都转换,纠结是要硬盘空间呢还是要CPU的资源。
其他类似问题
为您推荐:
office的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁由于前段时间已经写了一个文档在线预览功能,就是对office文档、txt、图片、pdf等文档,可以在线预览操作,也是通过搜索引擎搜索、查看一些技术文章等调研方式写出的,基本原理也就是通过几个工具转换实现的:office-&openoffice-&swftools-&flexpaper。通过上面的流程是可以实现文件转换、在线预览等功能的,但是我感觉上面的方法存在至少以下几个缺点:1:安装过程过于繁琐,并且过于庞大,完成上面的操作需要安装将近200多兆的软件工具,不管从部署或者使用方面都不太好。2:转换过程中对资源的浪费(占用)严重,比如内存、硬盘等资源,内存资源:转换过程中,对内存的占用过于严重,遇到大文件时可以把cpu的使用率占满,对服务器有严重的影响;硬盘资源:一个文档实现转换或预览功能,需要在硬盘上生成pdf、png(缩略图)、swf三个文件,对资源占用严重。3:转换效率不高,对大文件转换速度比较慢,还经常出现卡死的现象;转换过程中对文档中的一些公式或者特殊字体没有很好的支持,会出现乱码或者其他不可读的字符情况。我想通过其他方式实现上面功能,目前想到的有POI(用POI把文档转换为html),不知道我的解决方式是否正确,请给出您们的所思所想,非常感谢。
最佳分辨率
OpenSource
Code & 2002-20}

我要回帖

更多关于 office文档预览 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信