PHP在网页中动态生成PDF文件详细教程(2)

这段脚本实际上是一个 “Hello World”,但采用的是 PDF 格式而不是 HTML。这段脚本执行的第一个操作是使用 define 语句设置 FPDF 字体目录的位置。然后使用 require 语句引入 FPDF 库。这段脚本从该库创建了一个 FPDF 对象,设置字体,添加一个页面,然后使用 Cell 方法将一些文本放在该页面上,并输出 PDF。

图 2 展示了一切都正常情况下的结果。

图 2. PDF 格式的 Hello World

PHP在网页中动态生成PDF文件详细教程

如果没有看到 PDF,那么您可能想在命令行运行这段脚本,查看是否丢失了 fpdf.php 文件或者存在其他问题。

既然 PDF 呈现正常,那么现在应该将其与旱滑结果文件合并,并查看可以动态生成哪些内容。清单 5 展示了该合并操作的第一个版本。

清单 5. 显示结果的首版 PDF

<?php define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/'); require( 'fpdf.php' ); require( 'getresults.php' ); class PDF extends FPDF { function EventTable($event) { $this->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(); ?>

我们没有从外部扩展 FPDF 类别,而是使用我们自己的 PDF 子类来扩展 FPDF 类别。在这些子类内,我们创建了一个名为 EventTable 的新方法,为给定事件构建了一个结果表。在这种情况下,我们从小处着手,只输出了事件名称。该名称位于脚本底部,包装在 foreach 循环中,该脚本为每个事件添加一个页面,然后调用 EventTable 方法。

可在 图 3 中看到这段脚本的输出。

图 3. 动态 PDF 的第一个版本

PHP在网页中动态生成PDF文件详细教程


向下滚动页面,以展示每个事件都在自己的页面上。此处的下一步操作是开始将结果添加到页面。

构建结果表

在构建 PDF 文件时,构建无表结构就像构建 HTML 一样简单。构建表的方法是构建许多宽度、字体、填充颜色、行颜色等各不相同的单元。

清单 6 展示了设置表的标题栏的添加代码。

清单 6. 添加结果表标题

<?php define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/'); require( 'fpdf.php' ); require( 'getresults.php' ); class PDF extends FPDF { function EventTable($event) { $this->SetFont('','B','24'); $this->Cell(40,10,$event['name'],15); $this->Ln(); $this->SetXY( 10, 45 ); $this->SetFont('','B','10'); $this->SetFillColor(128,128,128); $this->SetTextColor(255); $this->SetDrawColor(92,92,92); $this->SetLineWidth(.3); $this->Cell(70,7,"Team 1",1,0,'C',true); $this->Cell(20,7,"Score 1",1,0,'C',true); $this->Cell(70,7,"Team 2",1,0,'C',true); $this->Cell(20,7,"Score 2",1,0,'C',true); $this->Ln(); } } $pdf = new PDF(); $pdf->SetFont('Arial','',10); foreach( getResults() as $event ) { $pdf->AddPage(); $pdf->EventTable($event); } $pdf->Output(); ?>

此处的添加代码用于设置字体、颜色和行宽。然后它将呈现包含四个标题列的几个单元格。然后调用 Ln 方法(该方法与回车键等效)启用一个新行。

在浏览器中查看这段脚本时,可以看到类似 图 4 的内容。

图 4. 包含表的标题行的页面

PHP在网页中动态生成PDF文件详细教程

在 图 4 中,标题以白色文本呈现在灰色背景上。这种格式有助于将其与呈现在标题下面的数据进行区分。要呈现比赛结果,请在 清单 7 中添加以下代码。

清单 7. 添加完整的结果表

<?php define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/'); require( 'fpdf.php' ); require( 'getresults.php' ); class PDF extends FPDF { function EventTable($event) { $this->SetFont('','B','24'); $this->Cell(40,10,$event['name'],15); $this->Ln(); $this->SetFont('','B','10'); $this->SetFillColor(128,128,128); $this->SetTextColor(255); $this->SetDrawColor(92,92,92); $this->SetLineWidth(.3); $this->Cell(70,7,"Team 1",1,0,'C',true); $this->Cell(20,7,"Score 1",1,0,'C',true); $this->Cell(70,7,"Team 2",1,0,'C',true); $this->Cell(20,7,"Score 2",1,0,'C',true); $this->Ln(); $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); $fill = false; foreach($event['games'] as $game) { $this->SetFont('Times',((int)$game['score1']>(int)$game['score2'])?'BI':''); $this->Cell(70,6,$game['team1'],'LR',0,'L',$fill); $this->Cell(20,6,$game['score1'],'LR',0,'R',$fill); $this->SetFont('Times',((int)$game['score1']<(int)$game['score2'])?'BI':''); $this->Cell(70,6,$game['team2'],'LR',0,'L',$fill); $this->Cell(20,6,$game['score2'],'LR',0,'R',$fill); $this->Ln(); $fill =! $fill; } $this->Cell(180,0,'','T'); } } $pdf = new PDF(); $pdf->SetFont('Arial','',10); foreach( getResults() as $event ) { $pdf->AddPage(); $pdf->EventTable($event); } $pdf->Output(); ?>

除了标题行之外,在 EventTable 方法中还有一个 foreach 循环,它将在每个比赛上进行迭代。图 5 显示了用于此用途的代码。

图 5. 包含结果表的 PDF

PHP在网页中动态生成PDF文件详细教程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/6f89c491fe42a1b887a4aeac5fba2a67.html