32.3.6 使用PDFlib的一个"Hello World"程序

在拥有并以启用PDFlib的方式安装了PHP之后,可以用一个简单的程序(例如Hello World)来测试它,如程序清单32-5所示。

程序清单32-5 testpdf.php——通过PHP使用PDFlib编写的Hello World典型示例


<?php

//create a pdf document in memory

$pdf=pdf_new();

pdf_open_file($pdf,"");

pdf_set_info($pdf,"Author","Luke Welling and Laura Thomson");

pdf_set_info($pdf,"Title","Hello World(PHP)");

pdf_set_info($pdf,"Creator","testpdf.php");

pdf_set_info($pdf,"Subject","Test PDF");

//US letter is 11"x 8.5"and there are 72 points per inch

pdf_begin_page($pdf,8.572,1172);

//add a bookmark

pdf_add_bookmark($pdf,'Page 1',0,0);

$font=pdf_findfont($pdf,'Times-Roman','host',0);

pdf_setfont($pdf,$font,24);

pdf_set_text_pos($pdf,50,700);

//write text

pdf_show($pdf,'Hello,world!');

pdf_continue_text($pdf,'(says PHP)');

//end the document

pdf_end_page($pdf);

pdf_close($pdf);

$data=pdf_get_buffer($pdf);

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

header('Content-Type:application/pdf');

header('Content-Disposition:inline;filename=testpdf.pdf');

header('Content-Length:'.strlen($data));

//output PDF

echo$data;

?>


如果该脚本执行失败,最有可能看到的出错信息如下所示:


Fatal error:Call to undefined function pdf_new()

in C:\Program Files\Apache Software

Group\Apache2.2\htdocs\phpmysql4e\chapter32\testpdf.php on line 4


这表明我们没有将PDFlib扩展库的支持编译到PHP中。

安装过程相当直观,但一些细节的修改将根据所使用的PHP和PDFlib的不同而有所不同。一个寻求具体细节意见的好地方就是注释过的PHP手册中PDFlib页上用户添加的注释。

当准备好了该脚本并在系统中运行后,可以开始了解它如何工作了。如下所示的代码:


$pdf=pdf_new();

pdf_open_file($pdf,"");


将在内存中初始化一个PDF文档。

pdf_set_info()函数允许使用一个“主题;标题;创建者;作者”这些关键字列表以及对应的用户自定义域来标记一个文档。

在这里,我们设置了创建者、作者和标题以及主题。注意这6个信息字段都是可选的:


pdf_set_info($pdf,"Author","Luke Welling and Laura Thomson");

pdf_set_info($pdf,"Title","Hello World(PHP)");

pdf_set_info($pdf,"Creator","testpdf.php");

pdf_set_info($pdf,"Subject","Test PDF");


一个PDF文档由很多页组成。要开始一个新页面,必须调用pdf_begin_page()函数。pdf_begin_page()函数的参数除了要求有pdf_open()函数返回的标识符外,还要求有页面大小的参数。文档中的每一页都可以有不同的大小,但是应该尽量使用相同的页面大小,除非有充足的理由使用不同大小的页面。

PDFlib是以点(point)为度量单位的,无论是对于页面大小还是在页面中定位坐标位置都是这样的。作为参考,A4纸的大小大概是595×842点,美国信函纸大小为612×792。如下代码行:


pdf_begin_page($pdf,8.572,1172);


表示在文档中创建了一个美国信函大小的页面。

一个PDF文档不只限于具有打印功能的文档。在文档中,还可以包含许多PDF特征,比如超链接和书签等。pdf_add_outline()函数可以将书签添加到文档提纲中。文档中的书签将以单独的窗格式出现在Acrobat阅读器中,这样允许我们直接跳到重要的章节。

如下代码行:


pdf_add_bookmark($pdf,'Page 1',0,0);


将增加一条带有标签Page1的大纲记录,该记录指向当前页。

系统中可用字体将根据操作系统不同而不同,甚至对于不同的机器也不一样。为了保证结果的一致性,PDF阅读器包含了一组核心字体。这14个核心字体分别是:

■Courier

■Courier-Bold

■Courier-Oblique

■Courier-BoldOblique

■Helvetica

■Helvetica-Bold

■Helvetica-Oblique

■Helvetica-BoldOblique

■Times-Roman

■Times-Bold

■Times-Italic

■Times-BoldItalic

■Symbol

■ZapfDingbats

文档中也可以包含以上字体集合以外的字体。但这可能会增加文件的大小,而且可能不被某些特殊的字体许可所支持。我们可以选择字体、大小和字符编码方式,如下所示:


$font=pdf_findfont($pdf,'Times-Roman','host',0);

pdf_setfont($pdf,$font,24);


字体大小是按点计算的。在这个例子中,我们选择了主机字符编码。这种编码允许的取值有winansi、builtin、macroman、ebcdic或host。不同取值的含义如下所示:

■winansi——由Microsoft在ISO8859-1字符集的基础上再添加的特殊符号,比如欧元符号。

■builtin——使用字体内置的编码。通常,用于非拉丁字体和符号。

■macroman——Mac Roman编码。默认的Macintosh字符集。

■ebcdic——用在IBM AS/400系统中的EBCDIC。

■host——基于Mac的系统自动选择macroman,基于EBCDIC的系统选择ebcdic,所有其他系统选择winansi。

如果不需要包含特殊字符,那么这个编码选项并不重要。

PDF文档不像HTML文档或字处理器文档。在默认情况下,文本并不是简单地从左上方开始,接下来是其他行。我们必须选择在哪里放置每一行文本。正如前面已经提到的,PDF用点来指定位置。原点(X,Y坐标为[0,0])位于页面的左下角。

假定页面大小是612×792点,点(50,700)大约距离页面的左边2/3英寸,距离顶部1/3英寸。要将文本位置设置到该点,可以使用如下所示的代码:


pdf_set_text_pos($pdf,50,700);


最后,设置好页面后,可以在上面书写文本了。我们用pdf_show()函数在当前点以当前字体添加文本。

如下代码行:


pdf_show($pdf,'Hello,world!');


将"Hello world!"添加到文档中。

要移到下一行并接着写入更多文本,可以使用pdf_continue_text()函数。要在文档中增加字符串"(says PHP)",可以使用如下所示语句:


pdf_continue_text($pdf,'(says PHP)');


该字符串的确切显示位置将由所选的字体及大小来确定。

如果还要插入其他行、短语和段落,pdf_show_boxed()函数非常有用。它允许声明一个文本框并在其中输入文本。

完成将元素添加到页面后,要以如下方式调用pdf_end_page()函数:


pdf_end_page($pdf);


生成整个PDF文档后,还需要调用pdf_close()函数关闭该文档。当要生成一个文件时,也需要关闭这个文件。

如下代码行:


pdf_close($pdf);


将完成Hello World整个文档。

现在,我们可以将所完成的PDF文档发送给浏览器:


$data=pdf_get_buffer($pdf);

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

header('Content-Type:application/pdf');

header('Content-Disposition:inline;filename=testpdf.pdf');

header('Content-Length:'.strlen($data));

//output PDF

echo$data;


我们也可以将该数据写入磁盘。通过以文件名称作为pdf_open_file()函数的第二个参数,PDFlib允许将数据写入磁盘中。

请注意,在PDFlib的某些版本中,PHP手册中给出的某些可选的PDFlib函数参数是必需的。关于证书的文档相对要复杂一些,它包含边界、一幅向量图和一幅位图。使用其他两种技巧,我们可以用字处理器来添加这些元素。如果使用PDFlib,我们则必须手动添加。