Web打印的解决方案之普通报表打印

简介:

做过很多的Web项目,大多数在打印页面内容的时候,采用的都是通过Javascript调用系统内置的打印方法进行打印,也就是调用PrintControl.ExecWB(?,?)实现直接打印和打印预览功能。打印的效果及控制性虽然不是很好,但是也能勉强使用,应付一般的打印还是可以的了。

代码如下所示:

// 调用PrintControl.ExecWB(?,?)实现直接打印和打印预览功能。(直接用系统提供的print()方法打印无法隐藏某些区域)
//
preview:是否显示预览。null/false:不显示,true:显示
function  printPage(preview)
{
   
try
   {
       
var  content = window.document.body.innerHTML;
       
var  oricontent = content;
       
while (content.indexOf( " {$printhide} " ) >= 0 ) content = content.replace( " {$printhide} " , " style='display:none' " );
       
if (content.indexOf( " ID=\ " PrintControl\ "" ) < 0 ) content = content + " <OBJECT ID=\ " PrintControl\ "  WIDTH=0 HEIGHT=0 CLASSID=\ " CLSID:8856F961 - 340A - 11D0 - A96B - 00C04FD705A2\ " ></OBJECT> " ;
       window.document.body.innerHTML
= content;
       
// PrintControl.ExecWB(7,1)打印预览,(1,1)打开,(4,1)另存为,(17,1)全选,(10,1)属性,(6,1)打印,(6,6)直接打印,(8,1)页面设置
        if (preview == null || preview == false ) PrintControl.ExecWB( 6 , 1 );
       
else  PrintControl.ExecWB( 7 , 1 );  // OLECMDID_PRINT=7; OLECMDEXECOPT_DONTPROMPTUSER=6/OLECMDEXECOPT_PROMPTUSER=1
       window.document.body.innerHTML = oricontent;
   }
   
catch (ex){ alert( " 执行Javascript脚本出错。 " ); }
}

function  printConten(preview, html)
{
   
try
   {
       
var  content = html;
       
var  oricontent = window.document.body.innerHTML;
       
while (content.indexOf( " {$printhide} " ) >= 0 ) content = content.replace( " {$printhide} " , " style='display:none' " );
       
if (content.indexOf( " ID=\ " PrintControl\ "" ) < 0 ) content = content + " <OBJECT ID=\ " PrintControl\ "  WIDTH=0 HEIGHT=0 CLASSID=\ " CLSID:8856F961 - 340A - 11D0 - A96B - 00C04FD705A2\ " ></OBJECT> " ;
       
       window.document.body.innerHTML
= content;
       
// PrintControl.ExecWB(7,1)打印预览,(1,1)打开,(4,1)另存为,(17,1)全选,(10,1)属性,(6,1)打印,(6,6)直接打印,(8,1)页面设置
        if (preview == null || preview == false ) PrintControl.ExecWB( 6 , 1 );
       
else  PrintControl.ExecWB( 7 , 1 );  // OLECMDID_PRINT=7; OLECMDEXECOPT_DONTPROMPTUSER=6/OLECMDEXECOPT_PROMPTUSER=1
       window.document.body.innerHTML = oricontent;
   }
   
catch (ex){ alert( " 执行Javascript脚本出错。 " ); }
}

上面两个函数放在一个Js文件中,在页面内容中通过应用该脚本文件并调用进一步封装的函数即可打印指定部分的内容:

     < script language = " javascript " >
        
function  Print(preview) {
            
var  text  =  document.getElementById( " content " ).innerHTML;
            printConten(preview, text);
        }

打印的效果大致如下图所示,如果打印的页面在框架页面中,那么需要选定“仅打印选定框架”的选项。

采用此种方法,不需要安装任何控件,具有很好的兼容优势,不过出来的报表内容,好像控制起来会比较麻烦一些,特别对于一些报表方面的打印,需要输出复杂的内容是,也有一定的缺陷,但总体来说,也是一个较好的选择。

后来在需要做一些证件套打方面的工作,这个控件就做不到了,因此需要一种方法或者控件,能够较好处理套打方面的事情。

无意间,发现一个比较好的打印控件,支持各种格式的打印,还有我关心的证件套打功能,功能强大,使用也很简单的,非常值得推荐。

控件的相关地址:

控件下载主页:http://mt.runon.cn/index.html

控件博客介绍:http://blog.sina.com.cn/s/articlelist_1340389911_0_1.html

应用这个控件,普通报表的打印效果如下所示:

上面两个报表的打印其实都差不多,都是打印部分的HTML内容,不过后者看起来要好一点,而且提供很完善的报表功能设置。

代码大致如下所示。

     < script  language ="javascript" >
        
function  Print(preview) {
            
var  text  =  document.getElementById( " content " ).innerHTML;
            printConten(preview, text);
        }
    
