PHP一個(gè)最大的優(yōu)點(diǎn)就是它對新技術(shù)的支持非常容易,這種語(yǔ)言的可擴展性使得開(kāi)發(fā)人員能夠很方便地添加新的模塊,而且遍布世界的技術(shù)團體的支持和眾多擴展模塊的支持使得PHP已經(jīng)成為功能最齊全的Web編程語(yǔ)言之 一。目前可得到的擴展模塊已經(jīng)能夠使開(kāi)發(fā)人員執行IMAP和POP3操作,可以動(dòng)態(tài)產(chǎn)生圖象和Shockwave Flash動(dòng)畫(huà),進(jìn)行信用卡驗證,敏感數據的加密解密,還能夠解析XML格式的數據。但這還不是全部,現在,又有一個(gè)新的模塊可以與PHP進(jìn)行綁定了,那就是PDFLib擴展模塊,它能夠讓開(kāi)發(fā)人員動(dòng)態(tài)產(chǎn)生PDF(Adobe Portable Document Format)格式的文件,下面就先看看如何在PHP里使用這個(gè)模塊。
為了能夠使PHP具有操作PDF格式文檔的能力,你必須先在你的系統里安裝PDFLib擴展庫,如果你使用的是Lunix系統,你可以從 http://www.pdflib.com/pdflib/index.html下載一個(gè)并進(jìn)行編譯,如果你使用的是Windows系統,那就更簡(jiǎn)單了,只需要下載一個(gè)編譯好的PDFLib庫,然后在PHP的配置文件里把相應的行的注釋去掉即可。
extension=php_pdf.dll
如果是動(dòng)態(tài)裝載,也可以是參照下面的命令:
dl("php_pdf.dll");
此外,你還必須有一個(gè)Adobe Acrobat PDF閱讀器,用來(lái)瀏覽PDF格式,如果你沒(méi)有,你可以從http://www.adobe.com/免費下載。
一旦你做好了前期準備,就可以創(chuàng )建PDF文件了,下面就是一個(gè)簡(jiǎn)單的例子:
<?php
// 創(chuàng )建一個(gè)新的PDF文檔句柄
$pdf = PDF_new();
// 打開(kāi)一個(gè)文件
PDF_open_file($pdf, "PDFTest.pdf");
// 開(kāi)始一個(gè)新頁(yè)面(A4)
PDF_begin_page($pdf, 595, 842);
// 得到并使用字體對象
$arial = PDF_findfont($pdf, "Arial", "host", 1);
PDF_setfont($pdf, $arial, 10);
// 輸出文字
PDF_show_xy($pdf, "This is an exam of PDF Documents, It is a good Lib,",50, 750);
PDF_show_xy($pdf, "If you like,please try yourself!", 50, 730);
// 結束一頁(yè)
PDF_end_page($pdf);
// 關(guān)閉并保存文件
PDF_close($pdf);
?>
然后保存成PHP文件,在瀏覽器里進(jìn)行瀏覽,PHP就會(huì )執行上面的代碼,它產(chǎn)生一個(gè)新的PDF文件,并保存到指定的位置。
現在我們分析一下什么的代碼,要使用PHP創(chuàng )建PDF文件,有四個(gè)步驟:1,創(chuàng )建文檔句柄;2,注冊文檔的字體和顏色;3,用PDFLib提供的函數向文件句柄寫(xiě)文字或畫(huà)圖;4,保存文檔。
首先,創(chuàng )建PDF文檔句柄,語(yǔ)法如下:
$pdf = PDF_new();
這個(gè)任務(wù)是由PDF_new()函數完成的,它返回一個(gè)PDF文檔的句柄,這個(gè)句柄將會(huì )被后續的所有操作使用。
下一步要做的,就是給PDF文件一個(gè)名字,由PDF_open_file()函數完成,它需要先前創(chuàng )建的文件句柄和自定義的文件名做參數:
PDF_open_file($pdf, "PDFTest.pdf");
一旦我們創(chuàng )建了文檔,就可以用PDF_begin_page()函數在其中插入新頁(yè)面了:
PDF_begin_page($pdf, 595, 842);
然后用PDF_end_page()結束頁(yè)面。
注意這里,在PDF_begin_page()函數里,有另外兩個(gè)參數,他們分別代表頁(yè)面尺寸的寬和高,單位是磅(point,1磅等于1/72英寸),或許在這里數學(xué)并不是你的強項,PHP還提供了大多數標準頁(yè)面尺寸,象A4等,上面的例子就是使用A4的尺寸。
在調用PDF_begin_page()函數和PDF_end_page()函數之間的代碼是向PDF文檔了寫(xiě)內容的,內容可以是文字、圖象以及幾何圖形等。例子中只是寫(xiě)了一行文字,先得到一個(gè)字體,然后把文字寫(xiě)到文檔里。通過(guò)PDF_findfont()和PDF_setfont()函數選擇和注冊字體是很方便的,PDF_findfont()函數預備了一種文檔中要使用的字體,需要的參數有字體的名字,使用的編碼,字體是否要嵌入到PDF文件中。PDF_findfont()函數返回一個(gè)字體對象,它將會(huì )在PDF_setfont()函數里使用。
$arial = PDF_findfont($pdf, "Arial", "host", 1);
PDF_setfont($pdf,$arial, 10);
一旦我們設定了字體,就可以使用PDF_show_xy()函數向頁(yè)面中的指定位置寫(xiě)字符串了。
PDF_show_xy($pdf, "This is an exam of PDF Documents, It is a good Lib,",50, 750);
PDF_show_xy($pdf, "If you like,please try yourself!", 50, 730);
PDF_show_xy()函數用來(lái)向頁(yè)面寫(xiě)內容,最后兩個(gè)參數是要寫(xiě)入的字符串的坐標位置,注意坐標的原點(diǎn)(0,0)是在文檔的左下角。一旦文字寫(xiě)完了,頁(yè)面就可以關(guān)閉了PDF_end_page(),當然你也可以寫(xiě)更多的頁(yè)。所有的頁(yè)面寫(xiě)完之后,用PDF_close()函數關(guān)閉文檔,此時(shí)文檔就回保存到調用PDF_open_file()函數時(shí)指定的文件名和路徑下,文檔句柄隨之銷(xiāo)毀。
PDFLib庫能做的事情還遠不止這些,還可以在頁(yè)面里加入圖象,我們以前面的文件為例,在文字的下面添加一個(gè)圖象文件,下面的語(yǔ)句實(shí)現了添加圖象功能:
$image = PDF_open_image_file($pdf, "jpeg", "PDFImageTest.jpg");
PDF_place_image($pdf, $image, 50, 650, 0.25);
是不是很簡(jiǎn)單?PDF_open_image_file()函數打開(kāi)一個(gè)圖形文件,可以接受的圖象類(lèi)型有:GIF, JPEG, TIFF 和 PNG,該函數返回圖象句柄,PDF_place_image()函數利用前面的圖象句柄,把圖象插入到PDF文檔中。注意這里的坐標位置是指圖象的左下角,最后一個(gè)參數是圖象顯示時(shí)的比例因子,1是與實(shí)際大小一樣顯示,0.5是按原來(lái)尺寸的一半顯示。
除了在PDF文檔里畫(huà)出現有的圖象以外,PDF模塊還提供了許多函數來(lái)讓我們畫(huà)出幾何圖形。比如:直線(xiàn)、圓、長(cháng)方形等幾何圖案,下面就是一段畫(huà)直線(xiàn)的實(shí)現方法:
<?php
$pdf = PDF_new();
PDF_open_file($pdf, "LineExam.pdf");
PDF_begin_page($pdf, 595, 842);
$arial = PDF_findfont($pdf, "Arial", "host", 1);
PDF_setfont($pdf, $arial, 12);
// 設定直線(xiàn)的顏色
PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);
// 在左上角放置一個(gè)Logo標識
$image = PDF_open_image_file($pdf, "jpeg", "logo.jpg");
PDF_place_image($pdf, $image, 50, 785, 0.5);
// 在Logo標識下畫(huà)出直線(xiàn)
PDF_moveto($pdf, 20, 780);
PDF_lineto($pdf, 575, 780);
PDF_stroke($pdf);
// 在頁(yè)面底部畫(huà)出另外一條直線(xiàn)
PDF_moveto($pdf, 20,50);
PDF_lineto($pdf, 575, 50);
PDF_stroke($pdf);
// 輸出一些文字
PDF_show_xy($pdf, "Meng‘s Corporation", 200, 35);
PDF_end_page($pdf);
PDF_close($pdf);
?>
從上面的例子可以看出,要畫(huà)一條直線(xiàn),只需要三個(gè)函數即可:PDF_moveto(), PDF_lineto() 和 PDF_stroke()。上面的例子是先用PDF_moveto($pdf, 20, 780)函數把光標移動(dòng)到坐標(20,780),然后用PDF_lineto($pdf, 575, 780)函數定義直線(xiàn)的另外一個(gè)點(diǎn)的坐標(575,780),最后用PDF_stroke($pdf)畫(huà)出線(xiàn)。設定顏色的函數PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0)有好幾個(gè)參數,其中的顏色填充模式有stroke、fill、both三種選項,顏色可以是RGB或CMYK配色方案的顏色值。值得注意的是:PDF_setcolor()函數中使用的值是顏色的百分比,也就是說(shuō)是該顏色的亮度,比如:如果想設為紅色(RGB:255,0,0),你可以這樣寫(xiě):PDF_setcolor($pdf, "stroke", "rgb", 1, 0, 0),如果想設為黃色,可以這樣:PDF_setcolor($pdf, "stroke", "rgb", 1, 1, 0)。
要想畫(huà)帶填充色的長(cháng)方形和圓形,可以使用下面的方法:
//設定填充顏色
PDF_setcolor($pdf, "fill", "rgb", 1, 1, 0);
// 設定邊框線(xiàn)的顏色
PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);
// 畫(huà)矩形,后面的四個(gè)參數分別是左下角的坐標X、Y和寬度、高度
PDF_rect($pdf, 50, 500, 200, 300);
PDF_fill_stroke($pdf);
PDF_setcolor($pdf, "fill", "rgb", 0, 1, 0);
PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 1);
// 畫(huà)出圓,參數分別是圓心坐標和圓的半徑
PDF_circle($pdf, 400, 600, 100)
此外,PDFLib還提供了書(shū)寫(xiě)文檔摘要信息的函數,這些函數以PDF_set_info_*()開(kāi)頭,這些信息可以包括:文檔的作者、標題、內容,主題等。下面是幾個(gè)常用的函數:
PDF_set_info_author($pdf, "net_lover");
PDF_set_info_creator($pdf, "Meng Xianhui");
PDF_set_info_title($pdf, "PHP Exam");
PDF_set_info_subject($pdf, "PHP");
PDF_set_info_keywords($pdf, "PHP PDF PDFLib");
當用Acrobat Reader打開(kāi)這樣的文檔時(shí),在菜單“文件”-“文檔屬性”-“摘要”里就能看到上面寫(xiě)進(jìn)去的信息。
說(shuō)到這里,相信大家對如何使用PDFLib創(chuàng )建PDF文檔有了基本的了解了吧。下面,我們就以一個(gè)實(shí)際的例子來(lái)看看如何為我們的工作服務(wù)。這個(gè)例子就是根據提供的數據來(lái)生成餅圖,首先,建立一個(gè)數據輸入表單,輸入餅圖中每一塊的大小。文件如下:
<html>
<head>
<title>利用PHP創(chuàng )建PDF文檔(餅圖)</title>
</head>
<body>
<h3>餅圖生成器</h3>
<table cellspacing="5" cellpadding="5">
<form action="pie.php" method=POST>
<tr>
<td>請輸入餅圖中每一塊的數據值,以(,)分割開(kāi):</td></tr>
<tr><td><input type=text name=data></td></tr>
<tr><td><input type=submit value="產(chǎn)生PDF餅圖"></td></tr>
</form>
</table>
</body>
</html>
下面是pie.php文件的代碼:
<?php
// 接受書(shū)庫
$data = $_POST[‘data‘];
$slices = explode(",", $data);
// 初始化變量
$sum = 0;
$degrees = Array();
$diameter = 200;
$radius = $diameter/2;
// 設定每一塊餅圖的顏色,用數組存儲
$colours = array(array(0,0,0),array(0,0,1),array(0,1,0),
array(1,0,0),array(0,1,1),array(1,1,0),
array(1,0,1));
// 計算總的數值
$sum = array_sum($slices);
// 把每一塊分別轉換成相應的百分數(360度圓)
for ($y=0; $y<sizeof($slices); $y++) {
$degrees[$y] = ($slices[$y]/$sum) * 360;
}
// 開(kāi)始創(chuàng )建 PDF 文檔
$pdf = PDF_new();
PDF_open_file($pdf, "chart.pdf");
PDF_begin_page($pdf, 500, 500);
PDF_setcolor($pdf, "stroke", "rgb", 1, 1, 0);
PDF_moveto($pdf, 250, 250);
PDF_lineto($pdf, 350, 250);
PDF_stroke($pdf);
for ($z=0; $z<sizeof($slices); $z++)
{
// 設定填充顏色
PDF_setcolor($pdf, "fill", "rgb", $colours[$z][0],
$colours[$z][1], $colours[$z][2]);
// 計算每個(gè)圓弧的終點(diǎn)坐標
$end_x = round(250 + ($radius * cos($last_angle*pi()/180)));
$end_y = round(250 + ($radius * sin($last_angle*pi()/180)));
// 用直線(xiàn)分割每一塊圓弧
PDF_moveto($pdf, 250, 250);
PDF_lineto($pdf, $end_x, $end_y);
// 計算并畫(huà)出圓弧
PDF_arc($pdf, 250, 250, $radius, $last_angle,($last_angle+$degrees[$z]));
// 保存最后的角度
$last_angle = $last_angle+$degrees[$z];
// 填充顏色
PDF_fill_stroke($pdf);
}
// 重畫(huà)外圓輪廓
PDF_circle($pdf, 250, 250, 100);
PDF_stroke($pdf);
PDF_end_page($pdf);
PDF_close($pdf);
// 如果要直接輸出到客戶(hù)端的話(huà),把下面的代碼加上
$buf = PDF_get_buffer($p);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=Pie_php.pdf");
print $buf;
PDF_delete($p);
?>
運行上面的程序,并輸入不同數值,你將會(huì )得到不同的餅圖。
PDFLib是一個(gè)兼容性很好的模塊,你不但可以用PHP編寫(xiě),還可以用Java,C#,VB.NET,VB5/6(ActiveX/COM),ASP(VBScript/Jscript),Borland Delphi, Windows Script Host,ColdFusion4.5+,C/C++,Python,Perl,RPG;支持的平臺不僅僅有Windows,還有Unix/Linux,Mac OS,IBM eServer iSeries 400 和 zSeries S/390等,具體的運行環(huán)境請隨時(shí)訪(fǎng)問(wèn)他們的網(wǎng)站得到最新的資料。
聯(lián)系客服