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

2013-11-30  来源:本站原创  分类:实用技巧  人气:8 

这篇文章主要介绍了.NET实现在网页中预览Office文件的3个方法,本文最终采用了ASPOSE+pdf2swf+FlexPaper的方式解决了这个需求,需要的朋友可以参考下

近日公司要搞一个日常的文档管理的东东,可以上传、下载各种文件,如果是office文件呢还必须得支持预览功能,其他的都好说但是唯独office预览功能比较麻烦,但是不能不做,废话不多说了一步步来吧。分析了下网易邮箱的文件预览功能,他用的是微软的组件,最早叫Office online,现在分开了叫Word online、Excel online ....等等,效果十分炫酷功能十分强大,但是查看了下对api的说明发现对服务器的要求比较苛刻而且配置比较复杂不太适合。然后 又看了下腾讯用的是永中第三方组件,效果嘛自然比不上微软的但是能用,综合网上的一些资料大概也就那么几种方式实现

1.使用Microsoft的Office组件将文件直接转换为html文件(优点:代码实现最简单,工作强度最小。缺点:效果极差)

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

效果如图:

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

3. 使用Office online(优点:表现完美,缺点:不适合中小企业应用)

综合考虑决定使用第二种方法,经过次次波折终于可以使用,但是有个问题至今没有得到解决,调用Office组件的时候有时候会出现如下异常:

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

好吧!那么我们改进它。

使用ASPOSE+pdf2swf+FlexPaper

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

1、引用dll

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

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格式转换

3、将pdf文件转swf的转换器放到站点根目录下新建文件夹pdf2swf(我就是这么配置的,您随意)

4、配置FlexPaper

预览页面引用

复制代码 代码如下:

 <script src="/FlexPaper/js/swfobject.js" type="text/javascript"></script>

<script type="text/javascript" src="/FlexPaper/js/flexpaper_flash.js"></script>

控件容器以及设置项

复制代码 代码如下:

<div style="margin:0 auto;width:980px;">

            <div id="flashContent" style="display:none;"> 

                <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>

        <script type="text/javascript">

            var _filename = document.getElementById("_filename").value;

            var swfVersionStr = "9.0.0";

            var xiSwfUrlStr = "playerProductInstall.swf";

            var flashvars = {

                SwfFile: escape(_filename),

                Scale: 0.6,

                ZoomTransition: "easeOut",

                ZoomTime: 0.5,

                ZoomInterval: 0.1,

                FitPageOnLoad: false,

                FitWidthOnLoad: true,

                PrintEnabled: true,

                FullScreenAsMaxWindow: false,

                ProgressiveLoading: true,
                PrintToolsVisible: true,

                ViewModeToolsVisible: true,

                ZoomToolsVisible: true,

                FullScreenVisible: true,

                NavToolsVisible: true,

                CursorToolsVisible: true,

                SearchToolsVisible: true,

                SearchMatchAll:true,
                localeChain: "zh_CN"

            };

            var params = {

                quality: "high",

                bgcolor: "#ffffff",

                allowscriptaccess: "sameDomain",

                allowfullscreen: "true"

            }

            var attributes = { id: "FlexPaperViewer", name: "FlexPaperViewer" };

            swfobject.embedSWF("/FlexPaper/FlexPaperViewer.swf", "flashContent", "980", "620", swfVersionStr, xiSwfUrlStr, flashvars, params, attributes);

            swfobject.createCSS("#flashContent", "display:block;text-align:left;");

        </script>

        </div>

document.getElementById("_filename").value是预览文件的路径

OK 大功告成 ,至于如何上传,怎么保存上传的文件等等那些逻辑我这里就省略了。。。。,但是有个建议,当用户上传文件之后调用转换api生成预览文件是个耗时的操作,

文件越大耗时越长,也就是说生成预览文件的时候是需要时间的,因此我使用异步方式生成预览文件。

