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,我们则必须手动添加。