报表工具有哪些打印技术?

在 C/S 时代,报表是由应用程序显示的,可以直接操控打印机来实现打印。进入到 B/S 时代后,报表呈现变成浏览器的事情了,而浏览器中的 JS 编程不能直接控制打印机,只能依靠浏览器本身的打印能力。这种方式下的问题很多,比如不能精确分页,浏览器一般是根据用户设置的页面大小和 web 页面的内容多少来自行决定分页位置,程序员很难控制;再比如不能准确对齐边边距及打印文字,无法实现发票套打等功能。

浏览器为弥补这些能力,提供了 ActiveX 控件,这相当于把原来的 C/S 前端程序搬进了浏览器,这样就可以解决打印精确度和分页可控性等问题。但是 ActiveX 有很严重的安全问题:只要电脑的用户可以完成的任务,它都可以完成,比如它可以存取注册表、可以随意访问本地文件系统等。这一点严重违背了浏览器的原则,所以后来逐渐被禁用了。

很多报表工具是 Java 写成的,而 ActiveX 技术常常和 Java 并不相容。为了更好的兼容 Java,浏览器也提供了 Java Applet 来嵌入 Java 程序,可以把 Applet 理解为用 Java 编写的 ActiveX。这样也就可以在浏览器端利用 Java 的能力实现打印了,也就是 Applet 打印。Applet 打印对于精确度和分页的处理几乎做到了完美,而且打印速度也比较快:

imagepng

但是,Applet 打印也有不足之处,主要体现在两方面:一个是 Applet 方式本身的配置要求严格,一个是 Java 和浏览器的升级引起的一系列问题。Applet 要求客户端至少安装了 jre,这点操作对人员要求有点高了。虽然 Applet 比 ActiveX 的安全性要好一点,但仍有安全问题。近年来浏览器都强化了安全性,对 Java Applet 也进行了限制,要求进行数字签名,所以 Java7 以上版本打印时容易弹出以下对话框,添加了用户操作:

imagepng

谷歌浏览器干脆从 42 版本开始禁用了 Java 插件,火狐浏览器也随后禁用了 Java 插件,目前就只有 IE 内核的浏览器支持,虽然现在适用面很窄了,但也有一些用户仍然选择使用该方式。

Flash 是浏览器中一直可以使用且安装率很高的通用插件,它有较强的图形呈现等能力,而且可以编程,于是被想到用来实现打印。Flash 打印方式的出现解决了打印操作复杂度高、浏览器资源占用多的问题。它的实现原理是:客户端点击打印后会触发 Flash Player 插件(插件几乎浏览器都自带,一般不会给终端带来安装的麻烦,而且浏览器资源占用少),Flash 会按照传递过来的内容再画到自己的面板中,然后传到打印机打印,总体来看打印速度也挺快的。Flash 打印也属于精确打印,矢量打印模式下内容不失真。

imagepng

现在虽然用 Flash 打印的比较多,但是 Flash 打印有个无法解决的弊端,就是它自身的安全沙箱机制,这个机制不允许传递纸张信息,那么就会造成一个问题:客户在打印前需要手动调整纸张。

PDF 打印也是替代 applet 打印的一种常用打印方式,它的实现的原理是是从服务器端下载一个 PDF 文件流,然后调用 Adobe Reader,从而利用 Adobe 实现打印功能。也因此要给浏览器安装对应插件,不过一般情况下系统安装 Adobe Reader 后会自动给 浏览器安装对应插件。

PDF 打印是 Adobe Reader 打印的,前端并没有自编的代码了,好处是彻底没有安全性问题了,不用担心服务器端的恶意代码攻击本地电脑,但缺点是无法进行复杂的逻辑控制,比如无法在打印界面进行打印缩放、清除图层、镜像打印、分栏等设置。

小结 1

每种打印方式都有它各自的优势和不足,一个好的报表工具,除了 ActiveX 外,应当同时支持其他几种打印方式,以便于让用户在不同需求场景下自由选择使用。

以上技术解决了精确打印的问题,而报表打印还有些其他常见的特殊需求:

静默打印

静默打印是指点击打印时不弹出选项窗口和打印机设置窗口,直接把报表结果输出到打印机。报表工具应提供静默打印前台实现方式。

例如提供前台 js 方法:

Applet 直接打印:directPrintReport(‘report1’)

