|
随着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文档生成器,可以有效的完成网上所见即所得的打印功能。其开发成本低,维护简单,升级方便快捷。 |