web文档在线阅览
之前遇到很多各种文档在线阅览的需求,也有不少朋友经常问我这种需求的实现方案,大致试了一下网上的一些比较主流的推荐方案,但都不尽如人意,这里有一个比较全面的总结,需要的朋友可以根据自己的需求到这里查看,Office在线预览及PDF在线预览的实现方式大集合。本文选择功能比较强大,实现比较简单的一种方案,Aspose组件把Office及其PDF文档转换成HTML,然后进行查看。
Aspose组件在处理Office及其PDF文档方面非常的强大,据说可以在没有安装Microsoft Office的机器上工作,所有的Aspose组件都是独立,不需要微软公司的授权,一般服务器或者普通电脑都装了office,这里也没有亲自在没有安装office的电脑上测试过,所以感兴趣的朋友可以自行测试。对应不同的文档,Aspose提供了不同的组件,如Aspose.Word、Aspose.Cells、Aspose.Slides、Aspose.Pdf等不同的组件用来处理Word/Excel/PPT/PDF等几种文档。Aspose支持的文档格式也非常丰富:Doc,Docx,RTF,HTML,OpenDocument,Excel,Ppt,PDF,XPS,EPUB和其他格式,同时支持不同文档类型之间的相互转换,允许创建,修改,提取,复制,分割,加入,和替换文件内容。但是也是收费软件,所以大家在使用的时候一定要慎重考虑,这里纯粹讨论它的功能效果。本文重点讨论文档在线阅览,对不同的文件类型,我们调用不同的组件可以将文档转换成image或者HTML。
将文档转换成image查看的场景可能不是很多,所以这里只展示一下将word文档转换成Image的场景,其他如:Excel,PPT,PDF等转换成image查看的场景大家可以根据Aspose相关组件自行转换。其核心代码如下:
public ActionResult GetDocumentData(string filePath, string sessionID) { // Common.SetWordsLicense(); List<string> result = new List<string>(); try { string documentFolder = AsposeWord.CreateTempFolders(filePath, sessionID); Aspose.Words.Document doc = new Aspose.Words.Document(filePath); Aspose.Words.Saving.ImageSaveOptions options = new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Jpeg); options.PageCount = ; ; i < doc.PageCount; i++) { options.PageIndex = i; doc.Save(string.Format(@"{0}\{1}.png", documentFolder, i), options); } result.Add(Common.Success); result.Add(doc.PageCount.ToString()); var appPath = System.Web.HttpContext.Current.Server.MapPath("~"); result.Add(documentFolder.Replace(appPath, "/").Replace("\\", "/")); } catch (Exception ex) { result.Clear(); result.Add(Common.Error + ": " + ex.Message); } return Content(JsonConvert.SerializeObject(result)); }
最终效果图
更多的开发者可能更喜欢将文档转换成HTML进行阅览,我们来看一下将office文档文档转换成html进行阅览的核心代码,根据文件的后缀名判断是用那种Aspose组件进行转换,然后对应创建该文件的HTML文档。
public ActionResult GetAsposeOfficeFiles(string filePath, string sessionID, int pageIndex) { var pageView = false; var viewUrl = string.Empty; var result = new List<string>(); var fileInfo = new FileInfo(filePath); var hostName = HttpUtility.UrlPathEncode(filePath.Replace("\\", "//")); var webPath = Path.Combine(Common.PageDocumentDir, string.Format("Office/{0}.html", sessionID)); var generateFilePath = Server.MapPath(webPath); try { if (fileInfo.Extension == ".xls" || fileInfo.Extension == ".xlsx" || fileInfo.Extension == ".doc" || fileInfo.Extension == ".docx" || fileInfo.Extension == ".ppt" || fileInfo.Extension == ".pptx") { #region 动态第一次生成文件 if (!System.IO.File.Exists(generateFilePath)) { if (fileInfo.Extension == ".doc" || fileInfo.Extension == ".docx") { Document doc = new Document(filePath); doc.Save(generateFilePath, Aspose.Words.SaveFormat.Html); } else if (fileInfo.Extension == ".xls" || fileInfo.Extension == ".xlsx") { Workbook workbook = new Workbook(filePath); workbook.Save(generateFilePath, Aspose.Cells.SaveFormat.Html); } else if (fileInfo.Extension == ".ppt" || fileInfo.Extension == ".pptx") { using (Aspose.Slides.Presentation pres = new Aspose.Slides.Presentation(filePath)) { var a = pres.Slides.Count; HtmlOptions htmlOpt = new HtmlOptions(); htmlOpt.HtmlFormatter = HtmlFormatter.CreateDocumentFormatter("", false); pres.Save(generateFilePath, Aspose.Slides.Export.SaveFormat.Html, htmlOpt); } } } #endregion viewUrl = webPath; } catch (Exception ex) { throw new Exception(ex.Message); } result.Add(false.ToString()); result.Add(viewUrl); result.Add(pageView.ToString()); result.Add(pageIndex.ToString()); return Content(JsonConvert.SerializeObject(result)); }
最后就是通过Iframe调用生成的HTML查看效果:
$.ajax({ type: "POST", url: "/commons/Aspose/GetAsposeOfficeFiles", data: '{ filePath: "' + filePath + '" , sessionID: "' + guid() + '", pageIndex: "' + pageIndex + '" }', contentType: "application/json; charset=utf-8", dataType: "json", success: function (result) { //var officeInternetView = result[0]; ]; ]; ]; var paging = $("#paging"); if (pageView === "True") { paging[].style.display = "block"; $(].value = tempPage; } else { paging[].style.display = "none"; } $("#CurrentDocumentPage").attr("src", viewUrl); },
对于比较大(如大于5M)的pdf文档一般都有数百页的内容了,对于这样的“大”文档一次性转换成HTML文档相对比较慢,所以我们通常会考虑到按指定页来转换,根据页码转换需要的哪一页,这样转换非常快,而且可以随意指定要查看那一页:
else if (fileInfo.Extension == ".pdf") { && fileInfo.Length / / < ) { var pdfDocument = new Aspose.Pdf.Document(filePath); pdfDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html); } ) { pageIndex++; pageView = true; var pdfDocument = new Aspose.Pdf.Document(filePath); Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document(); newDocument.Pages.Add(pdfDocument.Pages[pageIndex]); newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html); } ) { pageView = true; var pdfDocument = new Aspose.Pdf.Document(filePath); Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document(); newDocument.Pages.Add(pdfDocument.Pages[pdfDocument.Pages.Count]); newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html); pageIndex = pdfDocument.Pages.Count; } else { pageView = true; var pdfDocument = new Aspose.Pdf.Document(filePath); && pageIndex < pdfDocument.Pages.Count) { Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document(); newDocument.Pages.Add(pdfDocument.Pages[pageIndex]); newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html); } else { Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document(); newDocument.Pages.Add(pdfDocument.Pages[pdfDocument.Pages.Count]); newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html); pageIndex = pdfDocument.Pages.Count; } } viewUrl = webPath;
上传文件:
public ActionResult UploadFile() { HttpFileCollectionBase files = Request.Files; HttpPostedFileBase file = files["file1"]; ) { string fileName = file.FileName; ) { fileName = fileName.Substring(fileName.LastIndexOf(); } string path = Server.MapPath(Common.DataDir); try { file.SaveAs(path + fileName); ViewBag.message = "上传成功!"; } catch (Exception e) { throw e; } } return RedirectToAction("Index", "../Home"); }
下载:
function DownloadFile(row) { $.get("/commons/Aspose/DownloadFile?filePath=" + encodeURI(row.FullName), function (result) { location.href = result; }); } public string DownloadFile(string filePath, string sessionID) { var appPath = System.Web.HttpContext.Current.Server.MapPath("~"); var result = filePath.Replace(appPath, "/").Replace("\\", "/"); return result; }
注意:在线阅览中,细心的朋友可能已经注意到了我的代码中有一个sessionID,每次阅览文件都会创建一个名为sessionID的文件夹,我想这一定不是大家所期望的,那用意何在在呢?实际上同一个文件我们只需要一次生成HTML文件就可以了,无需每次阅览都都重复生成这些文件。实际项目中,我们期望每上传一个文件就创建一个唯一的标示,这个标示跟对应文件之间建立某种关系,在线阅览的时候就根据这个唯一标识创建对应的HTML文件就可以了,这样,同一个文件在下一次阅览的时候先根据这个标示去检查对应的HTML文件是否存在,如果存在直接阅览就OK了,如果不存在,则先创建HTML文件,再进行阅览,另外时间比较仓促,本文的demo考虑不周,测试不足,可能有些小小的bug,大家在用的时候自行完善。
一般这样的需求,比较完善一点就需要有文件上传,在线阅览,文件下载,文件删除,在线编辑等功能,前面几个功能也算是有比较完善的解决方案了,最后一个在线编辑还没有合适的解决方案,如果哪位朋友在web在线编辑方面有比较好的解决方案,请告诉我一下,接下来会花一定时间研究一下web在线编辑,可视化等,还望大家多多支持,有新的成果一定第一时间与大家分享。
web文档在线阅览的更多相关文章
- WEB文档在线预览解决方案
web页面无法支持预览office文档,但是却可以预览PDF.flash文档,所以大多数解决方案都是在服务端将office文档转换为pdf,然后再通过js的pdf预览插件(谷歌浏览器等已经原生支持嵌入 ...
- 最好用的js前端框架、组件、文档在线预览插件
这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...
- sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
昨晚配置完成office web apps 2013的外部网络访问之后,今天发现了一个很奇怪的问题,就是IE 11不支持文档在线浏览,找了很多方法,打补丁什么的,都不管用,最后在预览文件的页面,看到& ...
- Java+FlexPaper+swfTools仿百度文库文档在线预览系统设计与实现
笔者最近在给客户开发文档管理系统时,客户要求上传到管理系统的文档(包括ppt,word,excel,txt)只能预览不允许下载.笔者想到了百度文库和豆丁网,百度文库和豆丁网的在线预览都是利用flash ...
- Java+FlexPaper+swfTools 文档在线预览demo
1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexP ...
- asp.net如何实现word文档在线预览
原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将M ...
- Office文档在线编辑的实现之二
讲述了如何通过iis的webdav支持实现客户端的office直接编辑服务器上的文件,本篇将讲解如何实现客户端的office直接编辑数据库中的二进制形式保存的office文件. 实现的关键:模拟IIS ...
- 文档在线预览开源实现方案二:OpenOffice + pdf.js
文档在线预览的另一种实现方式采用的技术栈是OpenOffice + pdf.js, office文档转换为pdf的工作依然由OpenOffice的服务来完成,pdf生成后我们不再将其转换为其他文件而是 ...
- 文档在线预览开源实现方案一:OpenOffice + SwfTools + FlexPaper
在文档在线预览方面,项目组之前使用的是Microsoft office web apps, 由于该方案需要按照微软License付费,项目经理要我预研一个文档在线预览的开源实现方案.仔细钻入该需求发现 ...
随机推荐
- WEB压力测试
原文地址:WEB压力测试 作者:鸟哥のlinux webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统: ...
- SQLServer:删除log文件和清空日志的方法
数据库的性能是DBA都需要重点关注的,日志文件的增多严重影响数据库的性能,本文将为您介绍SQL Server删除日志文件的方法,供您参考,希望对您有所帮助. 数据库在使用过程中会使日志文件不断增加,使 ...
- A record--Offline deployment of Big Data Platform CDH Cluster
A record--Offline deployment of Big Data Platform CDH Cluster Tags: Cloudera-Manager CDH Hadoop Depl ...
- 9、FTP封杀用户、限制传输速率、限制访问目录、为匿名用户提供下载资源
一.封杀某些用户访问FTP服务器 例如 封杀 yanji [root@localhost root]# vi /etc/vsftpd.ftpusers (用户控制配置文件,主要用于限 ...
- ajax使用serialize()序列化提交
form 表单使用.serialize()序列化后会出现中文乱码的问题 原因: .serialize()自动调用了encodeURIComponent方法将数据编码了 解决方法: 调用decodeUR ...
- 【原】js实现复制到剪贴板功能,兼容所有浏览器
两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...
- 阿里云 CentOS6.5 ssh连接慢的解决方案
我租了一台阿里云深圳的服务器,用的是CentOS6.5的系统,最近要在服务器上小改点代码,但是不管用private shell 还是securecrt工具连接,连上去后,都特别慢,经常敲一段代码要过个 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- js的event.srcElement与event.target(触发事件对象)
IE下,event对象有srcElement属性,但是没有target属性; Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的,即: fire ...
- 在ubunt14.04(linux)下利用cmake编译运行opencv程序
今天在电脑上安装好了opencv环境,迫不及待的想写个程序来测试一下.但是在windows下我们用vs等集成开发工具.可是在linux下我们应该怎么办呢? 这里我们用了opencv推荐的cmake来编 ...