Flash 直接打印:directFlashPrintReport(‘report1’)

Pdf 直接打印:directPdfPrintReport(‘report1’)

套打

套打是基于一个模板文件,把数据打印到指定位置的一种打印方式,这种打印需求实现的难点在于如何对内容进行精准定位,以及多页打印下的处理。类 excel 或者 excel 报表工具可以方便制作模板文件:

imagepng

分页处理应该由报表工具自行处理,不需要用户额外添加相关代码,强制分页机制要健全且易操作:

imagepng

批量打印

批量打印是指点击一次打印按钮就可以实现多张报表的打印输出。报表工具应该本身提供批量打印功能,且支持的打印方式越多越好。使用方式也要尽可能的简单易用,例如通过 URL 直接拼不同报表参数实现 pdf 批量打印:http://localhost:6868/demo/reportJsp/pdfBatchPrint.jsp?report={t1.rpx}{t2.rpx(arg1=1;arg2=2)} 由 URL 可以看出可以支持拼接不同带参数的报表文件,这一点也是需要批量打印支持的,另外,报表工具提供的批量打印还需要支持缩放打印、横纵向混合打印。

小结 2

静默打印、套打、批量打印一般也是报表工具自有的功能,只是可能提供的实现方案不一样。当然,报表工具提供的实现操作配置越简单越好。

扩展阅读:
浅谈报表工具的打印方案
如何实现报表直接打印需求
如何实现报表的批量打印需求
报表工具实现单据套打

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reprint 使用说明 直接从datasource,dbgrid,stringgrid导入数据, 只需简单设置,不用手工制作,即可生成您需要的报表,具有预览功能。即可自定义纸张,又可适应 打印机默认纸张。各种打印设置,功能更强大。 一 、控件属性: 1、colstitle 设置报表的列标题属性 (1)alignment 列标题对齐方式。 (2)font 列标题字体 (3)print 设置是否打印列标题 (4)rowspace 列标题行的高度 2、datasource 选择要打印的datasource 3、dbgrid 选择要打印的dbgrid 4、stringgrid 选择要打印的stringgrid 5、detail 设置要打印的明细数据属性 (1)arrange 设置明细字段排列方向 Horizontal 横向打印(默认的一般打印) Vertical 竖向打印(字段竖向排列适合打印字段内容较长的报表如“会议纪录”) (2)aotureturn 打印明细字段时,如果字段超过列的宽度是否允许自动换行 (3)colsline 设置竖线属性引用tpen类 (4)footer 设置明细尾 (5)frame 设置明细边框属性引用tpen类 (6)head 设置明细头同footer (7)rowsline 设置横线属性引用tpen类 (8)rowspace 设置明细行的高度 (9)top 明细与标题的距离 6、page 设置纸张的上下左右边距 7、pagefooter 设置页脚同明细尾 8、pageheader 设置页眉同页脚 9、printobject 选择要打印的对象 (datasource 、dbgrid、 stringgrid ) 10、title 设置标题类页眉、页脚 二 、控件方法: (1) preview 预览 (2) print 打印 (3) SaveToFile() 保存为报表文件 (4) SaveToStream() 保存为流(然后就可把整个报表存到数据库了很方便哦! ~_~) (5) PrintFile() 打印报表文件 (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 三、 控件事件: AfterPrint 打印后 BeforePrint 打印前 (本来很多事件,但没有预览,后来加上预览以及一些方法后实现很困难就去掉了!) 四、注意事项 (1) text 属性,输入“¦;#¦;”打印页码值,如果想打印页码可输入“第¦;#¦;页” 输入¦;RecordCount¦;”打印记录数 (2) 不同的打印机打印和预览效果可能有一点点不同(保证数据打印完全正确一致)。本人用一台针式和一台激光打印机做测试,开始差别较大后经过调试基本一致,不知其他打印机如何。 就这些个吧基本满足了我的软件开发需要,解决了很多问题,关键是做报表省了很大力气,当然了很复杂的报表还是要其它报表控件来解决。如果有其他问题或好的建议可与我联系。 程序设计:吴进昊 E-mail :jinhaowu@hotmail.com qq :54254770 2003.01.03 新增明细栏的左右对齐. 纸张类型、打印方向设置! 标题的每页打印设置。 列标题的每页,每行打印设置。 修改了打印时的错误!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值