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相关组件自行转换。其核心代码如下:

 1  public ActionResult GetDocumentData(string filePath, string sessionID)
 2         {
 3             // Common.SetWordsLicense();
 4             List<string> result = new List<string>();
 5             try
 6             {
 7                 string documentFolder = AsposeWord.CreateTempFolders(filePath, sessionID);
 8                 Aspose.Words.Document doc = new Aspose.Words.Document(filePath);
 9                 Aspose.Words.Saving.ImageSaveOptions options = new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Jpeg);
10                 options.PageCount = 1;
11                 for (int i = 0; i < doc.PageCount; i++)
12                 {
13                     options.PageIndex = i;
14                     doc.Save(string.Format(@"{0}\{1}.png", documentFolder, i), options);
15                 }
16                 result.Add(Common.Success);
17                 result.Add(doc.PageCount.ToString());
18                 var appPath = System.Web.HttpContext.Current.Server.MapPath("~");
19                 result.Add(documentFolder.Replace(appPath, "/").Replace("\\", "/"));
20             }
21             catch (Exception ex)
22             {
23                 result.Clear();
24                 result.Add(Common.Error + ": " + ex.Message);
25             }
26             return Content(JsonConvert.SerializeObject(result));
27         }

  最终效果图

  更多的开发者可能更喜欢将文档转换成HTML进行阅览,我们来看一下将office文档文档转换成html进行阅览的核心代码,根据文件的后缀名判断是用那种Aspose组件进行转换,然后对应创建该文件的HTML文档。

 1 public ActionResult GetAsposeOfficeFiles(string filePath, string sessionID, int pageIndex)
 2         {
 3             var pageView = false;
 4             var viewUrl = string.Empty;
 5             var result = new List<string>();
 6             var fileInfo = new FileInfo(filePath);
 7
 8             var hostName = HttpUtility.UrlPathEncode(filePath.Replace("\\", "//"));
 9             var webPath = Path.Combine(Common.PageDocumentDir, string.Format("Office/{0}.html", sessionID));
10             var generateFilePath = Server.MapPath(webPath);
11             try
12             {
13                 if (fileInfo.Extension == ".xls" || fileInfo.Extension == ".xlsx" || fileInfo.Extension == ".doc"
14                  || fileInfo.Extension == ".docx" || fileInfo.Extension == ".ppt" || fileInfo.Extension == ".pptx")
15                 {
16                     #region 动态第一次生成文件
17                     if (!System.IO.File.Exists(generateFilePath))
18                     {
19                         if (fileInfo.Extension == ".doc" || fileInfo.Extension == ".docx")
20                         {
21                             Document doc = new Document(filePath);
22                             doc.Save(generateFilePath, Aspose.Words.SaveFormat.Html);
23                         }
24                         else if (fileInfo.Extension == ".xls" || fileInfo.Extension == ".xlsx")
25                         {
26                             Workbook workbook = new Workbook(filePath);
27                             workbook.Save(generateFilePath, Aspose.Cells.SaveFormat.Html);
28                         }
29                         else if (fileInfo.Extension == ".ppt" || fileInfo.Extension == ".pptx")
30                         {
31                             using (Aspose.Slides.Presentation pres = new Aspose.Slides.Presentation(filePath))
32                             {
33                                 var a = pres.Slides.Count;
34                                 HtmlOptions htmlOpt = new HtmlOptions();
35                                 htmlOpt.HtmlFormatter = HtmlFormatter.CreateDocumentFormatter("", false);
36                                 pres.Save(generateFilePath, Aspose.Slides.Export.SaveFormat.Html, htmlOpt);
37                             }
38                         }
39                     }
40                     #endregion
41                     viewUrl = webPath;
42                 } 43             }
44             catch (Exception ex)
45             {
46                 throw new Exception(ex.Message);
47             }
48             result.Add(false.ToString());
49             result.Add(viewUrl);
50             result.Add(pageView.ToString());
51             result.Add(pageIndex.ToString());
52             return Content(JsonConvert.SerializeObject(result));
53         }

  最后就是通过Iframe调用生成的HTML查看效果:

 1 $.ajax({
 2         type: "POST",
 3         url: "/commons/Aspose/GetAsposeOfficeFiles",
 4         data: ‘{ filePath: "‘ + filePath + ‘" , sessionID: "‘ + guid() + ‘", pageIndex: "‘ + pageIndex + ‘" }‘,
 5         contentType: "application/json; charset=utf-8",
 6         dataType: "json",
 7         success: function (result) {
 8             //var officeInternetView = result[0];
 9             var viewUrl = result[1];
10             var pageView = result[2];
11             var tempPage = result[3];
12
13             var paging = $("#paging");
14             if (pageView === "True") {
15                 paging[0].style.display = "block";
16                 $("#page-nav")[0].value = tempPage;
17             } else {
18                 paging[0].style.display = "none";
19             }
20             $("#CurrentDocumentPage").attr("src", viewUrl);
21         },

  对于比较大(如大于5M)的pdf文档一般都有数百页的内容了,对于这样的“大”文档一次性转换成HTML文档相对比较慢,所以我们通常会考虑到按指定页来转换,根据页码转换需要的哪一页,这样转换非常快,而且可以随意指定要查看那一页:

 1 else if (fileInfo.Extension == ".pdf")
 2                 {
 3                     if (pageIndex == 0 && fileInfo.Length / 1024 / 1024 < 2)
 4                     {
 5                         var pdfDocument = new Aspose.Pdf.Document(filePath);
 6                         pdfDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html);
 7                     }
 8                     else if (pageIndex == 0)
 9                     {
10                         pageIndex++;
11                         pageView = true;
12                         var pdfDocument = new Aspose.Pdf.Document(filePath);
13                         Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document();
14                         newDocument.Pages.Add(pdfDocument.Pages[pageIndex]);
15                         newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html);
16
17                     }
18                     else if (pageIndex == -1)
19                     {
20                         pageView = true;
21                         var pdfDocument = new Aspose.Pdf.Document(filePath);
22                         Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document();
23                         newDocument.Pages.Add(pdfDocument.Pages[pdfDocument.Pages.Count]);
24                         newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html);
25                         pageIndex = pdfDocument.Pages.Count;
26                     }
27                     else
28                     {
29                         pageView = true;
30                         var pdfDocument = new Aspose.Pdf.Document(filePath);
31                         if (pageIndex > 0 && pageIndex < pdfDocument.Pages.Count)
32                         {
33                             Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document();
34                             newDocument.Pages.Add(pdfDocument.Pages[pageIndex]);
35                             newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html);
36                         }
37                         else
38                         {
39                             Aspose.Pdf.Document newDocument = new Aspose.Pdf.Document();
40                             newDocument.Pages.Add(pdfDocument.Pages[pdfDocument.Pages.Count]);
41                             newDocument.Save(generateFilePath, Aspose.Pdf.SaveFormat.Html);
42                             pageIndex = pdfDocument.Pages.Count;
43                         }
44                     }
45                     viewUrl = webPath;

