亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP在網頁中動態生成PDF文件詳細教程

2020-03-22 17:47:32
字體:
來源:轉載
供稿:網友
本文詳細介紹使用 PHP 動態構建 PDF 文件的整個過程。使用免費 PDF 庫 (FPDF) 或 PDFLib-Lite 等開源工具進行實驗,并使用 PHP 代碼控制 PDF 內容格式。有時您需要準確控制要打印的頁面的呈現方式。在這種情況下,HTML 就不再是最佳選擇了。PDF 文件使您能夠完全控制頁面的呈現方式,以及文本、圖形和圖像在頁面上的呈現方式。遺憾的是,用來構建 PDF 文件的 API 不屬于 PHP 工具包的標準部件?,F在您需要提供一點幫助。當您在網絡上搜索,尋找對 PHP 的 PDF 支持時,您首先發現的可能是商業 PDFLib 庫及其開源版本 PDFLib-Lite。 這些都是很好的庫,但是商業版本相當昂貴。PDFLib 庫的精簡版本庫僅作為原始版本分發,當您嘗試在托管環境下安裝精簡版本時,就會出現這個限制問題。另一種選擇是免費 PDF 庫 (FPDF),它是本機 PHP,無需要進行任何編譯,是完全免費的,因此,您不會像在未許可版本的 PDFLib 中那樣看到水印。這個免費的 PDF 庫正是我在本文中會用到的庫。我們將使用女子旱滑比賽的得分來演示動態構建 PDF 文件的過程。這些得分是從 Web 中獲得并被轉換成 XML。清單 1 顯示了一個示例 XML 數據文件。清單 1. XML 數據 events event name="Beast of the East 2011" game score1="88" team1="Toronto Gore-Gore Rollergirls" team2="Montreal La Racaille" score2="11" game score1="58" team1="Toronto Death Track Dolls" team2="Montreal Les Contrabanditas" score2="49" /game /game /event event name="Dustbowl Invitational 2011" /event event name="The Great Yorkshire Showdown 2011" /event /events XML 的根元素是一個 events 標記。按事件對數據進行分組,每個事件都包含多個比賽。在 events 標記內,是一系列的 event 標記,在這些標記中有多個 game 標記。 這些 game 標記中包含參加比賽的兩個隊的名稱以及他們在比賽中的得分。清單 2 展示了用來讀取 XML 的 PHP 代碼。function getResults() { $xml = new DOMDocument(); $xml- load('events.xml'); $events = array(); foreach($xml- getElementsByTagName('event') as $event) { $games = array(); foreach($event- getElementsByTagName('game') as $game) { $games []= array( 'team1' = $game- getAttribute('team1'), 'score1' = $game- getAttribute('score1'), 'team2' = $game- getAttribute('team2'), 'score2' = $game- getAttribute('score2') ); $events []= array( 'name' = $event- getAttribute('name'), 'games' = $games ); return $events;這段腳本實現了一個 getResults 函數,以便將 XML 文件讀入 DOM 文檔。然后使用 DOM 調用遍歷所有 event 和 game 標記,以構建一個事件陣列。該數列內的每個元素都是一個散列表,包含事件名稱和比賽項目的陣列。結構基本上是 XML 結構的內存版。為了測試這個腳本的作用,將構建一個 HTML 導出頁面,使用 getResults 函數讀取文件,然后以一系列 HTML 表的形式輸出數據。清單 3 顯示了該測試所用的 PHP 代碼。清單 3. 結果 HTML 頁面include_once('getresults.php');$results = getResults();foreach( $results as $event ) { h1 php echo( $event['name'] ) /h1 foreach( $event['games'] as $game ) { $s1 = (int)$game['score1']; $s2 = (int)$game['score2'];
td style="font-weight: php echo( ( $s1 $s2 ) 'bold' : 'normal') " php echo( $game['team1'] ) /td td php echo( $s1 ) /td td style="font-weight: php echo( ( $s2 $s1 ) 'bold' : 'normal') " php echo( $game['team2'] ) /td td php echo( $s2 ) /td /tr /tbody /table
通過代碼 getresults.php,XML 數據文件被上傳到 Web 服務器,您可以查看 HTML 結果,這與 圖 1 類似。
圖 1. HTML 格式的競賽結果在該結果中,對獲勝隊使用了粗體,以便查看哪支隊贏得了哪場比賽。構建 PDF獲得數據之后,應將重點放在構建 PDF 文件上。第一步是下載 FPDF 庫,然后將其安裝在與現有應用文件集相同的目錄中。實際上,只要是在 PHP 庫路徑中,您可以將它安裝在任何您喜歡的地方。追蹤您放置字體目錄的地方,因為您需要設置 ‘FPDF_FONTPATH',如 清單 4 所示。清單 4. PDF Hello Worlddefine('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');require( 'fpdf.php' );$pdf = new FPDF();$pdf- SetFont('Arial','',72);$pdf- AddPage();$pdf- Cell(40,10,"Hello World!",15);$pdf- Output();這段腳本實際上是一個 “Hello World”,但采用的是 PDF 格式而不是 HTML。這段腳本執行的第一個操作是使用 define 語句設置 FPDF 字體目錄的位置。然后使用 require 語句引入 FPDF 庫。這段腳本從該庫創建了一個 FPDF 對象,設置字體,添加一個頁面,然后使用 Cell 方法將一些文本放在該頁面上,并輸出 PDF。圖 2 展示了一切都正常情況下的結果。圖 2. PDF 格式的 Hello World如果沒有看到 PDF,那么您可能想在命令行運行這段腳本,查看是否丟失了 fpdf.php 文件或者存在其他問題。既然 PDF 呈現正常,那么現在應該將其與旱滑結果文件合并,并查看可以動態生成哪些內容。清單 5 展示了該合并操作的第一個版本。清單 5. 顯示結果的首版 PDFdefine('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');require( 'fpdf.php' );require( 'getresults.php' );html' target='_blank'>class PDF extends FPDFfunction EventTable($event) $this- Cell(40,10,$event['name'],15); $this- Ln();$pdf = new PDF();$pdf- SetFont('Arial','',48);foreach( getResults() as $event ) { $pdf- AddPage(); $pdf- EventTable($event); $pdf- Output();我們沒有從外部擴展 FPDF 類別,而是使用我們自己的 PDF 子類來擴展 FPDF 類別。在這些子類內,我們創建了一個名為 EventTable 的新方法,為給定事件構建了一個結果表。在這種情況下,我們從小處著手,只輸出了事件名稱。該名稱位于腳本底部,包裝在 foreach 循環中,該腳本為每個事件添加一個頁面,然后調用 EventTable 方法。可在 圖 3 中看到這段腳本的輸出。圖 3. 動態 PDF 的第一個版本
向下滾動頁面,以展示每個事件都在自己的頁面上。此處的下一步操作是開始將結果添加到頁面。構建結果表在構建 PDF 文件時,構建無表結構就像構建 HTML 一樣簡單。構建表的方法是構建許多寬度、字體、填充顏色、行顏色等各不相同的單元。清單 6 展示了設置表的標題欄的添加代碼。清單 6. 添加結果表標題define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');require( 'fpdf.php' );require( 'getresults.php' );class PDF extends FPDFfunction EventTable($event) $this- SetFont('','B','24'); $this- Cell(40,10,$event['name'],15); $this- Ln(); $this- SetXY( 10, 45 ); $this- SetFont('','B','10'); $this- SetFillColor(128,128,128); $this- SetTextColor(255); $this- SetDrawColor(92,92,92); $this- SetLineWidth(.3); $this- Cell(70,7,"Team 1",1,0,'C',true); $this- Cell(20,7,"Score 1",1,0,'C',true); $this- Cell(70,7,"Team 2",1,0,'C',true); $this- Cell(20,7,"Score 2",1,0,'C',true); $this- Ln();$pdf = new PDF();$pdf- SetFont('Arial','',10);foreach( getResults() as $event ) { $pdf- AddPage(); $pdf- EventTable($event); $pdf- Output();此處的添加代碼用于設置字體、顏色和行寬。然后它將呈現包含四個標題列的幾個單元格。然后調用 Ln 方法(該方法與回車鍵等效)啟用一個新行。在瀏覽器中查看這段腳本時,可以看到類似 圖 4 的內容。圖 4. 包含表的標題行的頁面在 圖 4 中,標題以白色文本呈現在灰色背景上。這種格式有助于將其與呈現在標題下面的數據進行區分。要呈現比賽結果,請在 清單 7 中添加以下代碼。清單 7. 添加完整的結果表define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');require( 'fpdf.php' );require( 'getresults.php' );class PDF extends FPDFfunction EventTable($event) $this- SetFont('','B','24'); $this- Cell(40,10,$event['name'],15); $this- Ln(); $this- SetFont('','B','10'); $this- SetFillColor(128,128,128); $this- SetTextColor(255); $this- SetDrawColor(92,92,92); $this- SetLineWidth(.3); $this- Cell(70,7,"Team 1",1,0,'C',true); $this- Cell(20,7,"Score 1",1,0,'C',true); $this- Cell(70,7,"Team 2",1,0,'C',true); $this- Cell(20,7,"Score 2",1,0,'C',true); $this- Ln(); $this- SetFillColor(224,235,255); $this- SetTextColor(0); $this- SetFont(''); $fill = false; foreach($event['games'] as $game) $this- SetFont('Times',((int)$game['score1'] (int)$game['score2']) 'BI':''); $this- Cell(70,6,$game['team1'],'LR',0,'L',$fill); $this- Cell(20,6,$game['score1'],'LR',0,'R',$fill); $this- SetFont('Times',((int)$game['score1'] (int)$game['score2']) 'BI':''); $this- Cell(70,6,$game['team2'],'LR',0,'L',$fill); $this- Cell(20,6,$game['score2'],'LR',0,'R',$fill); $this- Ln(); $fill =! $fill; $this- Cell(180,0,'','T');$pdf = new PDF();$pdf- SetFont('Arial','',10);foreach( getResults() as $event ) { $pdf- AddPage(); $pdf- EventTable($event); $pdf- Output(); 除了標題行之外,在 EventTable 方法中還有一個 foreach 循環,它將在每個比賽上進行迭代。圖 5 顯示了用于此用途的代碼。圖 5. 包含結果表的 PDF$fill 變量可通過切換來改變表中每行的顏色。優勝隊的名稱和得分用加粗、斜體字體表示,這樣可以清晰顯示它們。還需注意的是,字體從標題的 Arial 字體更改成了顯示比賽內容所用的 Times 字體。要完成示例代碼,則需要添加一些圖形。使用圖形進行修飾向 PDF 添加圖像非常容易。首先需要從 Web 抓取一個圖像。我抓取了一個旱滑參賽隊的徽標,并將其存儲為 PNG 格式的圖像。 此后,我一直使用 清單 8 中的新代碼。清單 8. 添加徽標圖像define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');require( 'fpdf.php' );require( 'getresults.php' );class PDF extends FPDFfunction EventTable($event) $this- Image('logo.png',5,5,33); $this- SetXY( 40, 15 ); $this- SetFont('','B','24'); $this- Cell(40,10,$event['name'],15); $this- Ln(); $this- SetXY( 10, 45 ); $this- SetFont('','B','10'); $this- SetFillColor(128,128,128); $this- SetTextColor(255); $this- SetDrawColor(92,92,92); $this- SetLineWidth(.3); $this- Cell(70,7,"Team 1",1,0,'C',true); $this- Cell(20,7,"Score 1",1,0,'C',true); $this- Cell(70,7,"Team 2",1,0,'C',true); $this- Cell(20,7,"Score 2",1,0,'C',true); $this- Ln(); $this- SetFillColor(224,235,255); $this- SetTextColor(0); $this- SetFont(''); $fill = false; foreach($event['games'] as $game) $this- SetFont('Times',((int)$game['score1'] (int)$game['score2']) 'BI':''); $this- Cell(70,6,$game['team1'],'LR',0,'L',$fill); $this- Cell(20,6,$game['score1'],'LR',0,'R',$fill); $this- SetFont('Times',((int)$game['score1'] (int)$game['score2']) 'BI':''); $this- Cell(70,6,$game['team2'],'LR',0,'L',$fill); $this- Cell(20,6,$game['score2'],'LR',0,'R',$fill); $this- Ln(); $fill =! $fill; $this- Cell(180,0,'','T');$pdf = new PDF();$pdf- SetFont('Arial','',10);foreach( getResults() as $event ) { $pdf- AddPage(); $pdf- EventTable($event); $pdf- Output();清單 8中的關鍵方法是 Image 方法,它為圖像、位置和寬度選取一個文件名稱。所有其它參數都是可選的,因此您只指定您想要的信息便可。到 SetXY 的一些新調用會將文本和表左右移動到適當的位置,防止其覆蓋圖像。圖 6 顯示了這段腳本的輸出結果。圖 6. 帶有徽標圖像的已完成的 PDF該 PDF 庫還提供了其他方法來呈現圖形、添加流文本、添加超鏈接、管理頁邊距和方向等結構,您可以完全控制您的 PDF 文件。結束語
使用合適的工具,通過 PHP 構建 PDF 文件是非常容易的。這種方法非常適用于打印發x票或票據,或填寫表單,以及需要嚴格控制內容布局的任何項目。
PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97香蕉超级碰碰久久免费软件| 国产在线视频2019最新视频| 精品国产乱码久久久久久虫虫漫画| 日韩成人高清在线| 成人免费视频在线观看超级碰| 川上优av一区二区线观看| 夜夜嗨av一区二区三区四区| 日韩美女av在线| 伊人久久久久久久久久久久久| 在线观看精品自拍私拍| 国产精品偷伦免费视频观看的| 欧美最猛性xxxxx亚洲精品| 91国自产精品中文字幕亚洲| 国产精品久久久久av| 欧美成人精品在线观看| 久久精品亚洲精品| zzjj国产精品一区二区| 国产精品1区2区在线观看| 国产精品狠色婷| 亚洲精品www久久久久久广东| 欧美亚洲国产成人精品| 中文字幕九色91在线| 成人精品aaaa网站| 午夜精品一区二区三区在线| 九九热精品在线| 欧美午夜精品久久久久久浪潮| 亚洲欧洲美洲在线综合| 国产一区二区三区高清在线观看| 国产精品综合网站| 亚洲成人1234| 欧美人与性动交| 亚洲欧洲免费视频| 亚洲综合小说区| 精品视频在线播放| 日本久久久a级免费| 性欧美视频videos6一9| 国精产品一区一区三区有限在线| 亚洲国产精品高清久久久| 久久精品视频在线| 欧美精品www在线观看| 久久久噜噜噜久久中文字免| 久久精品视频在线| 欧美精品精品精品精品免费| 欧美极度另类性三渗透| 国产成人久久精品| 中文字幕亚洲国产| 日韩美女免费线视频| 国产精品视频一区二区三区四| 亚洲人成绝费网站色www| 国产原创欧美精品| 亚洲欧美国产视频| 国产精品久久激情| 中文字幕亚洲欧美日韩在线不卡| 久久久亚洲国产| 亚洲精品国精品久久99热| 欧美在线免费看| 国产福利精品在线| 欧美第一淫aaasss性| 黄色成人av在线| 26uuu亚洲国产精品| 久久精品色欧美aⅴ一区二区| 亚洲深夜福利在线| 国产精品久久久久久亚洲调教| 日韩精品免费综合视频在线播放| 久久99精品视频一区97| 久久久久久网址| 57pao成人永久免费视频| 欧美老女人在线视频| 欧亚精品中文字幕| 日本精品视频在线观看| 午夜免费日韩视频| 国产精品扒开腿做爽爽爽男男| 欧美激情亚洲另类| 久久综合免费视频| 国产国语刺激对白av不卡| 欧美日韩国产在线| 国产丝袜一区二区三区| 欧洲日本亚洲国产区| 欧美日韩午夜激情| 96精品久久久久中文字幕| 最新国产精品亚洲| 欧美激情日韩图片| 国产成人在线一区二区| 亚洲色图在线观看| 57pao国产精品一区| 国产精品福利无圣光在线一区| 亚洲肉体裸体xxxx137| 日韩亚洲精品电影| 中文在线资源观看视频网站免费不卡| 91青草视频久久| 九九久久久久久久久激情| 国产精品专区h在线观看| 88国产精品欧美一区二区三区| 精品视频www| 日韩在线观看视频免费| 中文国产成人精品久久一| 久久久精品2019中文字幕神马| 色综合导航网站| 亚洲人成网站999久久久综合| 亚洲国产精品成人va在线观看| 亚洲最新在线视频| 美日韩精品免费视频| 亚洲自拍高清视频网站| 欧美激情乱人伦| 国产日韩欧美夫妻视频在线观看| 国产91成人video| 日本精品视频在线观看| 555www成人网| 日韩av理论片| 欧美日韩亚洲一区二区三区| 亚洲春色另类小说| 98午夜经典影视| 国产精品综合不卡av| 国产欧美精品xxxx另类| 欧美性精品220| 亚洲天堂男人天堂女人天堂| 国产免费一区二区三区香蕉精| 欧美日韩中文在线| 欧美午夜宅男影院在线观看| 91欧美精品午夜性色福利在线| 精品国产一区久久久| 亚洲国产中文字幕在线观看| 成人欧美在线视频| 国产成人在线视频| 亚洲网站在线观看| 国产精品永久免费| 久久激情视频免费观看| 欧美激情第99页| 欧美一级视频在线观看| 久久视频中文字幕| 久久精品一本久久99精品| 国产91在线播放九色快色| 亚洲第一视频网| 久久久久久91香蕉国产| 欧美日韩亚洲一区二| 精品一区二区三区三区| 日本韩国欧美精品大片卡二| 久久久精品在线观看| 欧美在线视频a| 国产精品普通话| 亚洲欧美日韩国产成人| 日本免费久久高清视频| 亚洲精美色品网站| 久久精品99久久久香蕉| 另类图片亚洲另类| 日韩中文字幕视频| 国产欧美精品一区二区三区介绍| 97视频在线观看播放| 中日韩午夜理伦电影免费| 大荫蒂欧美视频另类xxxx| 日韩精品中文字| 色综合久综合久久综合久鬼88| 97碰碰碰免费色视频| 国产精品自产拍高潮在线观看| 日韩亚洲国产中文字幕| 国产成人一区二区三区电影| 91精品一区二区| 91精品国产高清自在线看超| 国产成人福利夜色影视| 亚洲精品成人av| 欧美精品videosex牲欧美| 亚洲欧美日韩第一区| 亚洲欧美激情在线视频| 91av在线国产|