32.3.3 生成RTF证书

我们可以通过将ASCII文本写入文件或字符串变量的办法来生成一个RTF文档,但这意味着我们要学习另一套语法。

如下所示的是一个非常简单的RTF文档示例:


{\rtf1

{\fonttbl{\f0 Arial;}{\f1 Times New Roman;}}

\f0\fs28 Heading\par

\f1\fs20 This is an rtf document.\par

}


该文档设置一个包含两种字体的字体表:Arial,对应于f0,Times New Roman,对应于fl。然后以28号字(14 point),f0(Arial)字体书写"Heading"。\par控制符表示一个段落分隔符。接着,用20号字(10 point)的f1(Times New Roman)字体书写"This is an rtf document"。

我们可以像这样手动生成一个RTF文档,但在PHP中,并没有任何简便的函数来简化这些困难的工作,比如,合并图形。幸运的是,在许多文档中,结构、类型和大部分文本都是静态的,仅有一小部分存在个体差异。使用模板是生成文档的一种更高效的方法。

我们可以使用字处理器方便地建立一个复杂的文档,如图32-4所示。

32.3.3 生成RTF证书 - 图1

图 32-4 使用字处理器,可以容易地创建一个复杂而又有用的模板

模板包括占位符,如<<NAME>>,用来标记该处将插入动态数据。这些占位符是什么样子并不重要。我们在两组尖括号之间使用一个有意义的字符串来描述它。选择一个不可能在文档其余部分显示的占位符是相当重要的。当占位符与替代它们的数据的长度大致相同时,它有助于排列模板格式。

这个文档中的占位符包括<<NAME>>、<<Name>>、<<score>>和<<mm/dd/yyyy>>。请注意,我们既使用了NAME又使用了Name,因为我们想用区分大小写的方法来替换它们。

现在我们已经有了模板,需要一个脚本来让它个性化。该脚本是rtf.php,代码如程序清单32-3所示。

程序清单32-3 rtf.php——产生一个个性化RTF证书的脚本


<?php

//create short variable names

$name=$_POST['name'];

$score=$_POST['score'];

//check we have the parameters we need

if(!$name||!$score){

echo"<h1>Error:</h1>

<p>This page was called incorrectly</p>";

}else{

//generate the headers to help a browser choose the correct application

header('Content-type:application/msword');

header('Content-Disposition:inline,filename=cert.rtf');

$date=date('F d,Y');

//open our template file

$filename='PHPCertification.rtf';

$fp=fopen($filename,'r');

//read our template into a variable

$output=fread($fp,filesize($filename));

fclose($fp);

//replace the place holders in the template with our data

$output=str_replace('<<NAME>>',strtoupper($name),$output);

$output=str_replace('<<Name>>',$name,$output);

$output=str_replace('<<score>>',$score,$output);

$output=str_replace('<<mm/dd/yyyy>>',$date,$output);

//send the generated document to the browser

echo$output;

}

?>


该脚本将执行一些基本的错误检查,从而确保已提交了用户的所有资料,然后转而进行生成证书的工作。

该脚本的输出是一个RTF文件而不是HTML文件,因此我们必须提醒用户浏览器知道这个事实。这个步骤很重要,这样浏览器才能以正确的应用程序打开这个文件,或者在不能辨认.rtf扩展名的情况下能给出一个Save As…类型的对话框。

使用PHP的header()函数,可以指定将要输出文件的MIME类型以发送相应的HTTP页头,如下代码所示:


header('Content-type:application/msword');

header('Content-Disposition:inline,filename=cert.rtf');


第一个页头通知浏览器正在发送一个Microsoft Word文件(其实并不完全正确,但是它是最有可能打开该RTF文件的应用程序)。

第二个页头通知浏览器自动显示文件内容,并告知推荐文件名为cert.rtf。如果用户想在浏览器中保存该文件,这个名字是用户看到的默认文件名称。

在发送页头之后,我们打开并将该模板RTF文件读入到$output变量中,通过str_replace()函数,用我们希望显示的实际数据替换占位符。该行代码如下所示:


$output=str_replace('<<Name>>',$name,$output);


用变量$name的内容替换任何出现占位符<<Name>>的地方。

替换完成之后,接下来就只需将输出回送到浏览器中。该脚本的示例输出结果如图32-5所示。

32.3.3 生成RTF证书 - 图2

图 32-5 rtf.php根据RTF模板生成一个证书

这个方法效果很好。即使在模板和$output变量的内容非常长的情况下,函数str_replace()的调用执行速度也很快。从这个应用程序的角度来看,主要的问题就是用户将在他自己的字处理器软件中载入证书并打印。这可能会导致用户能够修改证书。RTF不允许我们创建一个只读文档。