首頁  >  文章  >  後端開發  >  怎樣用PHP寫PDF文檔產生器

怎樣用PHP寫PDF文檔產生器

WBOY
WBOY原創
2016-08-08 09:33:32986瀏覽

怎樣用PHP寫PDF文檔產生器

php一個最大的優點就是它對新技術的支援非常容易,這種語言的可擴展性使得開發人員能夠很方便地添加新的模組,而且遍布世界的技術團體的支持和眾多擴展模組的支持使得PHP已成為功能最齊全的Web程式語言之  一。目前可取得的擴充模組已經能夠讓開發人員執行IMAP和POP3操作,可以動態產生圖象和Shockwave Flash動畫,進行信用卡驗證,敏感資料的加密解密,還能夠解析xml格式的資料。但這還不是全部,現在,又有一個新的模組可以與PHP進行綁定了,那就是PDFLib擴充模組,它能夠讓開發人員動態產生PDF(Adobe Portable Document Format)格式的文件,下面就先看看如何在PHP裡使用這個模組。

為了能夠讓PHP具有操作PDF格式文件的能力,你必須先在你的系統安裝PDFLib擴充庫,如果你使用的是Lunix系統,你可以從http://www.pdflib.com/pdflib/index. html下載一個並進行編譯,如果你使用的是Windows系統,那就更簡單了,只需要下載一個編譯好的PDFLib庫,然後在PHP的設定檔裡把對應的行的註解去掉。


extension=php_pdf.dll


如果是動態裝載,也可以是參考下面的指令:


dl("php_pdf.dll");


另外,你還必須有一個Adobe Acrobat PDF閱讀器,用來瀏覽PDF格式,如果沒有,可以從http://www.adobe.com/免費下載。

一旦你做好了前期準備,你就可以建立PDF檔案了,以下就是一個簡單的例子:

 


// 建立一個新的PDF文檔句柄

$pdf = PDF_new();


// 開啟一個文件

PDF_open_file($pdf, "PDFTest.pdf");


// 開始一個新頁面(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);


// 結束一頁

PDF_end_page($pdf);


// 關閉並儲存文件

PDF_close($pdf);

?>

 

然後儲存成PHP文件,在瀏覽器裡進行瀏覽,PHP就會執行上面的程式碼,它產生一個新的PDF文件,並儲存到指定的位置。

現在我們分析一下什麼的程式碼,要使用PHP建立PDF文件,有四個步驟:1,建立文檔句柄;2,註冊文檔的字體和顏色;3,用PDFLib提供的函數向文件句柄寫文字或畫圖; 4,儲存文件。

首先,建立PDF文檔句柄,語法如下:


$pdf = PDF_new();


這個任務是由PDF_new()函數完成的,它會傳回一個PDF文件的句柄,這個句柄將會被後續的所有操作使用。

下一步要做的,就是給PDF檔案一個名字,由PDF_open_file()函數完成,它需要先前建立的檔案句柄和自訂的檔案名稱做參數:


PDF_open_file($pdf, "PDFTest.pdf");


一旦我們建立了文檔,就可以用PDF_begin_page()函數在其中插入新頁面了:


PDF_begin_page($pdf, 595, 842);


然後用PDF_end_page()結束頁面。

注意這裡,在PDF_begin_page()函數裡,有另外兩個參數,他們分別代表頁面尺寸的寬和高,單位是磅(point,1磅等於1/72英寸),或許在這裡數學並不是你的強項,PHP也提供了大多數標準頁面尺寸,象A4等,上面的例子就是使用A4的尺寸。

在呼叫PDF_begin_page()函數和PDF_end_page()函數之間的程式碼是向PDF文檔了寫內容的,內容可以是文字、圖像以及幾何圖形等。例子中只是寫了一行文字,先得到一個字體,然後把文字寫到文件裡。透過PDF_findfont()和PDF_setfont()函數選擇和註冊字體是很方便的,PDF_findfont()函數預備了一種文件中要使用的字體,需要的參數有字體的名字,使用的編碼,字體是否要嵌入到PDF文件中。 PDF_findfont()函數傳回一個字體對象,它將會在PDF_setfont()函數裡使用。


$arial = PDF_findfont($pdf, "Arial", "host", 1);

PDF_setfont($pdf,$arial, 10);


一旦我們設定了字體,就可以使用PDF_show_xy()函數來為頁面中的指定位置寫字串了。


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()函數用來寫內容,最後兩個參數是要寫入的字串的座標位置,注意座標的原點(0,0)是在文件的左下角。一旦文字寫完了,頁面就可以關閉了PDF_end_page(),當然你也可以寫更多的頁。所有的頁面寫完之後,用PDF_close()函數關閉文檔,此時文檔就回儲存到呼叫PDF_open_file()函數時指定的文件名稱和路徑下,文檔句柄隨之銷毀。

PDFLib庫能做的事情遠不止這些,還可以在頁面裡加入圖象,我們以前面的文件為例,在文字的下面添加一個圖像文件,下面的語句實現了添加圖像功能:


$image = PDF_open_image_file($pdf, "jpeg", "PDFImageTest.jpg");

PDF_place_image($pdf, $image, 50, 650, 0.25);


是不是很簡單? PDF_open_image_file()函數開啟一個圖形文件,可以接受的圖象類型有:GIF, JPEG, TIFF 和PNG,該函數返回圖象句柄,PDF_place_image()函數利用前面的圖象句柄,把圖象插入到PDF文檔中。注意這裡的座標位置是指圖象的左下角,最後一個參數是圖象顯示時的比例因子,1是與實際大小一樣顯示,0.5是以原來尺寸的一半顯示。

除了在PDF文件裡畫出有的圖像以外,PDF模組也提供了許多函數來讓我們畫出幾何圖形。例如:直線、圓、長方形等幾何圖案,以下就是一段畫直線的實作方法:


$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);


// 設定直線的顏色

PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);


// 在左上角放置一個Logo標識

$image = PDF_open_image_file($pdf, "jpeg", "logo.jpg");

PDF_place_image($pdf, $image, 50, 785, 0.5);


// 在Logo標識下畫出直線

PDF_moveto($pdf, 20, 780);

PDF_lineto($pdf, 575, 780);

PDF_stroke($pdf);


// 在頁面底部畫出另外一條直線

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);

?>

 

從上面的範例可以看出,要畫一條直線,只需要三個函數:PDF_moveto(), PDF_lineto() 和 PDF_stroke()。上面的例子是先用PDF_moveto($pdf, 20, 780)函數把遊標移到座標(20,780),再用PDF_lineto($pdf, 575, 780)函數定義直線的另一個點的座標(575, 780),最後用PDF_stroke($pdf)畫出線。設定顏色的函數PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0)有好幾個參數,其中的顏色填滿模式有stroke、fill、both三種選項,顏色可以是RGB或CMYK配色方案的顏色值。值得注意的是:PDF_setcolor()函數中使用的值是顏色的百分比,也就是說是該顏色的亮度,例如:如果你想設為紅色(RGB:255,0,0),你可以這樣寫:PDF_setcolor ($pdf, "stroke", "rgb", 1, 0, 0),若要設為黃色,可以這樣:PDF_setcolor($pdf, "stroke", "rgb", 1, 1, 0)。


想要畫有填充色的長方形和圓形,可以使用下面的方法:


//設定填滿顏色

PDF_setcolor($pdf, "fill", "rgb", 1, 1, 0);


// 設定邊框線的顏色

PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);


// 畫出矩形,後面的四個參數分別是左下角的座標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);


// 畫出圓,參數分別是圓心座標和圓的半徑


PDF_circle($pdf, 400, 600, 100)


此外,PDFLib還提供了書寫文件摘要資訊的函數,這些函數以PDF_set_info_*()開頭,這些資訊可以包括:文件的作者、標題、內容,主題等。下面是幾個常用的函數:


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開啟這樣的文件時,在選單「檔案」-「文件屬性」-「摘要」裡就能看到上面寫進去的資訊。

說到這裡,相信大家對如何使用PDFLib建立PDF文件有了基本的了解了吧。下面,我們就以一個實際的例子來看看如何為我們的工作服務。這個例子是根據提供的資料來產生圓餅圖,首先,建立一個資料輸入表單,輸入圓餅圖中每一塊的大小。文件如下:


利用PHP建立PDF文件(圓餅圖)

圓餅圖產生器

請輸入圓餅圖中每一塊的資料值,以(,)分割開:


下面是pie.php檔案的程式碼:


// 接受書庫

$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

$degrees[$y] = ($slices[$y]/$sum) * 360;

}


// 開始建立 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

{

// 設定填滿色

PDF_setcolor($pdf, "fill", "rgb", $colours[$z][0],

$colours[$z][1], $colours[$z][2]);


// 計算每個圓弧的終點座標

$end_x = round(250 + ($radius * cos($last_angle*pi()/180)));

$end_y = round(250 + ($radius * sin($last_angle*pi()/180)));


// 用直線分割每一塊圓弧

PDF_moveto($pdf, 250, 250);

PDF_lineto($pdf, $end_x, $end_y);


// 計算並畫出圓弧

PDF_arc($pdf, 250, 250, $radius, $last_angle,($last_angle+$degrees[$z]));


// 儲存最後的角度

$last_angle = $last_angle+$degrees[$z];


// 填滿顏色

PDF_fill_stroke($pdf);

}


// 重畫外圓輪廓

PDF_circle($pdf, 250, 250, 100);

PDF_stroke($pdf);


PDF_end_page($pdf);

PDF_close($pdf);


// 如果要直接輸出到客戶端的話,把下面的程式碼加上

$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);

?>

 

執行上面的程序,並輸入不同數值,你將會得到不同的圓餅圖。

PDFLib是相容性很好的模組,你不但可以用PHP寫,還可以用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等,具體的運作環境請隨時造訪他們的網站以獲得最新的資料。

以上就介紹了怎麼用PHP來寫PDF文件產生器,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn