`
love19820823
  • 浏览: 933731 次
文章分类
社区版块
存档分类
最新评论

Webgis 打印实现原理

 
阅读更多
Webgis 打印实现原理
褫其华衮,示人本相系列之二
2006-9-18
cheungmine
一、问题的提出
Webgis提供了客户端免插件的地图浏览机制。任何位于WWW节点内的计算机都可以通过浏览器浏览地图。但是,打印地图成了Webgis遇到的一个问题。客户端如果使用IE的默认打印功能来输出地图,仅仅输出了当前显示的图象到打印机。无论从尺寸和分辨率上都不能满足高精度绘图的需要。如果客户要求输出一定比例尺(如:1/500)的大幅面地图(连续多幅),这就成了Webgis打印的技术壁垒。本文从实用的角度出发,阐述了Webgis打印的实现原理。
二、存在的几种解决方案
在解决这个问题的过程中,主要考虑了以下几种形式:
方案1:在客户端安装ActiveX插件,实现打印的功能。这是更换了问题的概念,并没有解决问题,我们的问题是如何在Webgis上实现打印?所以这种方案不可行。
方案2:服务端地图引擎生成某种格式的可打印的地图文件,此文件下载到客户端。当然最好是PDF格式。客户端必须安装PDF Reader,目前这个不是问题。
三、失败是成功之母
考虑方案2是最可行的。所以我采用了地图引擎打印到虚拟打印机的方法。我在服务端(当然,就是我自己的计算机)安装了Adobe Pdf WriterOffice2003 Document Imaging两个虚拟打印机,分别生成了.pdf文件和.mdi文件。但是,一旦程序做为Web服务运行,必须模拟本机用户登录,否则无法打印。我在程序中编码模拟了我自己机器的管理员(Administrator/密码)登录(使用APILogonUserImpersonateLoggedOnUser),结果很激动,打印的文件正确生成了。但是服务端不断生成错误事件,报告我一堆错误。很快事件日志就满了。
静静地想一想,即使没有那些错误发生,上面谈到的技术也不是一种好的解决办法,原因有:服务端必须安装Adobe Pdf WriterOffice2003 Document Imaging之一。这2个软件可都是要美圆的。另外Office2003 Document Imaging最大分辨率只为300dpi,而Adobe pdf4000dpi。我不禁佩服专业就是专业。
四、胜利在向我招手
我把目光转向开源领域的实现。那是GnuWin32的项目。很早我下了它的源代码,今天终于要派上用处了。我的原则是:必须最终能生成PDF文件,必须支持多页。我发现,CxImage就是这样一个能生成多页TIFF的免费开源实现。LIBTIFF里面有工具能支持TIFFPDF的转换,虽然是以tiff2pdf.exe提供的,但是有源代码.c文件。我用VS7很容易就可以重新编译成功。这样,我写了测试小程序,测试结果完全满意。一幅A0的地图,最终生成的PDF不大于1M。多页当然也没问题。
接下来就是集成到我的代码里来。我使用CxImage599cLIBTIFF3.8.2-1
五、小贴示
VC7里面有个CImage类,其功能当然无法与CxImage相比。而且我用CxImage生成的单页或多页TIFF都无法被Windows下的看图程序所读取。难道是CxImage生成了错误的tiff了么?而Adobe Pdf Writer可以成功打开这个TIFF,说明没错。是Windows做的不够好。
在很多方面,Windows做的都没有开源做的好。可惜我的代码里使用CImage的地方太多了,不然一定换成CxImage。下面的开源网址是我代码的源泉:
不知道我说明白没有?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics