本文详细介绍使用 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 数据
<events> <event> <game score1="88" team1="Toronto Gore-Gore Rollergirls" team2="Montreal La Racaille" score2="11"> <game score1="58" team1="Toronto Death Track Dolls" team2="Montreal Les Contrabanditas" score2="49"> ... </game></game></event> <event> ... </event> <event> ... </event> </events>
XML 的根元素是一个 events 标记。按事件对数据进行分组,每个事件都包含多个比赛。在 events 标记内,是一系列的 event 标记,在这些标记中有多个 game 标记。 这些 game 标记中包含参加比赛的两个队的名称以及他们在比赛中的得分。
清单 2 展示了用来读取 XML 的 PHP 代码。
<?php function getResults() { $xml = new DOMDocument(); $xml->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 页面
<?php include_once('getresults.php'); $results = getResults(); foreach( $results as $event ) { ?> <h1><?php echo( $event['name'] ) ?></h1> <?php foreach( $event['games'] as $game ) { $s1 = (int)$game['score1']; $s2 = (int)$game['score2']; ?> <?php } ?> <table><tbody><tr> <td> <?php echo( $game['team1'] ) ?></td> <td><?php echo( $s1 ) ?></td> <td> <?php echo( $game['team2'] ) ?></td> <td><?php echo( $s2 ) ?></td> </tr></tbody></table> <?php } ?>
通过代码 getresults.php,XML 数据文件被上传到 Web 服务器,您可以查看 HTML 结果,这与 图 1 类似。
图 1. HTML 格式的竞赛结果
在该结果中,对获胜队使用了粗体,以便查看哪支队赢得了哪场比赛。
构建 PDF
获得数据之后,应将重点放在构建 PDF 文件上。第一步是下载 FPDF 库,然后将其安装在与现有应用文件集相同的目录中。实际上,只要是在 PHP 库路径中,您可以将它安装在任何您喜欢的地方。追踪您放置字体目录的地方,因为您需要设置 ‘FPDF_FONTPATH',如 清单 4 所示。
清单 4. PDF Hello World
<?php define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/'); require( 'fpdf.php' ); $pdf = new FPDF(); $pdf->SetFont('Arial','',72); $pdf->AddPage(); $pdf->Cell(40,10,"Hello World!",15); $pdf->Output(); ?>