MVC 附件在线预览

原因:应客户需求,在系统中浏览附件内容,需要先下载到本地然后打开,对使用造成了不便,要求可以不需下载直接在浏览器中打开减少操作步骤。

领导给了3天时间,最后查找方法,写测试项目,往正式项目添加,测试,修bug,优化下来总共花费了大概两天多时间。下面给出解决经验,主要把遇到的坑

给说一下。

1.研究方案

参考:http://www.cnblogs.com/xuse/p/3710647.html

使用FlexPaper实现office文件的预览(C#版)
http://www.cnblogs.com/zzPrince/p/3378336.html

flexpaper使用:

http://www.cnblogs.com/Gnepner/archive/2011/08/19/2145493.html

通过研究发现,网上流传很多方法可以实现该需求,排除第三方控件的话,有两种比较流行,一种是把文档转化为swf格式,还有一种是转化为html实现在线预览。

但是按照网上的原话,转化为html方法很不科学,转换的文件格式丢失,仅限于IIS服务器,利用asp.net。配置麻烦,正如微软所说,读取office不是这么干的,鉴于此

先尝试另一种方案。

原理:先将office转换为PDF,再转换为SWF,最后通过网页加载Flash预览。

2.搭建测试项目

2.1工具:

a.安装Microsoft Office 2007以上版本,主要是需要用到里面四个类库,稍后列出。

b.Swftools

下载地址:http://www.swftools.org/download.html

这有个小坑,看好要下载window版。

c.flexpaper

下载地址:http://flexpaper.devaldi.com/download.htm

2.2搭建测试项目

由于本系统用的是Mvc开发,所以先建了一个MvcTest项目。

添加引用,此处有小坑,注意在引用的类库上右键,把嵌入互操作类型改为False,

引用版本最好12.0.0.0,14.0.0.0经测试也可用,网上说存在权限认证问题。

添加工具,项目文件

a.Common>Utils里面写Word,Excel,PPT等转化为PDF的方法,网上有很多,主要是Excel的转化经测试有一些有问题,贴一个靠谱的

 1  public static bool ExcelToPDF(string sourcePath, string targetPath)
 2         {
 3             bool result = false;
 4             Excel.XlFixedFormatType targetType = Excel.XlFixedFormatType.xlTypePDF;
 5             object missing = Type.Missing;
 6             Excel.ApplicationClass application = null;
 7             Excel.Workbook workBook = null;
 8             try
 9             {
10                 application = new Excel.ApplicationClass();
11                 object target = targetPath;
12                 object type = targetType;
13                 workBook = application.Workbooks.Open(sourcePath, missing, missing, missing, missing, missing,
14                         missing, missing, missing, missing, missing, missing, missing, missing, missing);
15
16                 workBook.ExportAsFixedFormat(targetType, target, Excel.XlFixedFormatQuality.xlQualityStandard, true, false, missing, missing, missing, missing);
17                 result = true;
18             }
19             catch
20             {
21                 result = false;
22             }
23             finally
24             {
25                 if (workBook != null)
26                 {
27                     workBook.Close(true, missing, missing);
28                     workBook = null;
29                 }
30                 if (application != null)
31                 {
32                     application.Quit();
33                     application = null;
34                 }
35                 GC.Collect();
36                 GC.WaitForPendingFinalizers();
37                 GC.Collect();
38                 GC.WaitForPendingFinalizers();
39             }
40             return result;
41
42         }

ExcelToPDF

b.修改控制器

先在HomeController控制器的视图里里添加一个链接

<div>
    <input id="fileName" name="fileName" type="text" style="width:100px;"/>
    <a  href="#" onclick="preview();" >预览</a>
</div>

<script type="text/javascript">
        function preview() {
            var name=$("#fileName").val();
            window.open("/Home/Preview?name=" + name);
        }
</script>

再在控制器里添加一个方法:

        public ActionResult Preview(string name="")
        {
            string url = "/FlexPaper/Index?filePath=~/UploadFiles/" + name;
            return Redirect(url);
        }

测试用RedirectToAction的方法走不到FlexPaper控制器里,貌似是路由的问题,为节省时间直接使用Redirect方法,成功进去了。

然后新建一个FlexPaperController控制器,里面写的有自己从网上down的代码,加上自己的优化,判断文件是否存在,删除旧文件,是否可转化等等提示。

  1 public class FlexPaperController : Controller
  2     {
  3
  4         string pdf2swfToolPath = System.Web.HttpContext.Current.Server.MapPath("~/FlexPaper/pdf2swf.exe");
  5         string png2swfToolPath = System.Web.HttpContext.Current.Server.MapPath("~/FlexPaper/png2swf.exe");
  6         string jpeg2swfToolPath = System.Web.HttpContext.Current.Server.MapPath("~/FlexPaper/jpeg2swf.exe");
  7         string gif2swfToolPath = System.Web.HttpContext.Current.Server.MapPath("~/FlexPaper/gif2swf.exe");
  8
  9
 10         public ActionResult Index(string filePath = "")
 11         {
 12
 13             string msg = CreateSWF(filePath);
 14             if (msg == "生成成功")
 15             {
 16                 string FilePath = Server.MapPath(filePath);
 17                 string fileNameWithoutEx = System.IO.Path.GetFileNameWithoutExtension(FilePath);//不包含路径,不包含扩展名
 18                 string extendName = System.IO.Path.GetExtension(FilePath).ToLower();//文件扩展名
 19                 var sign = extendName.Replace(".", "");
 20
 21                 string url = "/FlexPaper/SWF/" + fileNameWithoutEx +sign+ ".swf";
 22                 try
 23                 {
 24                     return Redirect(string.Format("/FlexPaper/FlexPaperViewer.html?emotion={0}", url));
 25                 }
 26                 catch
 27                 {
 28                     return Content("转化失败,不支持该类型转化!");
 29                 }
 30             }
 31             else
 32                 return Content(msg);
 33         }
 34
 35         /// <summary>
 36         /// 0:转化成功
 37         /// 1:不支持的该Office文件类型到pdf的转化
 38         /// 2:不支持的该文件类型到swf的转化
 39         /// </summary>
 40         /// <returns></returns>
 41         public string CreateSWF(string filePath)
 42         {
 43             string FilePath = Server.MapPath(filePath);
 44             int index = FilePath.LastIndexOf("\\");
 45             string officePath = FilePath.Substring(0, index)+"\\";
 46             string officeName = Server.UrlDecode(FilePath.Substring(index + 1));
 47             string fileNameWithoutEx = System.IO.Path.GetFileNameWithoutExtension(FilePath);//不包含路径,不包含扩展名
 48             string extendName = System.IO.Path.GetExtension(FilePath).ToLower();//文件扩展名
 49             string sign = extendName.Replace(".", "");
 50             string PdfFilePath = Server.MapPath("~/FlexPaper/PDF/");
 51             string SWFFilePath = Server.MapPath("~/FlexPaper/SWF/");
 52
 53
 54             #region delete old file
 55             string oldPdf = PdfFilePath + fileNameWithoutEx + sign + ".pdf";
 56             if (System.IO.File.Exists(oldPdf))
 57             {
 58                 System.IO.File.Delete(oldPdf);
 59             }
 60             string oldSwf = SWFFilePath + fileNameWithoutEx + sign + ".swf";
 61             if (System.IO.File.Exists(oldSwf))
 62             {
 63                 System.IO.File.Delete(oldSwf);
 64             }
 65             #endregion
 66
 67             if (!System.IO.File.Exists(FilePath))
 68             {
 69                 return "找不到该文件!" ;
 70             }
 71
 72
 73             if (extendName == ".doc" ||
 74                extendName == ".docx" ||
 75                extendName == ".xls" ||
 76                extendName == ".ppt")
 77             {
 78
 79                 //string pdf2swfToolPath = string.Format("{0}\\pdf2swf.exe", Server.MapPath("~/FlexPaper"));
 80
 81                 string PdfName = Utils.OfficeToPdf(officePath, officeName, PdfFilePath);
 82                 if (PdfName == "")
 83                 {
 84                     return "不支持该Office文件类型到pdf的转化!";
 85                 }
 86                 string SwfName = Utils.PdfToSwf(pdf2swfToolPath, PdfFilePath, PdfName, SWFFilePath);
 87                 if (SwfName == "")
 88                 {
 89                     return "不支持该文件类型到swf的转化!";
 90                 }
 91                 return "生成成功";
 92             }
 93             else if (extendName == ".jpg" || extendName == ".jpeg" || extendName == ".png" || extendName == ".gif")
 94             {
 95                 string toolpath = String.Empty;
 96                 switch (extendName)
 97                 {
 98                     case ".jpg":
 99                         toolpath = jpeg2swfToolPath;
100                         break;
101                     case ".jpeg":
102                         toolpath = jpeg2swfToolPath;
103                         break;
104                     case ".png":
105                         toolpath = png2swfToolPath;
106                         break;
107                     case ".gif":
108                         toolpath = gif2swfToolPath;
109                         break;
110                     default:
111                         break;
112                 }
113                 string SwfFileName = Utils.PictureToSwf(toolpath, officePath, officeName, SWFFilePath);
114                 return "生成成功";
115             }
116             else
117                 return "不支持该文件类型的转化!";
118         }

FlexPaperController

c.新建FlexPaper文件夹,在该文件夹下再另外创建PDF,SWF子文件夹,此处原创便于区分,另把从网上下载demo里的js,FlexPaperViewer.html,FlexPaperViewer.swf

playerProductInstall.swf文件都拷过去。

把Swftools安装路径下的工具pdf2swf.exe,也拷过去,如有需要,其他类型也可拷过去。

修改FlexPaperViewer.html便于传递文件名

<script type="text/javascript">
            //获得参数的方法
            var request =
            {
                QueryString: function (val) {
                    var uri = window.location.search;
                    var re = new RegExp("" + val + "=([^&?]*)", "ig");
                    return ((uri.match(re)) ? (uri.match(re)[0].substr(val.length + 1)) : null);
                }
            }
</script> 

   var emotion = request.QueryString(‘emotion‘); ; //这填写文档转成的flash文件路径
   var swfFile = emotion;

            var flashvars = {
                  SwfFile: escape(swfFile),//这里用到swf路径
	          Scale : 0.6,
		  ZoomTransition : "easeOut",

UploadFiles里添加需要在线预览的office文件。

3.最后一个坑

在本地调试没有问题,发布到IIS上后,一直加载中,无法正常显示,经查找测试发现是引用office组件的权限问题。

需要在Web.config里加一段代码:

 <system.web>
    <identity impersonate="true" userName="你的用户名" password="密码"/>

4.预览效果

时间: 2024-11-05 15:52:49

MVC 附件在线预览的相关文章

邮件附件在线预览——HTML Filter

邮件附件在线预览,就是当收到邮件带有附件时,尤其是超大附件,可以不用下载邮件中的附件,通过web页面,以在线的方式读取其中的内容.此功能方便用户直接查看附件,节省下载的时间,同时也在很多时候极大的方便了没有安装相应软件的用户,对于异地登录邮箱用户,更是一项不错的服务. HYF数据格式转换软件HTML Filter便于用户实现对多种文档的统一管理,编辑,检索和浏览,能够完美的实现邮件附件在线预览功能.本产品采用了先进的多语言.多平台.多线程的设计理念,支持多国语言,多种操作系统,提供了多种形式的A

文档附件在线预览——HTML Filter数据转换器

文档附件在线预览软件 HTML Filter数据转换器 HTML Filter 是由北京红樱枫软件有限公司依据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库.便于用户实现对多种文档的统一管理,编辑,检索和浏览. 一.应用案例 本产品在国内外得到了广泛的应用,在国内有腾讯.搜狐等多家知名企业使用本产品.在产品性能和质量上得到了用户高度的好评.用户可以使用本产品,实现邮件附件在线预览,十分便利的将附件中的Word,Excel,PPT文档转换为

邮件附件在线预览——HYF数据格式转换软件HTML Filter

邮件附件在线预览,就是当收到邮件带有附件时,尤其是超大附件,可以不用下载邮件中的附件,通过web页面,以在线的方式读取其中的内容.此功能方便用户直接查看附件,节省下载的时间,同时也在很多时候极大的方便了没有安装相应软件的用户,对于异地登录邮箱用户,更是一项不错的服务. HTML Filter V1是由北京红樱枫软件有限公司依据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库.便于用户实现对多种文档的统一管理,编辑,检索和浏览,能够完美的实现

C#模仿百度文库实现附件在线预览

公司客户需要,实现附件在线预览功能. 实现原理:利用微软com组件,对上传的先进行转换pdf,如果上传格式为pdf,那么直接保存至服务器.上传成功之后,会自动保存在服务器.点击当前上传文件预览是,在通过pdf转换为swf文件,通过flash插件进行预览 具体步骤: 1 实现简单的附件上传,这里借用webupload,不清楚的童鞋百度便知 2 进入文件列表页面 ,点击文件名进行预览 (这里利用到的模态框插件是“layer“),点击预览对文件先转换成pdf,再转换成swf文件,进行预览,转换pdf时

SNF快速开发平台3.0之--文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)

实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制,客户端无刷新 可以对已经上传的附件进行名字变更,改成更友好的名称. 可以对已经上传的文件进行删除. 并记录文件大小,上传人.时间和修改人和时间等. 可以下载附件到本地电脑. 文件的在线预览,支持不安装office软件就可以预览(不管是图片还是office文档都得支持预览) 虽然比专业的图文档管理系统

ASP.NET MVC在线预览Excel、Word、TXT、PDF文件

代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Microsoft.Office.Interop.Excel; using System.Diagnostics; using System.IO; using Microsoft.Office.Interop.Word; namespace Suya.Web.Ap

实现在线预览PDF的几种解决方案

原文:实现在线预览PDF的几种解决方案 因客户需要实现PDF的预览处理,在网上找了一些PDF在线预览的解决方案,有的用PDFJS的在线预览方式,有的使用PDFObject的嵌入式显示,有的通过转换JPG/PNG方式实现间接显示的方式,开始是想通过简单的方式,能够使用JS插件实现预览最好,可是在线预览总是有一些不足,如不同浏览器的兼容问题,甚至不同的手机平台中展示的效果也不一样,不过最好还是采用了间接的方式,把PDF转换为图片展示效果,达到客户的要求. 1.在线实现预览的方式 一开始我还是很倾向使

office转html文档在线预览

要想实现office文档在线预览,可以使用红樱枫软件公司开发的数据格式转换软件HTML Filter,实现MS Office系列文档到HTML的快速转换,通过浏览器浏览HTML的内容.该产品可以将 word转html, excel转html, ppt转html,方便用户在不方便下载附件的时候,可以直接在线预览文档内容,应用在邮箱文档附件预览.云存储.云网盘的文档预览等方面. 本产品采用了先进的多语言.多平台.多线程的设计理念,支持多国语言,多种操作系统,提供了多种形式的API功能接口,便于用户使

office文件在线预览,模仿网易邮箱在线预览的

最近研究了半天,代码是倾情奉送啊,C#,asp.net的 这个原理是office文件转换为PDF文件,然后再转换成SWF文件,FlexPaper+swfTools. 有个问题,需要在web.config中加这么一行<identity impersonate="true" userName="administrator" password="你的服务器登录密码" /> /// <summary> /// 转换压缩文件,以便于