在常见的windows下我们可以找到很多打印服表工具,像Grid++等(新版本的可能也已支持web打印),这些工具在winForm程序下可以正常的运行,在B/S下就会出现这样或者那样的问题。我从网上搜了很多B/S架构下打印的方法,比如 startx,jatoolsprinter等控件,这些控件对于我们一般的打印也就够了,但是对于程序自动设置特殊纸张,程序自动设置页眉页脚等功能,我们还是无能无力。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

于是促使我想研究一下关于浏览器打印的机制问题,并开发一个合适的打印dll控件。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

首先咱们先说一下我们常见的打印方法。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

1.直接使用window.print()方法

学6Gz网58v页w7f6U网(http://www.xwangye.com)

此种方法简单异常,直接把网页打印出来。但是对于一些打印控制等内容制作的不太好。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

2.使用WebBrowser控件实现打印

学6Gz网58v页w7f6U网(http://www.xwangye.com)

此种方法相对于第一种来说,我们可控制的功能更多,灵活性要比第一种好;并且该控件是IE内置,不需要下载(但是要使用好像还是要修改一个IE的安全属性的)。但是与我们特殊的要求还是有一定的差距。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

关于这个打印控件的使用方法如下:

学6Gz网58v页w7f6U网(http://www.xwangye.com)

(1)引用到页面:

以下是示例代码:
<object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height="0" width="0"></object> 

学6Gz网58v页w7f6U网(http://www.xwangye.com)

(2)打印方法的调用

学6Gz网58v页w7f6U网(http://www.xwangye.com)

document.all.WebBrowser.ExecWB(6,6)   直接打印
    document.all.WebBrowser.ExecWB(8,1)   页面设置
    document.all.WebBrowser.ExecWB(7,1)   打印预览

学6Gz网58v页w7f6U网(http://www.xwangye.com)

(3)关于页面内容的隐藏

学6Gz网58v页w7f6U网(http://www.xwangye.com)

CSS 有个Media 属性,可以分开设置打印和显示的格式。
如 <style media="print" type="text/css"> …</style> 中间的格式将只在打印时起作用,不会影响显示界面。
所以可以设定以下代码

以下是示例代码:
<style media="print" type="text/css"> 
.Noprint{display:none;} 
.PageNext{page-break-after: always;} 
</style> 
然后给不想打印的页面元素添加: class="Noprint" ,那就不会出现在打印和打印预览中了。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

此种代码也无法通过程序设置纸张的大小,只能通过手动在页面设置里修改。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

3.使用第三方控件

学6Gz网58v页w7f6U网(http://www.xwangye.com)

这类代码使用起来对我们相对要自由的很多,但是对于我来说还是有些不适合的,呵呵。

学6Gz网58v页w7f6U网(http://www.xwangye.com)

这类控件我没有怎么研究过,于是我也不再此介绍啦。以后的文章我将主要介绍关于IE打印机制的问题。

学6Gz网58v页w7f6U网(http://www.xwangye.com)