实现Internet/Intranet 所见即所得的打印功能

 

实现Internet/Intranet 所见即所得的打印功能


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

【问题提问、论坛交流】编辑:xker.com