.NET实现在网页中预览Office文件的3个方法

前端技术 2023/09/03 .NET

近日公司要搞一个日常的文档管理的东东,可以上传、下载各种文件,如果是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-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。 (异常来自 HRESULT:0x8000401A),查阅无数资料还是不能解决,最让人不可接受的的是office文件必须标标准准毫无容错能力,当转换ppt文件时竟然会弹出转换进度框!!

好吧!那么我们改进它。

使用ASPOSE+pdf2swf+FlexPaper

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

1、引用dll

2、编写转换帮助类

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aspose.Cells;
using Aspose.Words;
using Aspose.Slides;
using System.Text.RegularExpressions;
using System.IO;

namespace Souxuexiao.Common
{
    /// <summary>
    /// 第三方组件ASPOSE Office/WPS文件转换
    /// Writer:Helen Joe
    /// Date:2014-09-24
    /// </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.IO.Path.Combine(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.API.Logger.info(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.API.Logger.info(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.Count;
                    }
                }
                catch (Exception ex)
                {
                    Souxuexiao.API.Logger.error(string.Format(\"读取pdf文件的总页数执行GetPageCountByPowerPoint函数发生异常原因是:{0}\", ex.Message));
                }
            }
            return pageCount;
        }
        #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 = null;
            try
            {
                using (p = new System.Diagnostics.Process())
                {
                    p.StartInfo.FileName = _EXEFILENAME;
                    p.StartInfo.Arguments = command;
                    p.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(_EXEFILENAME);
                    //不使用操作系统外壳程序 启动 线程
                    p.StartInfo.UseShellExecute = false;
                    //p.StartInfo.RedirectStandardInput = true;
                    //p.StartInfo.RedirectStandardOutput = true;

                    //把外部程序错误输出写到StandardError流中(pdf2swf.exe的所有输出信息,都为错误输出流,用 StandardOutput是捕获不到任何消息的...
                    p.StartInfo.RedirectStandardError = true;
                    //不创建进程窗口
                    p.StartInfo.CreateNoWindow = false;
                    //启动进程
                    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格式转换

本文地址:https://www.stayed.cn/item/6406

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。