本文详细介绍使用 php 动态构建 pdf 文件的整个过程。使用免费 pdf 库 (fpdf) 或 pdflib-lite 等开源工具进行实验,并使用 php 代码控制 pdf 内容格式。
有时您需要准确控制要打印的页面的呈现方式。在这种情况下,html 就不再是最佳选择了。pdf 文件使您能够完全控制页面的呈现方式,以及文本、图形和图像在页面上的呈现方式。遗憾的是,用来构建 pdf 文件的 api 不属于 php 工具包的标准部件。现在您需要提供一点帮助。
当您在网络上搜索,寻找对 php 的 pdf 支持时,您首先发现的可能是商业 pdflib 库及其开源版本 pdflib-lite。 这些都是很好的库,,但是商业版本相当昂贵。pdflib 库的精简版本库仅作为原始版本分发,当您尝试在托管环境下安装精简版本时,就会出现这个限制问题。
另一种选择是免费 pdf 库 (fpdf),它是本机 php,无需要进行任何编译,是完全免费的,因此,您不会像在未许可版本的 pdflib 中那样看到水印。这个免费的 pdf 库正是我在本文中会用到的库。
我们将使用女子旱滑比赛的得分来演示动态构建 pdf 文件的过程。这些得分是从 web 中获得并被转换成 xml。清单 1 显示了一个示例 xml 数据文件。
清单 1. xml 数据
... ... ...
xml 的根元素是一个 events 标记。按事件对数据进行分组,每个事件都包含多个比赛。在 events 标记内,是一系列的 event 标记,在这些标记中有多个 game 标记。 这些 game 标记中包含参加比赛的两个队的名称以及他们在比赛中的得分。
清单 2 展示了用来读取 xml 的 php 代码。
load('events.xml'); $events = array(); foreach($xml->getelementsbytagname('event') as $event) {$games = array(); foreach($event->getelementsbytagname('game') as $game) {$games []= array( 'team1' => $game->getattribute('team1'),'score1' => $game->getattribute('score1'),'team2' => $game->getattribute('team2'),'score2' => $game->getattribute('score2') ); } $events []= array( 'name' => $event->getattribute('name'),'games' => $games ); } return $events;}?>
这段脚本实现了一个 getresults 函数,以便将 xml 文件读入 dom 文档。然后使用 dom 调用遍历所有 event 和 game 标记,以构建一个事件阵列。该数列内的每个元素都是一个散列表,包含事件名称和比赛项目的阵列。结构基本上是 xml 结构的内存版。
为了测试这个脚本的作用,将构建一个 html 导出页面,使用 getresults 函数读取文件,然后以一系列 html 表的形式输出数据。清单 3 显示了该测试所用的 php 代码。
清单 3. 结果 html 页面
通过代码 getresults.php,xml 数据文件被上传到 web 服务器,您可以查看 html 结果,这与 图 1 类似。
图 1. html 格式的竞赛结果
在该结果中,对获胜队使用了粗体,以便查看哪支队赢得了哪场比赛。
构建 pdf
获得数据之后,应将重点放在构建 pdf 文件上。第一步是下载 fpdf 库,然后将其安装在与现有应用文件集相同的目录中。实际上,只要是在 php 库路径中,您可以将它安装在任何您喜欢的地方。追踪您放置字体目录的地方,因为您需要设置 ‘fpdf_fontpath',如 清单 4 所示。
清单 4. pdf hello world
setfont('arial','',72);$pdf->addpage();$pdf->cell(40,10,hello world!,15);$pdf->output();?>
这段脚本实际上是一个 “hello world”,但采用的是 pdf 格式而不是 html。这段脚本执行的第一个操作是使用 define 语句设置 fpdf 字体目录的位置。然后使用 require 语句引入 fpdf 库。这段脚本从该库创建了一个 fpdf 对象,设置字体,添加一个页面,然后使用 cell 方法将一些文本放在该页面上,并输出 pdf。
图 2 展示了一切都正常情况下的结果。
图 2. pdf 格式的 hello world
如果没有看到 pdf,那么您可能想在命令行运行这段脚本,查看是否丢失了 fpdf.php 文件或者存在其他问题。
既然 pdf 呈现正常,那么现在应该将其与旱滑结果文件合并,并查看可以动态生成哪些内容。清单 5 展示了该合并操作的第一个版本。
清单 5. 显示结果的首版 pdf
cell(40,10,$event['name'],15); $this->ln();}}$pdf = new pdf();$pdf->setfont('arial','',48);foreach( getresults() as $event ) { $pdf->addpage(); $pdf->eventtable($event); }$pdf->output();?>