上传文件:

 1   public ActionResult UploadFile()
 2         {
 3             HttpFileCollectionBase files = Request.Files;
 4             HttpPostedFileBase file = files["file1"];
 5             if (file != null && file.ContentLength > 0)
 6             {
 7                 string fileName = file.FileName;
 8                 if (fileName.LastIndexOf("\\", StringComparison.Ordinal) > -1)
 9                 {
10                     fileName = fileName.Substring(fileName.LastIndexOf("\\", StringComparison.Ordinal) + 1);
11                 }
12                 string path = Server.MapPath(Common.DataDir);
13                 try
14                 {
15                     file.SaveAs(path + fileName);
16                     ViewBag.message = "上传成功!";
17                 }
18                 catch (Exception e)
19                 {
20                     throw e;
21                 }
22             }
23             return RedirectToAction("Index", "../Home");
24         }

下载

 1 function DownloadFile(row) {
 2 $.get("/commons/Aspose/DownloadFile?filePath=" + encodeURI(row.FullName),
 3 function (result) {
 4 location.href = result;
 5 });
 6 }
 7
 8 public string DownloadFile(string filePath, string sessionID)
 9 {
10 var appPath = System.Web.HttpContext.Current.Server.MapPath("~");
11 var result = filePath.Replace(appPath, "/").Replace("\\", "/");
12 return result;
13 }

  注意:在线阅览中,细心的朋友可能已经注意到了我的代码中有一个sessionID,每次阅览文件都会创建一个名为sessionID的文件夹,我想这一定不是大家所期望的,那用意何在在呢?实际上同一个文件我们只需要一次生成HTML文件就可以了,无需每次阅览都都重复生成这些文件。实际项目中,我们期望每上传一个文件就创建一个唯一的标示,这个标示跟对应文件之间建立某种关系,在线阅览的时候就根据这个唯一标识创建对应的HTML文件就可以了,这样,同一个文件在下一次阅览的时候先根据这个标示去检查对应的HTML文件是否存在,如果存在直接阅览就OK了,如果不存在,则先创建HTML文件,再进行阅览,另外时间比较仓促,本文的demo考虑不周,测试不足,可能有些小小的bug,大家在用的时候自行完善。

  一般这样的需求,比较完善一点就需要有文件上传,在线阅览,文件下载,文件删除,在线编辑等功能,前面几个功能也算是有比较完善的解决方案了,最后一个在线编辑还没有合适的解决方案,如果哪位朋友在web在线编辑方面有比较好的解决方案,请告诉我一下,接下来会花一定时间研究一下web在线编辑,可视化等,还望大家多多支持,有新的成果一定第一时间与大家分享。

  最后,上一篇中给大家承诺过的web在线打印的干货,这里一并奉上,因为文件太大,这里无法上传,所以,干货就发到群共享,有需要的朋友在群里下载,也可以给我留言索要。

  应用程序框架交流QQ群1:386092459(已满)

  应用程序框架交流QQ群2:376124781

