| | | 随着Internet技术的飞速发展,越来越多的企业应用是基于Internet/Intranet。这样用户就可以通过浏览器(Browser)来完成各种数据的输入、查询功能。但由于目前浏览器的局限性,影响了它的一些应用。如HTML页面交互性不强、缺乏所见即所得的打印功能等。这些问题多是通过在网页中嵌入Java Applet、ActiveX等控件或是使用Plug-in来解决。本文介绍一种解决所见即所得的打印方案
一、浏览器的打印问题
浏览器无法实现所见即所得的打印功能,主要原因是由于HTML缺乏精确定位和绘图功能。标准HTML只能设置文本和图片等元素的基本显示属性。这样在打印时,不同的浏览器,不同的打印页面设置,都会导致打印结果不同。
二、主要解决方案
解决Internet/Intranet的所见即所得的功能方法很多,但不外乎三种方式:一种是在网页中使用所见即所得的打印控件,如使用Java Applet、ActiveX等;一种是编写自己的客户端所见即所得的打印程序或Plug-in,打印时浏览器从Web服务器上取得打印数据,再调用打印程序或Plug-in进行打印;第三种方式是利用第三方支持所见即所得打印功能的程序或Plug-in,打印时浏览器下载打印数据,再调用第三方程序或Plug-in进行打印。下面详细介绍着三种方案。
客户端使用自己编写的打印程序或Plug-in
工作方式:客户端要打印时,浏览器先从Web服务器上下载要打印的数据包,再调用自己编写的程序或Plug-in打印。可以做到一边下载,一边打印。
优点:打印数据包可以很小,适合各种带宽通讯。自己可以定义数据包格式,做到数据量最少。
缺点:客户端需要安装一次,开发设计工作量大,升级麻烦,增加了维护负担。不仅服务器端要编写生成打印数据的模块,客户端也要编写打印程序或Plug-in。升级时要为不仅服务器要升级,客户端的打印程序也要升级。
客户端使用第三方打印程序或Plug-in
工作方式:基本与第二种方式相同,所不同的是客户端用的是第三方程序或Plug-in。
优点:设计工作量少,升级方便,维护简单。由于使用的是第三方软件,设计工作主要集中在服务器方,升级时也只用升级服务器。
缺点:客户端需要安装一次,要求第三方软件开发商能提供程序的数据接口,程序的使用需要授权。
如果能找到一种操作简单,客户常用,支持所见即所得打印功能,且数据接口是开放的客户端软件是解决这个问题的最好方式。
PDF电子文档的免费阅读器-Adobe Acrobat(R) Reader-正是我们要找的客户端软件。大多数网民可能都安装有免费的Acrobat(R) Reader,用它可以查看PDF文件。它提供了所见即所得的打印功能,并且PDF文档格式是开放的。只要在客户端安装免费的PDF阅读器-Acrobat(R) Reader,在Web服务器端适时的把要打印的数据生成PDF文件,这样就比较完美的解决了网上的打印问题。
三、PDF的特点
PDF(Portable Document Format)是一种通用开放文档格式,它是由Adobe公司开发,适合网上使用的电子文档格式。它事实上已成为电子文档的标准。任何人都可利用免费提供的 Adobe Acrobat(R) Reader 软件随意地共享、查看、导航和打印 PDF 文件。免费的Adobe Acrobat(R) Reader可以随意分发。
PDF有以下特点:
PDF文档格式开放; 可实现PDF文档跨平台:PDF的阅读器(Acrobat(R) Reader)已有各种操作系统版本(Windows、Mac、Linux和各种Unix版),用不同的阅读器查看和打印的字体、颜色和大小都完全一样; PDF文档内容可以压缩,可有效降低文档大小; PDF文档是结构化的、面向对象的; PDF文档还可嵌入图片、声音和视频图象,还提供书签、Web连接、跨文档连接等功能; PDF的阅读器和Plug-in可免费提供。 四、PDF文档介绍
下面简单介绍PDF文档的基本知识
PDF的对象( Object ) PDF文档是由一系列基本对象构成,它们是:
布尔对象( Boolean ):只有两个值:True和False
数值对象( Number ):可是整数和浮点数
字符串和文字对象( String and Text ):是一串无符号的8位字节、写为一串字符格式的对象
名字对象( Name ):由”/”打头,类似于字符串的对象
数组对象( Array ):由任何对象组成的一组对象
字典对象( Dictionary ):由对象对组成的表。对象对的第一个对象是健( key ),一定是名字对象;第二个为值( Value ),可是任何对象
流对象( Stream ):类似于字符串,由一串字符组成。流对象一定是间接对象,它一般用在数据量较大时
空对象( null ):null
另外还有间接对象和对象引用。通过这些对象可以写出任何内容的文档
文件结构 PDF文件结构可分成四部分,如图
文件头( Header ):标识PDF文件的版本号
文件体( Body ):PDF文件的内容。它是由一系列对象(Object)组成,描述文件内容。
交叉引用表( Cross-reference table ):文件体中各个对象偏移字节地址表,表的格式是固定的。PDF阅读器通过交叉引用表,可以快速得到任何对象的数据。
文件尾( Trailer ):标识文件结束,提供目录(Catalog)对象的引用,并提供交叉引用表的偏移字节地址。PDF阅读器从文件尾开始读取数据,得到交叉引用表的地址,通过交叉引用表得到任何对象。
PDF不用重写整个文件就能更改文件内容,方法是在PDF文件末尾添加更新部分即可。更新部分也是有文件体、交叉引用表和文件尾组成。
文档结构 PDF文档是由PDF文件的文件体中的对象链来表述的。基本结构见下图:
每个PDF文档由目录(Catalog)对象开始,目录对象中有文档的页面树(Pages Tree)、纲要树(Outlines Tree)等对象的间接引用。
页面树对象中包括了所有PDF页面(Page)对象的间接引用,也可以包含下一级页面树对象引用。
页面对象中可以包括可图形化内容、页面缩略图和批注等对象的引用
纲要树对象包括了各纲要条目对象的引用。
页面对象可以继承上一级的页面属性。
可图形化内容 可图形化内容是指PDF文当中所有可显示的内容:文字、图形、图像等。PDF提供了一套完整的指令来描述这些内容。
简单示例说明 这个例子只是简单的显示”Hello World”文字
%PDF-1.0 文件头PDF ver=1.0 1 0 obj 文件体,目录(Catalog)对象 << /Type /Catalog /Pages 3 0 R 页面树(Pages Tree)的引用 /Outlines 2 0 R 概要树(Outline Tree)的引用 >> endobj 2 0 obj 概要树(Outline Tree)对象 << /Type /Outlines /Count 0 这里没有概要条目 >> endobj 3 0 obj 页面树(Pages Tree)对象 << /Type /Pages /Count 1 /Kids [4 0 R] 页面对象引用数组,这里就一个页面对象 >> endobj 4 0 obj 页面(Page)对象 << /Type /Page /Parent 3 0 R /Resources << /Font << /F1 7 0 R >>/ProcSet 6 0 R 资源引用(这里是字体) >> /MediaBox [0 0 612 792] 页面大小 /Contents 5 0 R 页面可图形化内容的对象引用 >> endobj 5 0 obj 可图形化内容对象,数据内容通常被压缩 << /Length 44 >> stream BT /F1 24 Tf 100 100 Td (Hello World) Tj 显示Hello World ET endstream endobj 6 0 obj [/PDF /Text] endobj 7 0 obj 字体资源对象 << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /MacRomanEncoding >> endobj xref 交叉引用表(Cross-reference Table) 0 8 0000000000 65535 f 0000000009 00000 n 1 0 obj offset 0000000074 00000 n 2 0 obj offset 0000000120 00000 n 3 0 obj offset 0000000179 00000 n 0000000322 00000 n 0000000415 00000 n 0000000445 00000 n trailer 文件尾 << /Size 8 /Root 1 0 R 目录(Catalog)对象引用 >> startxref 553 交叉引用表的偏移 %%EOF 五、PDF文档实际应用
由于PDF文档是基于文本模式,具有面向对象和结构化等特点,所以其文档生成器的编程难度较小,生成器的速度较快。
现在我已经用Java编写了一个PDF文件生成器,现已实现的主要功能有:
支持常见14种西文字符集和三种True Type中文字符集的显示。支持True Type中文字符集有:楷体、宋体和黑体; 可绘制直线、圆弧(椭圆弧)和圆(椭圆),可设定线型、颜色 支持裁剪操作及定制填充 可嵌入JEPG格式的图片,如jpg图片文件 可精确设定页面尺寸和点的位置 在使用中能很好的解决网上所见即所得的打印功能。
查看实际生成的PDF文件
六、总结
PDF是一种通用开放文档。它的文档结构设计简单、先进,相关文档资料完备,网上相关资源丰富,具有免费的阅读器和Plug-in。在服务器端使用PDF文档生成器,可以有效的完成网上所见即所得的打印功能。其开发成本低,维护简单,升级方便快捷。 |
|