相关文章
  • .NET实现在网页中预览Office文件的3个方法 2013-11-30

    这篇文章主要介绍了.NET实现在网页中预览Office文件的3个方法,本文最终采用了ASPOSE+pdf2swf+FlexPaper的方式解决了这个需求,需要的朋友可以参考下 近日公司要搞一个日常的文档管理的东东,可以上传.下载各种文件,如果是office文件呢还必须得支持预览功能,其他的都好说但是唯独office预览功能比较麻烦,但是不能不做,废话不多说了一步步来吧.分析了下网易邮箱的文件预览功能,他用的是微软的组件,最早叫Office online,现在分开了叫Word online.Exc

  • 如何在Windows Vista中预览PDF文件的方法 2014-10-15

    之前我们曾介绍过Windows Vista的预览功能,即在用户不打开相应文件的情况下查看文件的具体内容,这是个相当有用的功能,可以大大提高日常工作的效率.Windows Vista预览功能可支持的对象包括图片.音频.视频.字体.文本.E-mail乃至Office文档如Word.Excel.PowerPoint文件. 不过,对于PDF(Portable Document Format)文件,则没有这么幸运了,即使在Windows Vista中安装了可以创建PDF的Office 2007后,仍然不能

  • 经管资源库项目总结----在线预览office文件的实现与总结 2014-10-14

    依旧是这个经管的项目.在线预览作为资源和文档管理系统的一个很酷的并且是如此重要的功能,是必须要实现的.然后百度一下office在线预览,看起来so eazy啊,各种博客各种demo,一下子就做出效果来了.开始时我采用的方法是用openoffice+jobconverter+swftools+fexpaper的方式.参考博客:http://blog.csdn.net/sunny_sailor/article/details/7311411 后来发现,还是有很多问题的.比如首先每次都要注册windo

  • 让Windows 7重新支持文件夹中预览播放 2014-11-19

    细心的Windows 7用户可能会发现这样一个情况:新安装的,纯净的Windows 7系统可以在库或资源管理器模式下,直接在文件夹中预览(部分)AVI等,Windows Media Player 12直接支持的视频文件(如图1). 在Windows 7下直接预览并播放高清大片风声 但是在用户安装了暴风影音.迅雷看看等第三方的"全能播放器"后,那些原来可以预览并播放的视频文件,现在只能预览到一张图片,但是无法直接在文件夹中播放(如图2). 安装了暴风等播放器后 无法在Windows 7文

  • iPhone中预览文档的三种方式 2012-03-09

    在iPhone中可以很方便的预览文档文件,如:pdf.word等等,这篇文章将以PDF为例.介绍三种预览PDF的方式,又分别从本地pdf文档和网络上的pdf文档进行对比. 预览本地PDF文档: 1.使用UIWebView控件 UIWebView是iPhone开发中最常用的控件之一,类似.net中的webBrowser控件.使用它预览PDF文件相当的方便和简单. 在UIWebView中预览PDF文档的关键代码如下: 效果: 2.使用CLPreviewController CLPreviewCont

  • 浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法 2014-02-17

    在编写PHP文件过程中,发现在浏览器预览PHP文件时,顶部会出现一行空白,影响了页面的布局 在编写PHP文件过程中,发现在浏览器预览PHP文件时,顶部会出现一行空白,影响了页面的布局. 关于BOM header的解释如下: 通常情况下,使用Windows系统自带的记事本程序编写网页程序,但在编写或修改php博客系统代码后,进行调试时总是会出现如同以下几点问题: ?不能登入或者不能登出: ?页顶出现一条空白: ?页顶出现错误警告: ?其它不正常的情况. 分析原因: 由于使用UTF-8编码,在编写或

  • PHP在网页中动态生成PDF文件详细教程 2013-12-15

    这篇文章主要介绍了PHP在网页中动态生成PDF文件详细教程,本文用一个需求为引,详细介绍每一步骤的做法,并配有大量图片说明,需要的朋友可以参考下 本文详细介绍使用 PHP 动态构建 PDF 文件的整个过程.使用免费 PDF 库 (FPDF) 或 PDFLib-Lite 等开源工具进行实验,并使用 PHP 代码控制 PDF 内容格式. 有时您需要准确控制要打印的页面的呈现方式.在这种情况下,HTML 就不再是最佳选择了.PDF 文件使您能够完全控制页面的呈现方式,以及文本.图形和图像在页面上的呈现

  • 解析VC中预编译头文件的深入分析 2014-11-07

    本篇文章是对VC中预编译头文件进行了详细的分析介绍,需要的朋友参考下 一.为什么预编译头文件:预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码,甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变.如果这些代码被修改,则需要重新编译生成预编译头文件.注意生成预编译头文件是很耗时间的.同时你得注意预编译头文件通常很大,通常有6-7M

  • PHP中的生成XML文件的4种方法分享 2014-01-10

    PHP中的生成XML文件的4种方法分享,需要的朋友可以参考下 生成如下XML串 Xml代码 <?xml version="1.0" encoding="utf-8"?> <article> <item> <title size="1">title1</title> <content>content1</content> <pubdate>2009-10

  • 微软预览Office for Mac 2011 或有iPad版 2015-04-15

    本周举行的Macworld展会由于没有了苹果官方的参与,媒体和民众的关注度已经大大下降.苹果不来,反而是微软成了这场Mac平台展会的主角.微软公司今天在Macworld展会上预览了下一代Mac OS X平台办公软件Office for Mac 2011,表示该软件将在今年年内上市. Office for Mac 2011在功能上重点增强网络协作,同事和好友可以在网络上共同修改完成一份文档.另外,Office 2011还将整合Office网页应用,方便共享文档或在任何地点上网进行编辑. 界面方面,

  • 如何下载网页中的flash(.swf)文件? 2014-12-09

    很多朋友在上网的时候,看到网页上好看的flash文件,总是会忍不住想要据为己有.是不是有想把它下载下来的冲动?不过,很多朋友不知道如何下手才能够把网页中的flash下载下来. 今天路大侠跟大家分享几个小技巧,可以很方便的下载网页中的flash. 技巧一 巧用网页原文件找flash的Url 我们知道,flash文件是以.swf为后缀名的文件,所以只要找到了flash的url,然后复制到迅雷的下载链接地址栏中,就可以轻松下载了. 怎么查找flash的url呢?路大侠推荐用网页原文件的方法.打开网页后

  • 网页中关于元素垂直水平居中的最简单方法(不用javascript) 2013-04-17

    以下是相关的代码: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #oDiv { width:200px; height:150px; margin:auto; position:fixed; lef

  • php中设置index.php文件为只读的方法 2014-04-06

    由于自己网站的ftp不具有直接设置空间上文件的属性,于是写了一段php代码来修改index.php文件属性 为index.php文件设置只读属性后,木马就没权限给你文件末尾追加广告了. 下面我们看具体的代码,设置index.php只读: <?php function set_writeable($file_name) { if(@chmod($file_name,0555)) { echo "修改index.php文件只读属性成功"; } else { echo "修改

  • 网易163邮箱推出"邮件附件在线预览"功能 2014-02-17

    网易邮箱近日推出"邮件附件在线预览"功能.用户在实验室申请开通该功能后,即可通过邮箱在线查看office文档.pdf文档.图片.压缩包等文件中的内容.网易免费邮箱针对主流文件格式推出附件在线预览功能,即便下载不方便,没有安装相应的应用程序,都可以在邮箱里直接查看文件. 当网易邮箱用户申请开通"邮件附件在线预览"功能后,会收到含有附件的邮件,在附件的下面,会出现"在线预览"的链接,用户可根据实际需求点击相应的链接,即可在新窗口中预览文档.网易的附件

  • Windows 7新功能详解:预览打开的文件 2013-11-14

    Windows操作系统中有个的窗口预览的功能,它能让你快速查看最小化窗口的缩略图.不用打开他们,鼠标移动到窗口的位置就能查看.但也有一些不方便的地方. 例如,你可以查看单一的网页,但网页中很多以选项卡方式打开的页面就不能预览了. 打开多个IE浏览器窗口时,窗口项目就会合并,你就没办法预览所有的窗口,因为它们都叠在一起了 现在,看看Windows 7的预览方式吧,不管是选项卡方式打开的网页还是多个IE文件,轻松预览.快速找到你需要的那个窗口. 文件夹也一样,乃至所有打开的窗口,都能进行预览.但问题

  • iPhone软件商店开放浏览器预览功能 2014-07-18

    苹果的App Store网上软件商店目前软件数量已经超过14万种.不过除了在iPhone/iPod touch直接登录浏览下载外,用户在电脑上必须安装iTunes软件才能浏览商店内容. 去年11月,苹果开放了iTunes Preview功能,用户可以在网页浏览器中预览iTunes商店中的音乐内容,今年1月初增加了浏览器内的歌曲试听功能.现在,iTunes Preview又扩展到了App Store软件商店.在没有安装iTunes的电脑上,用户在苹果网站中点击任意一款软件,即可在浏览器中直接浏览其

  • OpenERP PDF报表浏览器预览打印 Openerp Web PDF Report Preview & Print 2012-08-03

    Openerp Web PDF Report Preview & Print 网站 : https://github.com/buke/odoo-web-pdf-preview-print Openerp Web PDF Report Preview & Print 作者: [email protected] 简介: 将OpenERP 的PDF报表打印下载功能,改为直接在浏览器中预览打印. For IE, 需要安装 Adobe Reader. For Firefox ,需要安装 Adobe

  • Piclens-华丽的Firefox图片预览插件 2014-06-06

    Piclens 原本是为 Safari Web 浏览器量身定做的一款网页图片预览工具,它允许用户在浏览网页的同时将网站上出现的一张张图片以全屏Slideshow的显示展示给用户:最近Piclens公司推出了一款基于Firefox下的预览插件: Piclens 并不支持预览所有网站上的图片,稍微有些局限性:不过,我感觉这样的参数设置并不妨碍我对Piclens的喜爱,因为它已经基本上囊括了所有我希望预览的网站,例如:Flickr,Facebook,Google Images,Yahoo Images

  • javascript IE7 浏览器本地图片预览 2015-02-22

    在 IE6 中,可以很方便地利用 img 的 src 属性,实现本地图片预览,然而在 IE7 中,这种办法却行不通.需要用 AlphaImageLoader 说明: 在对象容器边界内,在对象的背景和内容之间显示一张图片.并提供对此图片的剪切和改变尺寸的操作.如果载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供. 语法: filter : progid:DXImageTransform.Microsoft.AlphaImageLoader

  • 搜索引擎的预览功能调查 2013-10-13

    国内的几个搜索引擎后起之秀都有预览的功能,即支持在搜索结果页独立层上激活网页文本预览.这些搜索引擎都有独立的"网页快照"功能.也就是说这个是个独立的功能feature,目前Google,雅虎,百度都没有这个独立功能,还是使用传统的网页快照方式. 我一直很困惑,这个功能价值何在,抑或就是一个技术秀or概念秀?带着这个疑问,反复使用体验,甚至翻阅了大量相关的信息,包括官方的介绍,粗略记录如下. 1 有道最早有的,鼠标悬停在预览功能链接上即可显示,预览的文本带漂红,且支持定位关键字.鼠标在页