码迷,mamicode.com
首页 > Web开发 > 详细

.net 实现Office文件预览,word文件在线预览、excel文件在线预览、ppt文件在线预览

时间:2015-09-17 13:19:59      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:

源地址:http://www.cnblogs.com/GodIsBoy/p/4009252.html

使用Microsoft的Office组件将文件转换为PDF格式文件,然后再使用pdf2swf转换为swf文件,也就是flash文件在使用FlexPaper展示出来(优点:预览效果能接受,缺点:代码量大)

 

检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。 (异常来自 HRESULT:0x8000401A),查阅无数资料还是不能解决,最让人不可接受的的是office文件必须标标准准毫无容错能力,当转换ppt文件时竟然会弹出转换进度框!!

好吧!那么我们改进它。

使用ASPOSE+pdf2swf+FlexPaper

关于ASPOSE大家可以到官网了解,这是款商业收费产品但是免费也可以使用

1、引用dll

这一步的前提是需要去 官网下载 组件

技术分享

 

  下载之后,进行安装,然后在安装文件夹找到相应的 dll 库文件,然后引用到自己的项目中去

  比如我要是想Word的在想浏览功能,那么我需要下载的组件是 Aspose.Word,然后安装,最后找到 dll 引用

  技术分享

2. 编写相应的转换方法

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using Aspose.Cells;
  6 using Aspose.Words;
  7 using Aspose.Slides;
  8 using System.Text.RegularExpressions;
  9 using System.IO;
 10 
 11 namespace Souxuexiao.Common
 12 {
 13   /// <summary>
 14   /// 第三方组件ASPOSE Office/WPS文件转换
 15   /// Writer:Helen Joe
 16   /// Date:2014-09-24
 17   /// </summary>
 18   public class AsposeUtils
 19   {
 20     /// <summary>
 21     /// PFD转换器位置
 22     /// </summary>
 23     private static string _EXEFILENAME = System.Web.HttpContext.Current != null
 24         ? System.Web.HttpContext.Current.Server.MapPath("/pdf2swf/pdf2swf.exe")
 25         : System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "\\pdf2swf\\pdf2swf.exe");
 26 
 27     #region 1.01 Wrod文档转换为PDF文件 +ConvertDocToPdF(string sourceFileName, string targetFileName)
 28     /// <summary>
 29     /// Wrod文档转换为PDF文件
 30     /// </summary>
 31     /// <param name="sourceFileName">需要转换的Word全路径</param>
 32     /// <param name="targetFileName">目标文件全路径</param>
 33     /// <returns>转换是否成功</returns>
 34     public static bool ConvertDocToPdF(string sourceFileName, string targetFileName)
 35     {
 36       Souxuexiao.API.Logger.error(string.Format("Wrod文档转换为PDF文件:sourceFileName={0},targetFileName={1}", sourceFileName, targetFileName));
 37       try
 38       {
 39         using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
 40         {
 41           Document doc = new Document(sourceFileName);
 42           doc.Save(targetFileName, Aspose.Words.SaveFormat.Pdf);
 43         }
 44       }
 45       catch (Exception ex)
 46       {
 47         Souxuexiao.API.Logger.error(string.Format("Wrod文档转换为PDF文件执行ConvertDocToPdF发生异常原因是:{0}",ex.Message));
 48       }
 49       return System.IO.File.Exists(targetFileName);
 50     }
 51     #endregion
 52 
 53     #region 1.02 Excel文件转换为HTML文件 +(string sourceFileName, string targetFileName, string guid)
 54     /// <summary>
 55     /// Excel文件转换为HTML文件 
 56     /// </summary>
 57     /// <param name="sourceFileName">Excel文件路径</param>
 58     /// <param name="targetFileName">目标路径</param>
 59     /// <returns>转换是否成功</returns>
 60     public static bool ConvertExcelToHtml(string sourceFileName, string targetFileName)
 61     {
 62       Souxuexiao.API.Logger.info(string.Format("准备执行Excel文件转换为HTML文件,sourceFileName={0},targetFileName={1}",sourceFileName,targetFileName));
 63       try
 64       {
 65         using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
 66         {
 67           Aspose.Cells.Workbook workbook = new Workbook(stream);
 68           workbook.Save(targetFileName, Aspose.Cells.SaveFormat.Html);
 69         }
 70       }
 71       catch (Exception ex)
 72       {
 73         Souxuexiao.API.Logger.error(string.Format("Excel文件转换为HTML文件ConvertExcelToHtml异常原因是:{0}", ex.Message));
 74       }
 75       return System.IO.File.Exists(targetFileName);
 76     } 
 77     #endregion
 78 
 79     #region 1.03 将PowerPoint文件转换为PDF +ConvertPowerPointToPdf(string sourceFileName, string targetFileName)
 80     /// <summary>
 81     /// 将PowerPoint文件转换为PDF
 82     /// </summary>
 83     /// <param name="sourceFileName">PPT/PPTX文件路径</param>
 84     /// <param name="targetFileName">目标文件路径</param>
 85     /// <returns>转换是否成功</returns>
 86     public static bool ConvertPowerPointToPdf(string sourceFileName, string targetFileName)
 87     {
 88       Souxuexiao.API.Logger.info(string.Format("准备执行PowerPoint转换PDF,sourceFileName={0},targetFileName={1}",sourceFileName,targetFileName));
 89       try
 90       {
 91         using (System.IO.Stream stream = new System.IO.FileStream(sourceFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
 92         {
 93           Aspose.Slides.Pptx.PresentationEx pptx = new Aspose.Slides.Pptx.PresentationEx(stream);
 94           pptx.Save(targetFileName, Aspose.Slides.Export.SaveFormat.Pdf);
 95         }
 96       }
 97       catch (Exception ex)
 98       {
 99         Souxuexiao.API.Logger.error(string.Format("将PowerPoint文件转换为PDFConvertExcelToHtml异常原因是:{0}", ex.Message));
100       }
101       return System.IO.File.Exists(targetFileName);
102     } 
103     #endregion
104 
105     #region 2.01 读取pdf文件的总页数 +GetPageCount(string pdf_filename)
106     /// <summary>
107     /// 读取pdf文件的总页数
108     /// </summary>
109     /// <param name="pdf_filename">pdf文件</param>
110     /// <returns></returns>
111     public static int GetPageCountByPDF(string pdf_filename)
112     {
113       int pageCount = 0;
114       if (System.IO.File.Exists(pdf_filename))
115       {
116         try
117         {
118           byte[] buffer = System.IO.File.ReadAllBytes(pdf_filename);
119           if (buffer != null && buffer.Length > 0)
120           {
121             pageCount = -1;
122             string pdfText = Encoding.Default.GetString(buffer);
123             Regex regex = new Regex(@"/Type\s*/Page[^s]");
124             MatchCollection conllection = regex.Matches(pdfText);
125             pageCount = conllection.Count;
126           }
127         }
128         catch (Exception ex)
129         {
130           Souxuexiao.API.Logger.error(string.Format("读取pdf文件的总页数执行GetPageCountByPowerPoint函数发生异常原因是:{0}", ex.Message));
131         }
132       }
133       return pageCount;
134     }
135     #endregion
136 
137     #region 2.02 转换PDF文件为SWF格式 +PDFConvertToSwf(string pdfPath, string swfPath, int page)
138     /// <summary>
139     /// 转换PDF文件为SWF格式
140     /// </summary>
141     /// <param name="pdfPath">PDF文件路径</param>
142     /// <param name="swfPath">SWF生成目标文件路径</param>
143     /// <param name="page">PDF页数</param>
144     /// <returns>生成是否成功</returns>
145     public static bool PDFConvertToSwf(string pdfPath, string swfPath, int page)
146     {
147       StringBuilder sb = new StringBuilder();
148       sb.Append(" \"" + pdfPath + "\"");
149       sb.Append(" -o \"" + swfPath + "\"");
150       sb.Append(" -z");
151       //flash version
152       sb.Append(" -s flashversion=9");
153       //禁止PDF里面的链接
154       sb.Append(" -s disablelinks");
155       //PDF页数
156       sb.Append(" -p " + "\"1" + "-" + page + "\"");
157       //SWF中的图片质量
158       sb.Append(" -j 100");
159       string command = sb.ToString();
160       System.Diagnostics.Process p = null;
161       try
162       {
163         using (p = new System.Diagnostics.Process())
164         {
165           p.StartInfo.FileName = _EXEFILENAME;
166           p.StartInfo.Arguments = command;
167           p.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(_EXEFILENAME);
168           //不使用操作系统外壳程序 启动 线程
169           p.StartInfo.UseShellExecute = false;
170           //p.StartInfo.RedirectStandardInput = true;
171           //p.StartInfo.RedirectStandardOutput = true;
172 
173           //把外部程序错误输出写到StandardError流中(pdf2swf.exe的所有输出信息,都为错误输出流,用 StandardOutput是捕获不到任何消息的...
174           p.StartInfo.RedirectStandardError = true;
175           //不创建进程窗口
176           p.StartInfo.CreateNoWindow = false;
177           //启动进程
178           p.Start();
179           //开始异步读取
180           p.BeginErrorReadLine();
181           //等待完成
182           p.WaitForExit();
183         }
184       }
185       catch (Exception ex)
186       {
187         Souxuexiao.API.Logger.error(string.Format("转换PDF文件为SWF格式执行PDFConvertToSwf函数发生异常原因是:{0}", ex.Message));
188       }
189       finally
190       {
191         if (p != null)
192         {
193           //关闭进程
194           p.Close();
195           //释放资源
196           p.Dispose();
197         }
198       }
199       return File.Exists(swfPath);
200     }
201     #endregion
202   }
203 }

 

 

另:项目使用,根据需要有一些的改动

  这里还需要下载 swf 转换工具 swfTools  官网下载 安装,然后在安装目录找到 pdf2swf.exe,我是放在 项目的 bin 文件夹下面,其实可以自己放在任意的位置,只是使用的时候填好路径。

  技术分享

 

封装一个传参数的类:

    public class FlexPaper
    {
        public int ID { get; set; }

        public string SwfFileName { get; set; }

        public string PdfFile { get; set; }

        public string SwfFile { get; set; }
    }

转换的工具类:

  (1).  Word 转Pdf 的帮助类  

public class WordHelper
    {
        /// <summary>
        /// Wrod文档转换为PDF文件
        /// </summary>
        /// <param name="sourceFileName">需要转换的Word全路径</param>
        /// <param name="targetFileName">目标文件全路径</param>
        /// <returns>转换是否成功</returns>
        public static bool ConvertDocToPdF(string sourceFileName, string 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)
            {
               
            }
            return System.IO.File.Exists(targetFileName);
        }

  (2). pdf转 swf 的帮助类

 public class FlexPaperEntity
    {
        public List<FlexPaper> GetSwfFile(FlexPaper fp)
        {
            //string TemporaryDirectory = "~/Temp/";
            //string fID = fp.ID.ToString();
            string filePdf = fp.PdfFile;// TemporaryDirectory + fID + ".pdf";

            string fileName = Guid.NewGuid().ToString();
            string fileswf = fp.SwfFile; //TemporaryDirectory + fileName + ".swf";

            using(System.Diagnostics.Process p =new System.Diagnostics.Process())
            {
                //获取 执行转换功能的文件路径
                p.StartInfo.FileName = HttpContext.Current.Server.MapPath("~/bin/pdf2swf.exe");
                //p.StartInfo.Arguments = " -t " + HttpContext.Current.Server.MapPath(filePdf) + " -s flashversion=9 -o " + HttpContext.Current.Server.MapPath(fileswf);
                //转换命令
                p.StartInfo.Arguments = " -t " + filePdf + " -s flashversion=9 -o " +fileswf;
                //相应参数的设置
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = false;
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.UseShellExecute = false;
                //开始执行
                p.Start();
                p.WaitForExit();
            }
            //返回保存的路径
            List<FlexPaper> oo = new List<FlexPaper>();
            oo.Add(new FlexPaper { SwfFile = "/Temp/" + fp.SwfFileName + ".swf" });
            return oo;
        }
    }

 

 写了一个测试用的 ashx 一般处理程序

   public class GetSwf : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            //int fileID = Convert.ToInt32(context.Request["fileID"]);

            string docFile = context.Server.MapPath("~/Temp/129.doc");
            string pdfFile = context.Server.MapPath("~/Temp/129.pdf");

            WordHelper.ConvertDocToPdF(docFile, pdfFile);
            
            string fileName = Guid.NewGuid().ToString();
            string swfFile = context.Server.MapPath("~/Temp/" + fileName + ".swf");
            FlexPaper fp = new FlexPaper() {SwfFileName=fileName,  PdfFile = pdfFile, SwfFile = swfFile };
            FlexPaperEntity ent = new FlexPaperEntity();
            List<FlexPaper> lis = ent.GetSwfFile(fp);
            context.Response.Write(DataHelper.JsonSerialize(lis));
            
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

前台页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PDF_Test.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">

        #flashContent{
            display:none;
        }


    </style>

    <script src="Scripts/jquery-1.8.3-min.js" type="text/javascript"></script>
    <script src="js/flexpaper_flash.js" type="text/javascript"></script>
    <script src="js/flexpaper_flash_debug.js" type="text/javascript"></script>
    <script src="js/swfobject/swfobject.js" type="text/javascript"></script>
   

    <script type="text/javascript">


        $.get("/GetSwf.ashx", { }, function (data) {
           
            $.each(data, function (i, item) {
                var script = "<script type=\"text/javascript\">var swfFile=‘" + item.swfFile + "‘</scr" + "ipt>";
                $(head).append(script);
            });
            var s = document.createElement("script");
            s.type = "text/javascript";
            s.src = "/js/InsusDocumentView.js";
            $(head).append(s);
        }, "json");


    </script>



</head>
<body>
    <div style="position: absolute; left: 3px; top: 3px;" align="center">
        <div id="flashContent">
            <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=‘http://www.adobe.com/go/getflashplayer‘><img src=‘" + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif‘ alt=‘Get Adobe Flash player‘ /></a>");
            </script>
        </div>
    </div>
</body>
</html>

 附:整个测试项目的文件结构

技术分享

 

  

 

.net 实现Office文件预览,word文件在线预览、excel文件在线预览、ppt文件在线预览

标签:

原文地址:http://www.cnblogs.com/yougmi/p/4815836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!