基于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 相关文章推荐
重构Javascript代码示例(重构前后对比)
Jan 23 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
php+js实现倒计时功能
Jun 02 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
Feb 11 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
vue加载完成后的回调函数方法
Sep 07 Javascript
Vue路由模块化配置的完整步骤
Aug 14 Javascript
微信小程序实现登录注册功能
Dec 29 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
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
实例讲解php数据访问
2016/05/09 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
用Python写一个自动木马程序
2019/09/17 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
广播节目策划方案
2014/05/23 职场文书
新品发布会策划方案
2014/06/08 职场文书
初中生毕业评语
2014/12/29 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
JavaScript实现优先级队列
2021/12/06 Javascript
GPU服务器的多用户配置方法
2022/07/07 Servers
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python