基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作


Posted in Javascript onMay 12, 2016

本篇文章主要介绍如何实现Web页面内容的打印预览和保存操作的相关知识,一起学习吧!

1、Web页面打印的问题

在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预览,打印等操作,还是很方便的一个控件,因此都很适合普通内容的打印,证件的套打等操作。

不过随着浏览器技术的更新,这个插件在Chrome或者FireFox上好像不受支持了,基本上摒弃了这种插件的处理方式了。例如如果我在页面上需要打印对话框里面的内容,如下所示。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

如果按正常使用LODOP的方式来进行处理的话,那么会得到Chrome浏览器的提示,并且这个不管你重新下载安装、更新LODOP控件,都会继续这个错误提示的。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

对于替代方式,这里就是本篇内容介绍的主题了,我一直喜欢寻找一些比较好的方式的方式来实现自己需要的功能,于是找到了PrintThis的这个插件(https://github.com/jasonday/printThis)以及jquery-print-preview-plugin(https://github.com/etimbo/jquery-print-preview-plugin),对比两者我比较喜欢第一个的简洁方便的使用。

2、PrintThis打印插件的使用

有了上面的问题,我们引入一个新的打印方式,也就是JQuery插件来实现我们所需要页面内容的打印操作。

这个插件的使用非常简洁方便,首先需要在页面里面引入对应的JS文件,如下所示。

<script src="~/Content/JQueryTools/printThis/printThis.js"></script>

我们再在页面顶部增加两个按钮,如打印和导出操作,代码如下所示

<div class="toolbar">
 <a href="#" onclick="javascript:Preview();"><img alt="打印预览" src="~/Content/images/print.gif" /><br />打印预览</a>
 <a href="#" onclick="javascript:SaveAs();"><img alt="另存为" src="~/Content/images/saveas.gif" /><br />另存为</a>     
</div>

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

然后我们还需要声明一个DIV用来放置显示的Web页面内容,这样也方便对它调用进行打印操作。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

我们打印的处理代码也很简单,就是直接对层进行打印处理就可以了,可以看到下面的使用代码非常简单。

//打印预览
    function Preview() {
      $("#printContent").printThis({
        debug: false,
        importCSS: true,
        importStyle: true,
        printContainer: true,
        loadCSS: "/Content/Themes/Default/style.css",
        pageTitle: "通知公告",
        removeInline: false,
        printDelay: 333,
        header: null,
        formValues: true
      });
    };

打印执行后,IE和Chrome都会弹出一个打印预览对话框,确认是否进行打印的操作。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

3、页面内容的保存操作

有时候,为了方便业务处理,我们一般也可以提供给用户一个导出打印内容的操作,如下所示代码就是把打印的内容导出到Word里面给用户加工等用途。

function SaveAs() {
      var id = $('#ID2').val();
      window.open('/Information/ExportWordById?id=' + id );
    }

上面的操作,主要就是调用了MVC的控制器方法进行处理,传入一个id就可以把内容提取出来,然后把它生成所需的Word内容即可。

这里后台我们主要利用Apose.Word控件来进行模板化的文档生成。

其中我们可以在书签里面定义或者查看一些书签的信息,如下图所示。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

这样我们在代码里面,就可以获取信息并指定这个Word模板了。

InformationInfo info = BLLFactory<Information>.Instance.FindByID(id);
      if (info != null)
      {
        string template = "~/Content/Template/政策法规模板.doc";
        string templateFile = Server.MapPath(template);
        Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);

WORD模板的内容,可以使用文本替换方式,如下所示。

SetBookmark(ref doc, "Content", info.Content);

也可以使用书签BookMark方式查询替换,如下代码所示。

Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks[title];
      if (bookmark != null)
      {
        bookmark.Text = value;
      }

对于主体的HTML内容,这需要特殊对待,一般需要使用插入HTML的专用方式进行写入内容,否则就显示HTML代码了,使用专用HTML方法写入的内容,和我们在网页上看到的基本没有什么差异了。如下代码所示。

DocumentBuilder builder = new DocumentBuilder(doc);
        Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks["Content"];
        if (bookmark != null)
        {
          builder.MoveToBookmark(bookmark.Name);
          builder.InsertHtml(info.Content);
        }

整个导入WORD文档的方法就是利用这些内容的整合,实现一个标准文档的生成,这种业务文档是固定模板的,因此很适合在实际业务中使用,比起使用其他方式自动生成的HTML文件或者文档,有更好的可塑性和美观性。

整个代码如下所示。

public FileStreamResult ExportWordById(string id)
    {
      if (string.IsNullOrEmpty(id)) return null;
      InformationInfo info = BLLFactory<Information>.Instance.FindByID(id);
      if (info != null)
      {
        string template = "~/Content/Template/政策法规模板.doc";
        string templateFile = Server.MapPath(template);
        Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);
        #region 使用文本方式替换
        //Dictionary<string, string> dictSource = new Dictionary<string, string>();
        //dictSource.Add("Title", info.Title);
        //dictSource.Add("Content", info.Content);
        //dictSource.Add("Editor", info.Editor);
        //dictSource.Add("EditTime", info.EditTime.ToString());
        //dictSource.Add("SubType", info.SubType); 
        //foreach (string name in dictSource.Keys)
        //{
        //  doc.Range.Replace(name, dictSource[name], true, true);
        //} 
        #endregion
        //使用书签方式替换
        SetBookmark(ref doc, "Title", info.Title);
        SetBookmark(ref doc, "Editor", info.Editor);
        SetBookmark(ref doc, "EditTime", info.EditTime.ToString());
        SetBookmark(ref doc, "SubType", info.SubType);
        //SetBookmark(ref doc, "Content", info.Content);
        //对于HTML内容,需要通过InsertHtml方式进行写入
        DocumentBuilder builder = new DocumentBuilder(doc);
        Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks["Content"];
        if (bookmark != null)
        {
          builder.MoveToBookmark(bookmark.Name);
          builder.InsertHtml(info.Content);
        }        
        doc.Save(System.Web.HttpContext.Current.Response, info.Title, Aspose.Words.ContentDisposition.Attachment,
          Aspose.Words.Saving.SaveOptions.CreateSaveOptions(Aspose.Words.SaveFormat.Doc));
        HttpResponseBase response = ControllerContext.HttpContext.Response;
        response.Flush();
        response.End();
        return new FileStreamResult(Response.OutputStream, "application/ms-word");
      }
      return null;
    }
    private void SetBookmark(ref Aspose.Words.Document doc, string title, string value)
    {
      Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks[title];
      if (bookmark != null)
      {
        bookmark.Text = value;
      }
    }

