基于PHP与XML的PDF文档生成技术
摘要
本论文简要介绍了PHP、XML、PDF等技术的原理以及它们的应用情况。力图运用PHP面向对象的特性,构建出一套基于PHP和XML的在线PDF文档生成系统。文中详细探讨了整个系统的组成部分以及各自的实现过程。并在最后给出一个运用这套系统实现的动态创建报表的实例。
以下为引用的内容:
Abstract
This article introduced the fundamentls of PHP,XML and PDF and their application situation at present,expecting to build a PHP&XML-based dynamic PDF documents creating system through the PHP’s OO features. Furthermore,we discussed in detail on the components of the whole system and their respective realizing methods. Finally,we represented an example of creating reports dynamically using this system.
关键词
PHP XML XSLT DTD PDF
1. 引言
在信息技术飞速发展的时代,无论政府、企业还是个人,他们对如何通过信息技术提高自身工作效率,节省开支具有浓厚的兴趣。他们急切要找到一种优秀的技术,可以把传统上以纸张为媒介的文件、报表、票单据、手册、申请书等等等等转化为一种可以非常方便的在互联网以及内部网络自动生成、传播、下载、浏览、打印的电子文档。而如今最为热门的“无纸化办公”、“电子商务”等等都将以此为基础。
这种文档格式就Adobe公司的PDF(可移植文档格式),它已是全世界电子版文档分发的公开实用标准 。 任何浏览器只要安装Acrobat reader 5.0 的插件,便可以自由浏览、下载、打印PDF文档。PDF无疑具有其它电子文档格式不可比拟的优越性。
我们知道B/S系统作为当前以及将来最流行的一种软件架构,可以很好的实现各种基于浏览器的Web应用程序,而PHP作为一种优秀的Web编程语言,特别适合开发用于处理用户表单输入,查询数据库等针对浏览器用户的前端应用程序。由于PHP是开放源码的,这使得它的使用比其它同类的Web脚本语言更为广泛,它的功能也在不断的扩充和完善之中。现在最新的PHP版本已经可以很好的支持PDF,XML等。通过系统提供的API,我们能非常快捷的生成PDF文档,而最具魅力的是,我们可以通过PHP,查询数据库或XML数据文件并将结果插入所生成的PDF文档之中,形成各种具有绝佳的浏览和打印效果的报表、单据、手册等。
不难看出,结合PHP、XML、PDF三项技术,构造出一种可以在线动态生成PDF文档的系统是极具现实意义的,其主要表现在:
?文档可以在网络上生成,并通过网络分发。节省大量的人力物力。具有精确美观的打印效果,真正实现了无纸化办公。
?电子商务交易过程中的各种票据、 凭证都可以通过PHP脚本程序在线生成,并转为PDF格式发送给客户。
?企业MIS系统中各种面向打印的报表的生成,并可直接通过浏览器获得,无须安装任客户端,使用极为方便。
?以前文件流转是"先打印,后分发",每年花在印刷上的费用是政府、企业沉重的负担。而PDF文档"先散发,后打印",接件人可以在浏览后,再按需要打印。印刷的费用大大减少。而且,很有利于环保事业。
2. 课题简介
在某些软件项目的开发过程中,我们遇到一个很关键的问题就是大量面向打印的报表、单据的生成。我们知道,HTML适合浏览,但不适合格式规范的打印。因此必需找到一种可以由PHP动态生成,且具有良好的打印效果的文档格式。而这正是我研究这个课题的最直接的需求。 明白了这一点,我们就很自然的想到了PDF以及PHP的PDF支持库PDFLib。通过PDFLib提供的一套API,我们可以很容易在PHP脚本动态创建PDF文档。但是这只是一套非常基本的函数,只能进行一些简单的输出,如线条、文本、矩形框等,而且每输出一个对象之前,都要为其指定坐标。如果直接使用来这套函数来做一些实际的应用,比如复杂的报表的生成,其困难程度是难以想象的。我们不可能为创建这样一个报表,而事先算好各个元素的坐标,并把单元格用矩形框一个一个的画出来。
所以,我们第一步要做的就是利用PHP面向对象的编程方法将这套基本的API进行封装,以产生多个实用的具有独立功能的对象模块(如page对象、table对象、text对象等)。应该说,这一块是此项目最基本,也是最重要的部分。我参考并部分采用
了国外一些类似的开放源码的程序,在此基础上开发出了一套功能较为强大的类库。大大简化了PDF文档的生成,特别是其中的table对象,可以象HTML中的TABLE标记一样任意嵌套,轻松快捷的实现各种复杂的表格的绘制(这对动态生成报表是非常有用的)。
生成PDF的问题解决以后,我们面临了新的问题,举个例子来说,数据库查询页面如何将包含大量信息的结果集以及其它信息传给PDF生成页面? 最初我们想到的方法是通过文本文件传递,即在数据库查询页面将数据写到一个文本文件当中,并对其
中不同类别的数据定义一套区分的标记,PDF生成页面读取此文件,将内容插入到PDF中。 但是这样做,并不可靠。因为在这个文本文件中,我们采用特定的字符(或空格)来分离数据,如果恰好有用数据中也包含同样的字符或空格呢?可见,以这种方式传递数据是有隐患的。其实上面我们提到在文本文件中用不同的标记区分不同类别的数据。而这正是XML技术的思想。何不一步到为采用XML来作为数据传递的手段呢? 况且PHP对XML和XSLT具有很好的支持,通过expat解析器,我们可以任意提取XML文档中的数据,也可以通过PHP的XSLT引擎Sablotron对XML文档进行任意转换。
首先由“XML生成器”将数据(来自数据库或用户输入等)放到一个符合事先定义好的DTD的XML文档中,此文档对其中的数据内容进行描述,不包含任何格式信息。 然后由“XML转换器”将这个XML文档转换成包含显示样式信息的另一个XML文档。 最后由“PDF生成器”读取这个文档,根据其中的内容和显示样式生成相应的PDF文档。在这一个过程中,我要做的是再次运用 PHP的面向对象特性,构建出可重用的类:XMLWriter(生成XML文件)、XMLParser(解析XML文件)以及XMLTransformer(对XSLT函数的封装)。
系统构建成功后,就是具体的应用了。主要是进销存系统中各种报表、单据的动态生成。
3. 可行性分析