`
truemylife
  • 浏览: 230609 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

web打印技术选型的烦恼与折衷方案

阅读更多

 


一、 讨论范围:

 

基于web网页、浏览器限于IE

 

二、  引子:

 

我们团队在做项目的过程中,碰到不同情况的打印需求;我这里把打印需求分成四种。

1)、复杂的报表打印,需要做套打。

2)、最简单的网页内容打印。

3)、简单设置后的网页内容打印。

4)、简单设置后(包括横向、纵向)自动设置后的网页内容打印。

之所以把34分开,是因为这两者研究的过程中两者看似小的差别,但技术实现上还是有不一样的地方,我们团队在项目过程中刚好碰到了第4种需求,进行一翻技术研究后,发觉第4种需求技术解决方案着实让人烦恼。但是再进一步在用户体验的角度来看,第4种和第3种虽说都能实现,但体验差不多一样糟糕。因此最终的折衷方案适合于第3、4种需求。

                   这里先对前两种需求的技术选型做出简单说明,然后再进一步讨论第3、4种需求及我们的折衷方案。

        

1)复杂的报表打印,需要做套打

开发ActiveX控件;或者使用开源;或者购买商用控件。我们团队使用的是自己开发的ActiveX控件。

2)最简单的网页内容打印

使用IE自带的打印,或者简单的使用js调用

Webbrowser

 

三、 展开讨论--web页面设置

 

ie浏览器->打印->页面设置界面,可以看到有以下元素可以设置:

1)纸张大小

2)纵向/横向

3)打印背景颜色和图像

4)启用缩小字体填充

5)页眉

6)页脚

7)左边距

8)右边距

9)上边距

10)下边距

11)字体大小

在设置并保存后,退出ie后,再次进入界面会发现纵向/横向和纸张大小这两个保存会丢掉,其他的都能保存住上次设置的状态。或许因为纵向/横向和纸张大小在打印设置那里还可以设置,所以这个值就没有被存入注册表。来看一下注册表

HKEY_CURRENT_USER/SOFTWARE/Microsoft/Internet Explorer/PageSetup,可以看到以下键值(中文作者加上)

font(字体大小)

footer(页脚)

header(页眉)

margin_bottom(下边距)

margin_left(左边距)

margin_right(右边距)

margin_top(下边距)

Print_Background(打印背景颜色和图像)

Shrink_To_Fit(启用缩小字体填充)

通过页面设置和注册表对比,可以很清楚看到纸张大小和纵向/横向不被存入注册表。因此就有了引子里讲到的第3和第4种需求的区别,第3种需求是指不设置纸张大小和纵向/横向设置。第4种需求则多了这两项。

 

四、如何修改页面设置注册表

 

基于第3种需求,主要是修改注册表,javascript代码如下:

 

<script type="text/javascript">
    var hkey_root,hkey_path,hkey_key  
    hkey_root="HKEY_CURRENT_USER";
    hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
      //这个是用来设置打印页眉页脚的,你可以设置为空或者其它
      try{  
            var RegWsh = new ActiveXObject("WScript.Shell");
             
            hkey_key="header";
            RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
           
            hkey_key="footer";
            RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
      }catch(e){
      alert(e.description);
      }
</script>
 

 

五、 如何修改页面设置纵向/横向及纸张大小

 

能否不通过第三方的activeX,直接利用javascript直接修改这两个属性呢?在网上折腾了两天后,只找到一种办法,还是使用WScript.Shell,代码例子如下

 

<script type="text/javascript">
                   try{
var RegWsh = new ActiveXObject("WScript.Shell");
RegWsh.sendKeys('%fu');//按下Alt+F+U键
RegWsh.sendKeys('%a');//按下了ALT+A键
RegWsh.sendKeys('{ENTER}');//按下Enter键
}catch(e){
      alert(e.description);
}
</script>
 

 

在执行时,可以看到有弹出页面设置的界面然后保存关闭的过程。

如果大家有其他体验更好的解决方案,希望能补充。

 

六、用户体验带来的烦恼

 

1、以上不管是哪种方案,都会提示用户安全上的确认,如果我们的ActiveX是通过官方认证的,相对来说安全级别是较高的,大部分用户是能接受的。

2、而第四、五点的实现在一般用户的安全设置情况下,会报出错误提示”automation服务器不能创建对象

客户端可以通过以下三种办法排查:

1)、如果是Scripting.FileSystemObject (FSO 文本文件读写)被关闭了, 开启FSO功能即可,在“运行”中执行regsvr32 scrrun.dll即可。

2)、安全模式设置成“中”,如果javascript脚本中报这个错误,还应将IE的安全设置“不允许运行未标记为安全的activeX控件”启用即可。注意如果您将相应的网站设成“受信任的站点”, 必须对“受信任的站点”进行相应的IE安全设置,此时如果对“InternetIE设置将是徒劳的。

3)、有些脚本需要微软的 MSXML 控件才能进入。当使用 IE 5 以上版本的缺省安全模式时,会提示是否接受 MSXML 控件, 如果接受,MSXML 将自动安装到您的机器上(得等上几分钟) 如果自动安装不成功,可以自行下载和安装 MSXML 3.0 SP7。有时是由于msxml 3服务被关掉了,使用regsvr32 msxml3.dll即可。

但是这样的体验无疑是用户无法忍受的,除非你的系统是后台内部少数人使用的场景,即便客户端的设置不弹出错误提示”automation服务器不能创建对象,但第五点的实现会看到打开页面时,自动弹出页面设置窗口并自动关闭的过程,我想这样的体验也是用户所厌恶的。

 

七、令人不爽的折衷方案

 

         讲了这么多,可能还没讲清楚我到底想要个什么样的打印需求,再次描述:我们想要一个简单的页面打印,比如某个网页上有个打印按钮,然后点击打印,能自动设置好纸张大小、纵向/横向及其他页面设置元素,并直接打印出页面上某个对象(其他不打印的对象可以通过cssjs控制不被打印出来)。

     令人遗憾的是,通过以上的阐述,通过JavascriptWScript.Shell直接实现的方式,用户体验太差。放弃!

折衷方案一、降低需求标准,通过javascript调用Webbrowser弹出打印设置,让用户自行设置纵向/横向及其他设置后再打印。体验较差,我们在项目过程中,由于时间的原因,做为临时解决方案。

折衷方案二、采用ActiveX,一般第三方的打印控件比较大,而我们的第34种需求方案实际上非常简单,用不到一般商用的庞大复杂的报表功能,因此可以做个简单但够用的体积又很小的ActiveX控件是最好的解决方案。ActiveX控件,免不了客户端第一次打开时下载和信任确认问题,这是ActiveX都无法避免的问题,但这种方案完全满足了用户的需求,但ActiveX开发需要的时间多,正式签名等过程复杂。我们将在下个sprint中考虑采用ActiveX

 

八、发文目的

 

         因为花了我2天多时间,本想通过javascript来实现本文中简单的自动打印设置并打印(即本文所提到的第34种需求),结果引出了这一系列技术问题及用户体验问题,如果大家有更好的解决方案,请予以分享。如果有碰到我同样需求又需要做出技术选型的朋友,希望本文能让你有所参考少走弯路。

 

--董柏 于2011.11.15中午

 

1
1
分享到:
评论

相关推荐

    论文研究 - 折衷效应的研究回顾与展望

    作为上下文效应的模型,折衷效应指出,当将极端选项添加到选择集中时,原始选项将成为折衷选项并更具吸引力。 在对折衷效果相关文献进行系统综述的基础上,本文对折衷效果进行了总结和展望。 首先,本文介绍了折衷...

    一种基于分布式空时码的协作MIMO分集复用折衷新方案.pdf

    在通信工程领域,MIMO(多输入多输出)技术是一种广泛采用的技术,它通过在发射端和接收端分别使用多个天线来提高无线通信...这一研究有助于为下一代无线网络提供有效的通信技术方案,尤其是在多跳和分布式网络环境下。

    PHPWeb开发技术指南——pdf格式

    4.1.6 实际应用中的折衷方案 99 4.1.7 PHP的内嵌“会话”库 100 4.2 安全性考虑 106 4.2.1 不要信任Web 107 4.2.2 不要重新发明加密法 111 4.2.3 开发组需要资深人员 118 4.2.4 认证 118 4.3 为什么适用性很重要 120...

    android投屏到web

    在IT行业中,Android投屏到Web是一项常见的技术需求,它使得用户可以将手机屏幕内容实时地展示在网页上,广泛应用于远程协作、在线教学、游戏直播等领域。本篇将详细介绍如何实现这一功能。 首先,从标题和描述我们...

    基于折衷规划的汽车悬架摆臂多目标拓扑优化设计.pdf

    汽车悬架摆臂是汽车悬挂系统的重要组成部分,其主要功能是传递车辆在行驶过程中的力和力矩,同时保证车轮与车身之间的相对运动,从而影响汽车的操控稳定性和乘坐舒适性。在设计悬架摆臂时,通常需要考虑多个目标,...

    Native App与Web App移动应用发展.pdf

    Hybrid App(混合应用)作为一种折衷方案,结合了Native App和Web App的优点,既利用了Web技术的跨平台性,又可以调用部分设备API,提升性能。同时,Progressive Web App(渐进式Web应用)的概念提出,使得Web App...

    关于强大的web gis的资源文档

    Web GIS(Web Geographic Information System),即网络地理信息系统,是地理信息系统技术与互联网技术相结合的产物。GIS作为一种强大的数据管理工具,自20世纪60年代在加拿大和美国兴起后,随着计算机技术的迅猛...

    MIMO中分集复用的折衷技术

    此文章是关于MIMO分集复用折衷技术的介绍和研究,是一种新的技术。

    iFIX WEBSPACE单点登录

    iFIX WEBSPACE单点登录是一种简化用户登录过程的技术,它允许用户仅输入一次登录信息,即可访问iFIX WEBSPACE。这对于提升用户体验和操作效率非常有帮助。通常情况下,若没有单点登录机制,用户在访问WEBSPACE时可能...

    应用折衷型模糊决策模型优选项目管理模式

    此外,文章还详细描述了折衷型模糊决策模型的数学方法和步骤,包括建立备选方案集合、确定评判方案的属性集(或称指标集)、确定评价指标的权重以及属性指标的量化与转换。其中,属性指标的量化主要解决定性指标的...

    web 服务 论文,服务组合

    3. **在过程代数中设计并自动获得相应的BPEL4WS代码**:这种方案为那些希望利用形式化方法的优势而又不想完全脱离实际编程环境的开发者提供了一个折衷方案。 #### 过程代数的应用范围 除了传统的基于时间逻辑的...

    小程序音视频解决方案升级详情.docx

    而Electron SDK则作为折衷方案,结合Web开发的便捷性和Native SDK的强大功能。 **接入指南**: 接入微信小程序的音视频功能非常简单,只需参考官方文档,通过组件和提供的接口就能快速实现功能。对于桌面端,根据...

    Xilinx选型手册

    Avnet还利用其设计服务专家团队Avnet Design Services(ADS),为广泛的客户群体提供全面的设计服务,包括参考设计、设计折衷/可行性分析、测试/验证、物料清单优化、技术咨询、技术教育、元器件选择、全套交钥匙...

    数据库设计的折衷方法

    数据库设计是信息系统构建的核心环节,它涉及到数据的组织、存储和检索,对于系统的性能、可扩展性和数据一致性至关重要。...每个设计决策都需要根据项目的具体情况进行权衡,以实现最佳的数据库设计方案。

    拓展的折衷范式与中国企业实施跨国并购.pdf

    【拓展的折衷范式】是由英国经济学家邓宁教授提出的,是国际生产折衷理论(OLI范式)的延伸与发展。这一理论最初提出时,包括三个关键因素:企业拥有特定优势(O,Ownership),区位特定优势(L,Location),内部化...

    基于折衷型变权向量的直觉语言决策方法

    首先, 定义折衷型变权向量, 提出与之对应的状态变权向量; 其次, 研究利用马氏效用函数诱导出折衷型变权向量; 再次, 定义直觉语言变量运算法则和大小比较方法, 提出直觉语言信息变权加权平均算子和直觉语言信息变权...

Global site tag (gtag.js) - Google Analytics