本文详细介绍使用 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 name="Beast of the East 2011">
  <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 name="Dustbowl Invitational 2011">
   ...
 </event>
 <event name="The Great Yorkshire Showdown 2011">
   ...
 </event>
</events>

XML 的根元素是一个 events 标记。按事件对数据进行分组,每个事件都包含多个比赛。在 events 标记内,是一系列的 event 标记,在这些标记中有多个 game 标记。 这些 game 标记中包含参加比赛的两个队的名称以及他们在比赛中的得分。

清单 2 展示了用来读取 XML 的 PHP 代码。

<"htmlcode">

<"font-weight:<">
  <"font-weight:<">
  <"//img.jbzj.com/file_images/article/201407/201407051027351.jpg" alt="" />

在该结果中,对获胜队使用了粗体,以便查看哪支队赢得了哪场比赛。

构建 PDF

获得数据之后,应将重点放在构建 PDF 文件上。第一步是下载 FPDF 库,然后将其安装在与现有应用文件集相同的目录中。实际上,只要是在 PHP 库路径中,您可以将它安装在任何您喜欢的地方。追踪您放置字体目录的地方,因为您需要设置 ‘FPDF_FONTPATH',如 清单 4 所示。

清单 4. PDF Hello World

<"Hello World!",15);
$pdf->Output();
"//img.jbzj.com/file_images/article/201407/201407051027362.jpg" alt="" />

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

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

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

<"//img.jbzj.com/file_images/article/201407/201407051027373.jpg" alt="" />


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

构建结果表

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

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

清单 6. 添加结果表标题

<"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();
"//img.jbzj.com/file_images/article/201407/201407051027374.jpg" alt="" />

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

清单 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'])"//img.jbzj.com/file_images/article/201407/201407051027385.jpg" alt="" />

$fill 变量可通过切换来改变表中每行的颜色。优胜队的名称和得分用加粗、斜体字体表示,这样可以清晰显示它们。还需注意的是,字体从标题的 Arial 字体更改成了显示比赛内容所用的 Times 字体。

要完成示例代码,则需要添加一些图形。

使用图形进行修饰

向 PDF 添加图像非常容易。首先需要从 Web 抓取一个图像。我抓取了一个旱滑参赛队的徽标,并将其存储为 PNG 格式的图像。 此后,我一直使用 清单 8 中的新代码。

清单 8. 添加徽标图像

<"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'])"//img.jbzj.com/file_images/article/201407/201407051027386.jpg" alt="" />

该 PDF 库还提供了其他方法来呈现图形、添加流文本、添加超链接、管理页边距和方向等结构,您可以完全控制您的 PDF 文件。

结束语


使用合适的工具,通过 PHP 构建 PDF 文件是非常容易的。这种方法非常适用于打印发x票或票据,或填写表单,以及需要严格控制内容布局的任何项目。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?