时间: 2024-12-27 22:47:11

web文档在线阅览的相关文章

WEB文档在线预览解决方案

web页面无法支持预览office文档,但是却可以预览PDF.flash文档,所以大多数解决方案都是在服务端将office文档转换为pdf,然后再通过js的pdf预览插件(谷歌浏览器等已经原生支持嵌入PDF文档)进行查看. Aspose后台转换可以使用Aspose将office文档转换为PDF格式,Aspose功能强大,支持编辑/转换word.excel.ppt.pdf等,且API操作简便快速.Aspose是收费的,你需要下载破解版本. 除了Aspose可以编辑文档,类似的还有NPOI .POI

sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法

昨晚配置完成office web apps 2013的外部网络访问之后,今天发现了一个很奇怪的问题,就是IE 11不支持文档在线浏览,找了很多方法,打补丁什么的,都不管用,最后在预览文件的页面,看到<head>标签,里面有一句代码: <meta http-equiv="X-UA-Compatible" content="IE=99" /> 我把他改成了 <meta http-equiv="X-UA-Compatible&quo

仿百度文库、豆丁文档在线文档带全套工具

这个是非常棒的一套在线文档分享系统源码,仿百度文库.豆丁文档网站源码,在这里完全免费提供给大家学习.在这里无需任何币就可以下载到非常多的精品源码,如果觉得好站长资源做的不错,请帮忙推荐给更多的站长朋友,并且里面还有一个设置说明图.    此套源码非常干净的,不像现在很多所谓VIP源码论坛放大量的垃圾广告文件在里面,更没有在里面加入垃圾加密广告代码.    安装以下软件前,先要在本机装好OFFICE2007   net2.0以上    windows2003 系统   退掉杀毒软件切忌! 1:安装

Java实现文档在线预览(openoffice+swfTools+FlexPaper)

      文档在线预览在项目中早就完成了,后来又经过了一次优化.但是一直都没时间去记录遇到的问题,文档在线预览的详细步骤可以参考http://blog.csdn.net/u013614451/article/details/24261503,感谢博主写了这么好的文章帮助我完成了项目中主要的模块.下面是文档转换的工具类DocConvert.java,并标注出我修改的部分. package com.he.util; import java.io.BufferedInputStream; impor

EDU-paas文档在线预览工具

本软件为edu-paas的文档在线预览,为开源软件.支持所有office文档在线预览. 文件类型全,转化快,跨平台响应式预览,兼容所有访问端. 下载地址 live.edu-paas.com/dowmCenter/EDUDocumentOnlinePreviewToolV.1.zip 源程序下载地址 live.edu-paas.com/dowmCenter/EDUFbDocumentOnlinePreviewToolV.1.zip 发布好的web 1 string serverUrl = "htt

文档在线预览开源实现方案一:OpenOffice + SwfTools + FlexPaper

在文档在线预览方面,项目组之前使用的是Microsoft office web apps, 由于该方案需要按照微软License付费,项目经理要我预研一个文档在线预览的开源实现方案.仔细钻入该需求发现其实文档在线预览的开源方案还是挺多的,今天研究的方案一采用的技术栈是:OpenOffice +SwfTools + FlexPaper, 这种方案是目前比较成熟的方案,很多网站采用该方案来实现在线预览的功能.这种方案的思路是这样的: 通过OpenOffice的服务将office文档及文本文档转换为p

asp.net如何实现word文档在线预览

原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将Microsoft.Office.Interop.Word的嵌入互操作类型设置为 false,如图 3.主要代码 C# 代码   复制 using System; using System.Collections.Generic; using System.Linq; using System.Web

office转html文档在线预览

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

轻松便捷的文档在线预览工具

北京博信施科技有限公司是一家专注于Office文档在线预览及PDF文档在线预览服务的专业提供商,依据HTML标准的4.01版本规范,研制开发出Microsoft Word.Excel.Powerpoint文档转换HTML文件格式以及Adobe PDF文件转换HTML文件格式的软件产品.实现Microsoft Word文档在线预览.Excel表格在线预览.Powerpoint演示文档在线预览及Adobe PDF文档在线预览,完美呈现Microsoft Office及Adobe PDF文档原始样式和