436 1234
发新话题
打印

Zend 框架学习之创建 PDF 文件篇

Zend 框架学习之创建 PDF 文件篇

在 “理解 Zend 框架” 系列前面的部分中,我们使用开放源码的 PHP Zend 框架创建了基本的应用程序,即 Chomp 在线提要阅读器。在本教程中,我们将使用 Zend 框架的 PDF 功能生成一个基于用户已保存条目的 PDF 文档
开始之前

本教程的写作目的是:使开发人员学到更多使用 PHP Zend 框架生成 PDF 文件的知识。本文将探讨总体框架并提供生成新文档和编辑文档的例子。此功能将集成到现有的 Chomp 提要阅读器(本系列之前创建的)中。

关于本系列

“理解 Zend 框架” 系列按顺序记录了构建在线提要阅读器 Chomp 的过程,同时对使用近期引入的开放源码的 PHP Zend 框架的主要方面进行了解释。

在 第 1 部分 中,我们探讨了 Zend 框架的全部概念,包括一系列相关类和对 MVC 模式的总体探讨。在 第 2 部分 中,我们详述了这部分内容,以展示如何在 Zend 框架应用程序中实现 MVC 模式。我们还创建了用户注册和登录过程,将用户信息添加到数据库中并重新获取这些信息。

第 3 和第 4 部分探讨了实际的 RSS 和 Atom 提要。在 第 3 部分 中,我们使用户能够订阅独立的提要,并显示列在这些提要中的条目。此外还讨论了 Zend 框架的一些表单处理功能,比如验证数据和清除提要条目。而在 第 4 部分 中,则解释了如何创建代理,以便从不含提要的站点中提取数据。

本系列余下的部分将介绍如何使 Chomp 应用程序增值。第 5 部分(本文)将查看如何使用 PDF 格式作为已保存条目的备份类型。第 6 部分将使用 Zend_Mail 模块提醒用户有新文章发布。第 7 部分将探讨如何搜索保存的内容并返回排列好的结果。在第 8 部分中,我们将创建自己的混合模式,以添加 Amazon、Flickr 和 Yahoo! 中的信息。而在第 9 部分中,我们将使用 JavaScript 对象表示法为网站添加 Ajax 交互方式。

TOP

关于本教程

在 “理解 Zend 框架” 系列前面的部分中,我们创建了一个基本的 Chomp 在线提要阅读器。现在我们要用 Zend 框架的功能来轻松创建一个动态的 PDF 文档,随后我们将该文档提供给用户。通过对本教程的学习,您将学到如下内容:

用 Zend 框架创建一个 PDF 文档。
在 PDF 文档中使用定位。
为 PDF 文档添加文本。
为 PDF 文档添加图像。
为 PDF 文档添加图形。
管理 PDF 文档中的大段文本。
将动态 PDF 文档发送到浏览器。
为现有 PDF 文档添加信息。
在本教程中,我们将使用 第 4 部分 中已有的代码,使用户能够将现有的已保存条目保存到单个 PDF 文档中,从而能够脱机阅读或打印这些文档。

TOP

先决条件

本教程假设您对 PHP 编程环境非常熟悉,并且至少对模型-视图-控制器(MVC)模式如何运作有基本的了解,您无需了解 PDF 文档的外观如何;Zend_PDF 组件的所有要点在于使您不必深入到数据中。

TOP

概述

整个项目

整个项目的目标是创建一个完美的在线提要阅读器。我们的应用程序 Chomp 将最终成为一个 “一站式” 商店,为那些需要紧跟不断更新的信息的用户提供服务。现在用户可以在 Chomp 中创建一个帐户、登录和订阅一份预订好的提要。用户还能够查看这些提要的摘要,并将单个的条目保存到数据库中。另外,用户可以通过使用 Chomp 的功能检索全部网页,使用提要中没有包含的数据。相对于只是检索 RSS 提要中的一两个语句,此功能使用户能够检索整个发布的条目。

这仅仅是起点。最终,用户将能够搜索已保存的条目,同时,我们会作出改进,为界面增添更多的交互方式。还会添加用来添加更多提要的功能,而不仅仅添加那些已经键入数据库中的提要。

在这里,我们将介绍如何使用户能够将八个条目聚合成一个单一的、可移动的 PDF 文件。

TOP

Zend 框架

Zend 框架

Zend 框架是一组开放源码的 PHP 组件,用于提供一整套易用功能和安全使用开放源码的方式,而不必担心有关的知识产权问题。(所有贡献者都要保证代码原封不动,直到将代码贡献给项目,这些代码才能成为他们自己的。)

Zend 框架包含了一些组件,它们能够处理使用 PHP 最常处理的任务,如 Zend_DB、Zend_Filter、Zend_Mail、几个网络服务相关组件和 Zend_PDF。还包括 Zend_Controller 和 Zend_View 组件,这是 Zend 框架实现中的模型-视图-控制器(MVC)模式的一部分。

TOP

模型-视图-控制器模式

设计 MVC 模式是为了将应用程序的功能分解为三个层面,从而很容易地将工作量分配给具有不同技能的成员。

模型 层包含了应用程序中实体的实际架构。例如,一个提要拥有一个标题、URL 等等。模型层通常包含数据库,这提供了概念架构的物理实现。

视图 层决定了模型描绘的实体外观。在 Zend 框架中,这一层被实现为 HTML 文件,其中仅加入了少量的 PHP 代码。这使得在技术上也许并不精于此道的设计人员和其他人员也可以处理应用程序的这一部分。

控制器 层是进行大量编程的地方。每一个实体都拥有自己的控制器,这些控制器拥有具不同用途的行为。例如,提要控制器拥有许多用来查看提要、订阅提要的行为。

TOP

我们要实现的内容

在本教程中,我们将为用户提供一种为其喜爱的提要条目创建 PDF 文档的方式。随后用户能够下载这个 PDF 文件作为备份,或者将此作为打印多份条目供日后阅读的一种更加便利的方式。

我们将从如何使用 Zend 框架的 Zend_PDF 组件创建基本的 PDF 文档开始讲起,使您能够透过创建文档、添加文本和图像以及更多内容了解其总体概念。然后,我们将介绍如何将此功能与应用程序集成在一起。

为此,我们首先要在 savedentries 表中保存描述,之前这个表中只保存了全文(网页)条目。这样,就可以将它们添加到 PDF 文档中了。

下面来看一下如何从提要控制器创建新的 PDF 文档,并为其添加真实的实时数据。同样,我们还可以解决一些由于缺少某些我们认为理所当然的特征而引起的问题,比如在一行末尾的文字换行问题。

TOP

创建基本的 PDF

首先,我们要在主要应用程序外创建一个基本的 PDF 文件,这样就可以继续后面的操作了。

PDF 是什么?

从某种意义上讲,如果在互联网上消磨一段时间,您准会浏览到一个 PDF 文档。由 Adobe Systems 创建的可移动文档格式(PDF)的设计目的就是:可移动。您可以在装有 Adobe Acrobat 阅读器(或合理的复制品)的任何系统中阅读 PDF 文件,最主要的是,无论在哪里查看这类文件,文件的外观都是一样的。

有趣的是,这些并不是您通常编辑的文件,它们实际上是基于文本的、嵌入式二进制数据。例如,请看清单 1 中的片断,这是我们将在本教程中生成的真实 PDF 的一部分。


清单 1. 真实 PDF 的一瞥
复制内容到剪贴板
代码:
%PDF-1.4
...
1 0 obj
<<;/Type /Catalog /Version /1.4 /Pages 2 0 R >>
endobj
2 0 obj
<</Type /Pages /Kids [3 0 R ] /Count 1 >>
endobj
3 0 obj
<</Type /Page /LastModified (D:20060526190953-04'00')
/Resources <</ProcSet [/PDF /Text ] /XObject <</X1 5 0 R >>
/Font <</F1 6 0 R >> >>
/MediaBox [0 0 612 792 ] /Contents [4 0 R ] /Parent 2 0 R >>
endobj
4 0 obj
<</Length 134 >>
stream
q
1 0 0 1 36 684 cm
72 0 0 72 0 0 cm
/X1 Do
Q
/F1 32 Tf
0.2 g
0.9 0 0 RG
3 w
BT
138 708 Td
(Chomp! To go) Tj
ET
18 774 576 -756 re
S

endstream
endobj
5 0 obj
...
您可以看到,该文件详细列明了几个对象及其属性。幸运地是,我们不需要探究每一个对象的细节,因为 Zend 框架的 Zend_PDF 组件已经帮您打理好了。让我们来看一下 Zend_PDF 是如何工作的。

TOP

创建文档

首先要创建一个名为 createPDF.php 的文档。您会觉得在 <ZEND_HOME>/library 目录下创建这个文件是件再容易不过的事情,但只要能找到 Zend 类文件,实际的位置怎样已经不那么重要了。如下所示添加代码。


清单 2. 创建文档
复制内容到剪贴板
代码:
<?php

require_once 'Zend/Pdf.php';

$pdf = new Zend_Pdf();

$pdf->save("chomp.pdf");

?>
这里包含了 Zend_PDF 类文件,并使用它们创建了一个新的 PDF 对象。有了这个对象,就可以轻易地将文档保存到任何文件中。

您可以通过在命令行中键入 php createPDF.php 来执行这个文件。您能够在目录中看到一个名为 chomp.pdf 的新文件,但如果您试着打开它,就会出现错误,这是由于该文件尚无内容。下面我们就来介绍这个操作。

TOP

添加页面

PDF 文档的每一页都是一个对象。您可以使用以点(一英尺的 1/72)为单位的 x 和 y 值来创建任何尺寸的页面,或者可以使用预定好的四种尺寸之一,如下所示。


清单 3. 添加页面
复制内容到剪贴板
代码:
<?php
require_once 'Zend/Pdf.php';

$pdf = new Zend_Pdf();
$page = new Zend_Pdf_Page(Zend_Pdf_Const::PAGESIZE_LETTER);
$pageHeight = $page->getHeight();
$pageWidth = $page->getWidth();

echo 'Height = '.$pageHeight.'\n';
echo 'Width = '.$pageWidth.'\n';

$pdf->pages[0] = ($page);

$pdf->save("chomp.pdf");

?>
首先要创建一个标准信函尺寸的新页面。您也可以选择 Zend_Pdf_Const::PAGESIZE_LETTER_LANDSCAPE、Zend_Pdf_Const::PAGESIZE_A4 和 Zend_Pdf_Const::PAGESIZE_A4_LANDSCAPE。请注意,在单个文档中,可以有不同尺寸的页面。

创建页面后,就可以获取其高度和宽度,但该页面实际上仍不属于文档。(作为替换:$pdf->newPage() 方法创建的页面则属于文档,据说其功能要稍胜一筹,但它创建的页面不能在文档间共享。)为了将它与文档关联,我们将它添加为页面属性,这样就可以像操纵其他任何数组一样操纵这个页面对象的数组了。

TOP

 436 1234
发新话题