本文最后更新于:2024年3月18日 凌晨
PHP PDF文字
文字是一个PDF文档的核心,所以,FPDF提供了很多选项来改变文字外观和布局,本节中,我们将讨论PDF文档所用的坐标系统和用来插入文字,改变文字属性及字体的相关函数。
坐标系
FPDF库指定的PDF文档坐标原点(0,0)位于页面的左上角,度量单位为磅(point),毫米(millimeter),英寸(inche)或厘米(centimeter),一磅(默认单位)等于1/72英寸,或者0.35毫米,在下面的代码(见示例10-2)中我们用FPDF类的构造函数将默认的单位改为英寸,调用构造函数时的其他参数包括页面的方向(纵向或横向),页面尺寸(一般是Legal或Letter),初始化的所有参数请参看下面的表格:
FPDF构造函数的参数
参数选项
方向
P 纵向(默认值) L 横向
度量单位
pt 磅(1/72英寸)(默认值) in 英寸 mm 毫米 cm 厘米
页面尺寸
Letter(默认值) Legal A5 A3 A4 或自定义尺寸
在示例10-2中,我们还用了ln()
函数来设置行跳转,指定我们从什么位置开始继续处理文档,ln()
方法有一个可选的参数,指定了下移多少个单位(单位即我们在构造函数中指定的度量单位),在我们的例子中,度量单位为英寸,所以我们下移的单位为英寸,cell()
方法的坐标系也用英寸来表示,用英寸为单位不是一个理想的创建PDF页面的方法,因为无法随心所欲地控制页面(英寸单位太大,无法精细控制页面,不易设计较精致的效果)
示例10-2在页面的角落和中央放置文字:
示例10-2 :演示坐标和行控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php require ("../../../../library/FPDF/fpdf.php" );$pdf = new FPDF('P' ,'in' ,'Letter' );$pdf ->AddPage();$pdf ->SetFont('Arial' ,'B' ,24 );$pdf ->Cell(0 ,0 ,'Top left!' ,0 ,1 ,'L' );$pdf ->Cell(6 ,0.5 ,'Top right!' ,1 ,0 ,'R' );$pdf ->ln(4.5 );$pdf ->Cell(0 ,0 ,'This is the middle!' ,0 ,0 ,'C' );$pdf ->ln(5.3 );$pdf ->Cell(0 ,0 ,'Bottom Left!' ,0 ,0 ,'L' );$pdf ->Cell(0 ,0 ,'Bottom Right!' ,0 ,0 ,'R' );$pdf ->Output();?>
我们来简单分析部分代码,在我们用构造函数定义页面后,有这样几行代码:
1 2 3 $pdf ->Cell(0 ,0 ,'Top left!' ,0 ,1 ,'L' );$pdf ->Cell(6 ,0.5 ,'Top right!' ,1 ,0 ,'R' );$pdf ->ln(4.5 );
第一行告诉PDF类在坐标系原点(0,0)写上文字"Top Left”,没有边框,并在输出结束后发送一个换行,文字同时也被设置成左对齐,接下来的再次调用cell()
方法是再次创建一个单元格,6英寸宽,高为0.5英寸,宽度为1的边框,并插入右对齐的文字"Top Right!”,然后我们用ln(4.5)
语句告诉PDF类在页面上下移4.5英寸,从该位置开始继续输出内容,正如你看到的,组合cell()
和ln()
方法可以形成很多用法,但这些还不是FPDF的全部功能。
文字属性
有3种方法来改变文字的外观:粗体,下划线和斜体,之前你已经看到FPDF库的SetFont()
方法,但该方法还有一些其他特性,你看到的只是其中之一,示例10-3中使用这种方法来改变输出的文字的格式,这段代码是自注释的,很好理解,请注意代码中这些外观上的改变不是你唯一的选择,你可以任意组合这3种方法,另外,在最后一次调用SetFont()
方法时字体的名称改变了,我们选用了不同的字体。
示例10-3 :演示字体属性设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php require ("../../../../library/FPDF/fpdf.php" );$pdf = new FPDF();$pdf ->AddPage();$pdf ->SetFont('Arial' , '' , 12 );$pdf ->Cell(0 , 5 , 'Regular normal Arial Text here, size 12' , 0 , 1 , 'L' );$pdf ->ln();$pdf ->SetFont('Arial' , 'IBU' , 20 );$pdf ->Cell(0 , 15 , 'This is Bold ,Underlined and Italicised Text , size 15' , 0 , 0 , 'L' );$pdf ->ln();$pdf ->SetFont('Times' , 'IU' , 15 );$pdf ->Cell(0 , 5 , 'This is Times font, Underlined and Italicised Text , size 15' , 0 , 0 , 'L' );$pdf ->ln();$pdf ->Output();?>
FPDF中可用的字体包括:
Courier(fixed-width)
Helvetica or Arial(synonymous; sans serif)
Times(serif)
Symbol(symbols)
ZapfDingbats(symbols)
你也可以在代码中载入其他任何字体,只要你有字体定义文件,可用AddFont()
方法完成该操作。
当然,如果你输出的文字颜色无法改变,那会很无趣,所以FPDF提供了一个SetTextColor()
方法来改变文件颜色,注意要在调用cell()
方法前调用SetTextColor()
方法,这样才能改变效果,color参数分别是red,green和blue值,从0(没有颜色)到255(全色),如果第二,第三个参数未设定,则第一个参数将会是三种颜色混合产生的颜色(即red, green,blue相等,都等于传递进的值,如SetTextColor(128)
等效于SetTextColor(128,128,128)
,效果为黑到白之间的灰色),请参看示例10-4来理解这种用法。
示例10-4 :颜色属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php require ("../../../../library/FPDF/fpdf.php" );$pdf = new FPDF();$pdf ->AddPage();$pdf ->SetFont('Times' , 'U' , 15 );$pdf ->SetTextColor(128 );$pdf ->Cell(0 , 5 , 'Times font, Underlined and shade of Grey Text' , 0 , 0 , 'L' );$pdf ->ln();$pdf ->SetTextColor(255 ,0 ,0 );$pdf ->Cell(0 , 5 , 'Times font, Underlined and Red Text' , 0 , 0 , 'L' );$pdf ->Output();?>
页眉,页脚和类扩展
到现在为止,我们只了解到PDF页面可以输出的内容中的一小部分,那些是我们在受限制的时候能实现的功能,现在我们要进一步扩展这个类库的功能,记住这个类库只是一个定义好的供你使用和扩展的类,我们要做的第二部分工作是扩展这个类,因为FPDF是定义好的类,我们需要使用对象方式来扩展它:
现在我们继承了FPDF类,并有一个新的名称myPDF,接着我们就可以在这个对象中扩展(覆写)任何方法,我们甚至可以添加新的方法,如果需要的话,我们首先要关注的两种方法是已经存在的FPDF类汇总预定义的空方法-----header()
和footer()
,顾名思义,这两种方法用来为PDF文档的每个页面生成页眉和页脚,示例10-5是一个相当长的代码示例,它展示了这两种方法的定义,你会注意到其中只有少量新增的方法,其中最重要的是调用AliasNbPages()
方法,用来跟踪PDF文档中的所有页面相应的页数,它会在某页面发送到浏览器之前计算该页面在整个PDF文档中是第几页。
示例10-5 :定义header和footer方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php require ("../../../../library/FPDF/fpdf.php" );class myPDF extends FPDF { function Header ( ) { global $title ; $this ->SetFont('Times' , '' , 12 ); $w = $this ->GetStringWidth($title ) + 150 ; $this ->SetDrawColor(0 , 0 , 180 ); $this ->SetFillColor(230 , 0 , 230 ); $this ->SetTextColor(0 , 0 , 255 ); $this ->SetLineWidth(1 ); $this ->Cell($w , 9 , $title , 1 , 1 , 'C' , 1 ); $this ->Ln(10 ); } function Footer ( ) { $this ->SetY(-15 ); $this ->SetFont('Arial' , 'I' , 8 ); $this ->Cell(0 , 10 , 'This is the page footer -> Page' . $this ->PageNo() . '/{nb}' , 0 , 0 , 'C' ); } }?>
图像和超级链接
FPDF库也可以在PDF文档中插入图像和超级链接(链接地址可以在文档内部,也可以是外部网页地址),让我们看看FPDF如何让你插入图像到文档中,可能你正在创建一个PDF文档,想在每个页面输出一个带有公司Logo的banner,我们可以使用在上一节中定义的header和footer方法,我们只需要准备一个要使用的图像文件,然后调用image()
方法来插入该图像到PDF文档中。
新的header方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function Header ( ) { global $title ; $this ->SetFont('Times' , '' , 12 ); $w = $this ->GetStringWidth($title ) + 120 ; $this ->SetDrawColor(0 , 0 , 180 ); $this ->SetFillColor(230 , 0 , 230 ); $this ->SetTextColor(0 , 0 , 255 ); $this ->SetLineWidth(0.5 ); $this ->Image('1.png' ,10 ,10.5 ,15 ,8.5 ); $this ->Cell($w , 9 , $title , 1 , 1 , 'C' ); $this ->Ln(10 ); }
就像你看到的,我们只是简单地使用了Image()
方法,它的参数是:要使用的图像文件名称,图像输出的X坐标,Y坐标,图像的宽度和高度,如果你没有指定宽度和高度,FPDF将按你指定的X,Y坐标自动(按图像原始宽高)显示图像,以上这段代码的其他部分也有一点改变,我们在调用cell()
方法时,不再提供颜色填充参数,尽管我们仍然调用了颜色填充函数(SetFillColor()
),这样可使header单元格汇总的背景为白色,我们就可以插入图像而不引起视觉上的冲突。
本节示例的标题将会包含超级链接,所以现在我们来看看FPF库怎么在PDF文档中添加链接,FPDF可以创建两种类型的链接,一种指向PDF文档内部的其他位置(如两页后,或者你放置了锚点(anchor)的任何位置)----我们称之为内部链接,另一种是指向外部网站URL的链接。
创建一个内部链接有两个步骤:先定义原始链接,然后设置锚点(即点击链接时跳转到的地方),设置原始链接可使用AddLink()
方法,这个方法将返回一个你将用来创建链接指向目标的引用,用SetLink()
方法可以指定链接的目标指向,这个方法以原始链接的引用为参数,所以它可以把这两个步骤连接起来。
另一种链接,即外部URL类型的链接,可以用两种方法来添加,如果你想在一个图像上加入链接,需要用image()
方法,需要用image()
方法,如果你只是将文字上加上链接,你可以用cell()
或write()
方法,我们在以下示例中使用write()
方法。
示例10-6 :创建内部和外部链接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php require ("../../../../library/FPDF/fpdf.php" );$pdf = new FPDF();$pdf ->AddPage();$pdf ->SetFont('Times' ,'' ,14 );$pdf ->Write(5 ,'For a link to the next page - Click' );$pdf ->SetFont('' ,'U' );$pdf ->SetTextColor(0 ,0 ,255 );$link_to_pg2 = $pdf ->AddLink();$pdf ->Write(5 ,'here' ,$link_to_pg2 );$pdf ->SetFont('' );$pdf ->AddPage();$pdf ->SetLink($link_to_pg2 );$pdf ->Image('../../../../Media/Photo/image/1.png' ,10 ,10 ,30 ,0 ,'' ,"http://www.php.net" );$pdf ->Ln(20 );$pdf ->Cell(0 ,5 ,'It all starts here - Click the following link,or click on the image' ,0 ,1 ,'L' );$pdf ->SetFont('' ,'U' );$pdf ->SetTextColor(0 ,0 ,255 );$pdf ->Write(5 ,'www.oreilly.com' ,'http://www.oreilly.com' );$pdf ->Output();?>
表格和数据
到现在为止,我们只了解了静态PDF,但是PHP能做的不只是静态处理,本节我们将从数据库汇总读取数据,并用FPDF来生成表格。
示例10-7 :创建一个表格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <?php require ("../../../../library/FPDF/fpdf.php" );class PDF extends FPDF { function BuildTable ($header ,$data ) { $this ->SetFillColor(255 ,0 ,0 ); $this ->SetTextColor(255 ); $this ->SetDrawColor(128 ,0 ,0 ); $this ->SetLineWidth(.3 ); $this ->SetFont('' ,'B' ); $w = array (80 ,40 ,15 ); for ($i = 0 ;$i <count($header );$i ++) $this ->Cell($w [$i ],7 ,$header [$i ],1 ,0 ,'C' ,1 ); $this ->Ln(); $this ->SetFillColor(175 ); $this ->SetTextColor(0 ); $this ->SetFont('' ); $fill = 0 ; foreach ($data as $row ){ $this ->Cell($w [0 ],6 ,$row [0 ],'LR' ,0 ,'L' ,$fill ); $this ->SetTextColor(0 ,0 ,255 ); $this ->SetFont('' ,'U' ); $this ->Cell($w [i],6 ,$row [2 ],'LR' ,0 ,'C' ,$fill ); $this ->Ln(); $fill =!$fill ; } $this ->Cell(array_sum($w ),0 ,'' ,'T' ); } }$servername = "localhost" ;$username = "username" ;$password = "password" ;$dbname = "myDB" ;$conn = mysqli_connect($servername , $username , $password , $dbname );if (!$conn ) { die ("连接失败: " . mysqli_connect_error()); }$sql = "SELECT id, firstname, lastname FROM MyGuests" ;$result = mysqli_query($conn , $sql );if (mysqli_num_rows($result ) > 0 ) { while ($row = mysqli_fetch_assoc($result )) { echo "id: " . $row ["id" ]. " - Name: " . $row ["firstname" ]. " " . $row ["lastname" ]. "<br>" ; } } else { echo "0 结果" ; } mysqli_close($conn );$pdf = new PDF();$header =array ('Book title' ,'ISBN' ,'Year' );$pdf ->SetFont('Arial' ,'' ,14 );$pdf ->AddPage();$pdf ->BuildTable($header ,$data );$pdf ->Output();?>
我们使用了数据库链接并构建了两个数组来传递给当前扩展类中自定义的方法,BuildTable()
方法内,我们为表格的头部设置颜色和字体属性,并根据第一个传递进来的数组发送头部到文档,另一个数组$w(w指width)用来设置表格列的宽度,并在带调用cell()
方法的时候作为参数被使用。
在表格的头部发送之后,我们使用包含数据库信息的$data数组,用一个foreach循环来遍历该数组,要注意这里的cell()
方法使用”LR"作为边框的参数,这意味着左边和右边的边框被设置,所以能够为表格的每一行增加边距,我们为第二列增加一个URL链接,只是用来告诉你在创建表格的行的时候你可以考虑这个功能(如果你需要的话),最后我们使用$fill变量来不断取反,使创建表格时每一行的背景不断改变。
BuildTable()
方法中最后一次调用cell()
方法是为了绘制表格的底部,并关闭表格列。