基于Web的套打方案分析

   应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布。但对程序员来说,因为浏览器的局限性,却要面对很多挑战。怎么样来进行基于web的套打,就是这么一个令多数程序员头痛不已的问题。 

    基于web的套打,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置的控制。下面就ie浏览器所能采用的套打解决方案,来个汇总分析,希望对大家有所帮助。 

一、浏览器的打印功能菜单
这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
1. 不能精确分页。
浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
2. 不能准确对齐边边距及打印文字。
3. 不能解决连续打印。
比如,不是仅打印一张票据,而是连续一次打印若干个票据。

二、使用webbrowser控件+ javascript
这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。

三、使用print css
这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print css推出已经有些时日,但遗憾的是,至今没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见http://css-discuss.incutio.com/?page=PrintStylesheets

四、使用pdf文件
用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。

五、采用纯ActiveX 
这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优点是打印的精确度高,分页的可控性好,但缺点也是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M),下载颇费时间)。市场上的非java类报表产品,一般都采用这种方案。

六、采用Applet方式
采用Applet方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:
1. 安装Applet成本巨大。需要下载十几M的文件。
Applet本身可能并不大,但运行Applet所需的jre一般至少10几M(jre1.4.2 , 15.45M)。用户需要极大的耐心,来进行打印。
2. 打印报表时,需要重新向服务器检索数据,效率低。
因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。
市场上java类的报表工具,一般推荐Applet方式来实现打印。

转载于:https://www.cnblogs.com/wangbinjr/archive/2010/10/26/2354190.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day1-Linux操作系统基础

该专栏所有内容笔记均来自传智播客培训班 1.什么是操作系统(operate system OS) 小议:承上启下作用,向下可以控制硬件,向上能够支持软件的运行。一个可以控制硬件的软件。 小明找小红聊天,小明打开QQ&…

关闭浏览器 清空session_跨境网络小知识之Session

跨境小伙伴们大家好,上一篇为大家介绍了Cookie,今天就为大家介绍下连接cookie的另一端Session,交互过程中,二者缺一不可。与Cookie相对,Session是存储在服务端的,他们之间是通过一个叫做sessionID的东东建立…

我和乘子交替方向法admm_找到最大和交替子序列

我和乘子交替方向法admmProblem statement: 问题陈述: Given a sequence of numbers, you have to find the maximum sum alternating subsequence and print the value. A sequence is an alternating sequence when it will be maintain like (increasing) ->…

Dojo学习笔记(一):Hello Dojo!

欢迎来到Dojo世界!在这篇文章中你将会学习到如何加载Dojo以及探索Dojo的一些核心功能。你还会了解Dojo的基于AMD的模块架构,探索如何加载额外的模块来增加功能到您的Web站点或应用程序,并找出在出错的时如何得到帮助。让我们开始吧 开始学习D…

转:我眼中的Visual Studio 2010架构工具

来自:http://www.cnblogs.com/wayfarer/archive/2010/07/30/1788398.html我眼中的Visual Studio 2010架构工具影响架构质量的是构建体系架构的思想、原则、实践与架构师的经验,绝不是工具。即使是最优秀的架构工具,也不可能像倚天宝剑一般——…

VMware创建Ubuntu操作系统到网络配置详细流程

一、创建虚拟机 Ubuntu下载链接 1,看个人需求了,有更高的版本,下载Ubuntu镜像 2,VMware官网随便下载即可 3,创建新的虚拟机 4,自定义 5,默认即可 6,稍后安装操作系统 7&#xf…

djiango配置mysql_数据库MySQL相关环境配置以及数据库与Go的连接

Linux下安装好MySQL后,Windows安装可视化工具navicatLinux下MySQL与Windows下navicat进行连接:安装的过程很是揪心,各种查网站、大致把坑都写了出来:1、在Linux下的mysql语句中,mysql> select host,user,authentication_string…

缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)

open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。 fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应…

java 继承示例_Java中的继承类型以及示例

java 继承示例Prerequisite: Inheritance and its implementation in Java 先决条件: 继承及其在Java中的实现 Java中的继承类型 (Type of inheritance in Java) In Java programming, there are following types of the inheritances, 在Java编程中,有…

基于HtmlParser的网络爬虫

一、 目标 获取网页中的超链接及链接名,如从http://www.hao123.com/开始,抓取所有hao123链接到的超链接,再以获取到的链接网页为目标,获取它所链接到的网页。 二、环境及开发工具 环境:Java 工具:MyEclip…

VMware下Ubuntu无法全屏显示问题

一、运行Ubuntu的时候无法全屏显示,如图所示下载VMware Tools 二、之后将下载的文件拷贝到home文件夹下 三、解压该压缩包 由于该压缩包是.tar.gz结尾的故压缩命令:tar -zxvf VMwareTools-10.2.5-8068393.tar.gz,当然各版本有可能不一样&am…

AMQP RabbitMQ

转载:http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/官方介绍:http://www.rabbitmq.com/erlang-client-user-guide.html开始吧AMQP当中有四个概念非常重要:虚拟主机(virtual host&#xff…

fsync与fflush的关系和区别

read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync: linux底层操作; 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。 fread/fwrite/fflush:…

lumanager mysql密码_LuManager单独安装mysqli

首先确定你正在使用的php版本以及php.ini的位置,LuManager自带了几个版本。如果是默认安装,应该是5.2.17。php.ini的位置应该是在/usr/local/php_fcgi/lib/php.ini要确定这些信息,可以自己编写一个 info.phpphpinfo();?>把文件存放到网站…

数据库系统数据库管理系统_数据库管理系统介绍

数据库系统数据库管理系统数据库 (Database) A database is a collection of related data. In database any user can efficiently access the data which users want to retrieve. It can be anything from a simple collection of roll numbers, names, addresses and phone…

vba将select的值直接赋给变量

strSql ""strSql strSql & " select max(number) from dbo.#DATA" & vbCrLfrss.Open strSql, cnn numb rss.Fields(0)rss.Close转载于:https://www.cnblogs.com/zigewb/archive/2013/02/06/2900645.html

set_exception_handler 自定义异常处理

刚才已经说过了set_error_handler这个函数,作用就是自定义错误处理, 那么现在就来简单的说一下set_exception_handler,看名字我们就能发现,这说的是自定义异常处理。 呵呵,我聪明吧?来,先看一下…

如何获取ubuntu源码包里面的源码进行编译

如何获取ubuntu源码包里面的源码进行编译 1、在获取源码包之前,确保在软件源配置文件 /etc/apt/sources.list中添加了deb-src项 2、使用如下命令获取xxx源码包的详细信息: sudo apt-cache showsrc xxx 这用来查询当前镜像站点中是否有该源码包。 3、源码包中通常…

python 示例_带有示例的Python字典popitem()方法

python 示例字典popitem()方法 (Dictionary popitem() Method) popitem() method is used to remove random/last inserted item from the dictionary. popitem()方法用于从字典中删除随机/最后插入的项目。 Before the Python version 3.7, it removes random item and from …