最后导出的WORD文档就是模板化的具体文档内容了,WORD预览界面如下所示。

基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

以上所述是小编给大家介绍的基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作 的相关内容,希望对大家有所帮助,如果大家想了解更多资讯敬请关注三水点靠木网站!

Javascript 相关文章推荐
一段利用WSH修改和查看IP配置的代码
May 11 Javascript
jquery操作HTML5 的data-*的用法实例分享
Aug 17 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
JavaScript初学者必看“new”
Jun 12 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
Vue 表单控件绑定的实现示例
Aug 11 Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 Javascript
jquery+php后台实现省市区联动功能示例
May 23 jQuery
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 #Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
May 12 #Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 #Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
May 12 #Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
May 12 #Javascript
使用bootstrap3开发响应式网站
May 12 #Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 #Javascript
You might like
JAVA/JSP学习系列之二
2006/10/09 PHP
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
php笔记之常用文件操作
2010/10/12 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python集合类型用法分析
2015/04/08 Python
git进行版本控制心得详谈
2017/12/10 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Python获取时间戳代码实例
2019/09/24 Python
Python常用库大全及简要说明
2020/01/17 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Django models文件模型变更错误解决
2020/05/11 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
vscode调试django项目的方法
2020/08/06 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
制作部班长职位说明书
2014/02/26 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
python实现简单聊天功能
2021/07/07 Python