</ script >
    
    
< script  language ="javascript"  src ="http://www.cnblogs.com/Scripts/CheckActivX.js" ></ script >
    
< object  id ="LODOP"  classid ="clsid:2105C259-1E0C-4534-8141-A753534CB4CA"  width =0  height =0 >   </ object >  
    
< script  language ="javascript" >
        
var  LODOP  =  document.getElementById( " LODOP " );  // 这行语句是为了符合DTD规范
        CheckLodop();
    
</ script >
    
< script  language ="javascript"  type ="text/javascript" >

        
function  Preview() { // 打印预览
            CreateLicenseData();
            LODOP.SET_SHOW_MODE(
" PREVIEW_IN_BROWSE " 1 );
            LODOP.PREVIEW();
        };
        
function  Setup() { // 打印维护 给用户调整位置
            CreateLicenseData();
            LODOP.PRINT_SETUP();
        };
        
function  Design() { // 打印设计 开发人员设置内容和位置
            CreateLicenseData();
            LODOP.PRINT_DESIGN();
        };

        
function  CreateLicenseData() {
            LODOP.PRINT_INIT(
" 查询报表 " );
            LODOP.ADD_PRINT_HTM(
20 40 610 900 , document.all( " content " ).innerHTML);
            LODOP.PREVIEW();
        }
    
</ script >  

很多时候,我们也没的内容,都是通过CSS来控制美观的,所以有时候,我们打印部分HTML,没有这些样式的话,那么出来的Table格式和字体,可能都会发生变化,不太好看。那么就需要进行HTML的样式设置。

如果给打印内容设置了样式,那么出来的界面效果就好很多了。

设置样式的代码如下所示。

     < script language = " javascript "  type = " text/javascript " >

        function Preview() {
// 打印预览
            CreateLicenseData();
            LODOP.SET_SHOW_MODE(
" PREVIEW_IN_BROWSE " 1 );
            LODOP.PREVIEW();
        };

        function CreateLicenseData() {
            LODOP.PRINT_INIT(
" 申请处理单 " );
            var strBodyStyle 
=   " <link type='text/css' rel='stylesheet' href='http://www.cnblogs.com/Themes/Default/style.css' /><style><!--table { border:1;background-color: #CBCBCC } td {background-color:#FFFFFE;border: 1; } th { background-color:#F1F1F3;padding-left:5px;border:1}--></style> " ;
            var strFormHtml 
=  strBodyStyle  +   " <body> "   +  document.getElementById( " content " ).innerHTML  +   " </body> " ;
            LODOP.ADD_PRINT_HTM(
20 40 610 900 , strFormHtml);
            LODOP.PREVIEW();
        }
    
</ script >  

 本文转自博客园伍华聪的博客,原文链接:Web打印的解决方案之普通报表打印,如需转载请自行联系原博主。



目录
相关文章
|
6月前
|
前端开发 API 数据安全/隐私保护
Web前端开发中的跨域资源共享(CORS)解决方案
【2月更文挑战第5天】在Web前端开发中,跨域资源共享(CORS)是一个常见的挑战。本文将探讨CORS的概念和原理,并介绍一些常用的解决方案,包括服务器端配置和前端处理方法,帮助开发者更好地应对跨域请求问题。
272 4
|
6月前
|
存储 移动开发 JSON
H5学习之路之Web存储解决方案
H5学习之路之Web存储解决方案
63 0
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
113 3
|
4月前
|
SQL 存储 安全
PHP 与现代 Web 应用的安全挑战与解决方案
随着 Web 应用的发展,PHP 作为一种广泛使用的服务器端脚本语言,面临着越来越复杂的安全挑战。本文探讨了当前 PHP 开发中常见的安全问题,并提供了相应的解决方案,帮助开发者构建更安全可靠的 Web 应用。 【7月更文挑战第8天】
71 1
|
6月前
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
|
1月前
|
移动开发 前端开发 小程序
浅谈-web屏幕适配的解决方案
浅谈-web屏幕适配的解决方案
41 0
浅谈-web屏幕适配的解决方案
|
1月前
|
JavaScript 前端开发 安全
轻松上手Web Worker:多线程解决方案的使用方法与实战指南
轻松上手Web Worker:多线程解决方案的使用方法与实战指南
41 0
|
2月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
59 2
|
1月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
26 0
|
4月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
【7月更文挑战第18天】在Python的Flask框架中,结合Flask-SocketIO库可轻松实现WebSocket实时通信,促进前后端分离项目中的高效交互。示例展示了一个简单的聊天应用:Flask路由渲染HTML,客户端通过Socket.IO库连接服务器,发送消息并监听广播。此方法支持多种实时通信协议,适应不同环境,提供流畅的实时体验。
95 3
下一篇
无影云桌面