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