亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程

 更新時(shí)間:2014年07月05日 10:43:44   投稿:junjie  
這篇文章主要介紹了PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程,本文用一個(gè)需求為引,詳細(xì)介紹每一步驟的做法,并配有大量圖片說(shuō)明,需要的朋友可以參考下

本文詳細(xì)介紹使用 PHP 動(dòng)態(tài)構(gòu)建 PDF 文件的整個(gè)過(guò)程。使用免費(fèi) PDF 庫(kù) (FPDF) 或 PDFLib-Lite 等開(kāi)源工具進(jìn)行實(shí)驗(yàn),并使用 PHP 代碼控制 PDF 內(nèi)容格式。

有時(shí)您需要準(zhǔn)確控制要打印的頁(yè)面的呈現(xiàn)方式。在這種情況下,HTML 就不再是最佳選擇了。PDF 文件使您能夠完全控制頁(yè)面的呈現(xiàn)方式,以及文本、圖形和圖像在頁(yè)面上的呈現(xiàn)方式。遺憾的是,用來(lái)構(gòu)建 PDF 文件的 API 不屬于 PHP 工具包的標(biāo)準(zhǔn)部件?,F(xiàn)在您需要提供一點(diǎn)幫助。

當(dāng)您在網(wǎng)絡(luò)上搜索,尋找對(duì) PHP 的 PDF 支持時(shí),您首先發(fā)現(xiàn)的可能是商業(yè) PDFLib 庫(kù)及其開(kāi)源版本 PDFLib-Lite。 這些都是很好的庫(kù),但是商業(yè)版本相當(dāng)昂貴。PDFLib 庫(kù)的精簡(jiǎn)版本庫(kù)僅作為原始版本分發(fā),當(dāng)您嘗試在托管環(huán)境下安裝精簡(jiǎn)版本時(shí),就會(huì)出現(xiàn)這個(gè)限制問(wèn)題。

另一種選擇是免費(fèi) PDF 庫(kù) (FPDF),它是本機(jī) PHP,無(wú)需要進(jìn)行任何編譯,是完全免費(fèi)的,因此,您不會(huì)像在未許可版本的 PDFLib 中那樣看到水印。這個(gè)免費(fèi)的 PDF 庫(kù)正是我在本文中會(huì)用到的庫(kù)。

我們將使用女子旱滑比賽的得分來(lái)演示動(dòng)態(tài)構(gòu)建 PDF 文件的過(guò)程。這些得分是從 Web 中獲得并被轉(zhuǎn)換成 XML。清單 1 顯示了一個(gè)示例 XML 數(shù)據(jù)文件。

清單 1. XML 數(shù)據(jù)

<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 的根元素是一個(gè) events 標(biāo)記。按事件對(duì)數(shù)據(jù)進(jìn)行分組,每個(gè)事件都包含多個(gè)比賽。在 events 標(biāo)記內(nèi),是一系列的 event 標(biāo)記,在這些標(biāo)記中有多個(gè) game 標(biāo)記。 這些 game 標(biāo)記中包含參加比賽的兩個(gè)隊(duì)的名稱以及他們?cè)诒荣愔械牡梅帧?/p>

清單 2 展示了用來(lái)讀取 XML 的 PHP 代碼。

<?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;
}
?>

這段腳本實(shí)現(xiàn)了一個(gè) getResults 函數(shù),以便將 XML 文件讀入 DOM 文檔。然后使用 DOM 調(diào)用遍歷所有 event 和 game 標(biāo)記,以構(gòu)建一個(gè)事件陣列。該數(shù)列內(nèi)的每個(gè)元素都是一個(gè)散列表,包含事件名稱和比賽項(xiàng)目的陣列。結(jié)構(gòu)基本上是 XML 結(jié)構(gòu)的內(nèi)存版。

為了測(cè)試這個(gè)腳本的作用,將構(gòu)建一個(gè) HTML 導(dǎo)出頁(yè)面,使用 getResults 函數(shù)讀取文件,然后以一系列 HTML 表的形式輸出數(shù)據(jù)。清單 3 顯示了該測(cè)試所用的 PHP 代碼。

清單 3. 結(jié)果 HTML 頁(yè)面


<?php
include_once('getresults.php');
$results = getResults();
foreach( $results as $event ) {
?>
<h1><?php echo( $event['name'] ) ?></h1>

<?php
foreach( $event['games'] as $game ) {
 $s1 = (int)$game['score1'];
 $s2 = (int)$game['score2'];
?>

<?php
}
?>
<table><tbody><tr>
 <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>
<?php
}
?>

通過(guò)代碼 getresults.php,XML 數(shù)據(jù)文件被上傳到 Web 服務(wù)器,您可以查看 HTML 結(jié)果,這與 圖 1 類似。
圖 1. HTML 格式的競(jìng)賽結(jié)果

在該結(jié)果中,對(duì)獲勝隊(duì)使用了粗體,以便查看哪支隊(duì)贏得了哪場(chǎng)比賽。

構(gòu)建 PDF

獲得數(shù)據(jù)之后,應(yīng)將重點(diǎn)放在構(gòu)建 PDF 文件上。第一步是下載 FPDF 庫(kù),然后將其安裝在與現(xiàn)有應(yīng)用文件集相同的目錄中。實(shí)際上,只要是在 PHP 庫(kù)路徑中,您可以將它安裝在任何您喜歡的地方。追蹤您放置字體目錄的地方,因?yàn)槟枰O(shè)置 ‘FPDF_FONTPATH',如 清單 4 所示。

清單 4. PDF Hello World

<?php
define('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();
?>

這段腳本實(shí)際上是一個(gè) “Hello World”,但采用的是 PDF 格式而不是 HTML。這段腳本執(zhí)行的第一個(gè)操作是使用 define 語(yǔ)句設(shè)置 FPDF 字體目錄的位置。然后使用 require 語(yǔ)句引入 FPDF 庫(kù)。這段腳本從該庫(kù)創(chuàng)建了一個(gè) FPDF 對(duì)象,設(shè)置字體,添加一個(gè)頁(yè)面,然后使用 Cell 方法將一些文本放在該頁(yè)面上,并輸出 PDF。

圖 2 展示了一切都正常情況下的結(jié)果。

圖 2. PDF 格式的 Hello World

如果沒(méi)有看到 PDF,那么您可能想在命令行運(yùn)行這段腳本,查看是否丟失了 fpdf.php 文件或者存在其他問(wèn)題。

既然 PDF 呈現(xiàn)正常,那么現(xiàn)在應(yīng)該將其與旱滑結(jié)果文件合并,并查看可以動(dòng)態(tài)生成哪些內(nèi)容。清單 5 展示了該合并操作的第一個(gè)版本。

清單 5. 顯示結(jié)果的首版 PDF

<?php
define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');

require( 'fpdf.php' );
require( 'getresults.php' );

class PDF extends FPDF
{
function 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();
?>

我們沒(méi)有從外部擴(kuò)展 FPDF 類別,而是使用我們自己的 PDF 子類來(lái)擴(kuò)展 FPDF 類別。在這些子類內(nèi),我們創(chuàng)建了一個(gè)名為 EventTable 的新方法,為給定事件構(gòu)建了一個(gè)結(jié)果表。在這種情況下,我們從小處著手,只輸出了事件名稱。該名稱位于腳本底部,包裝在 foreach 循環(huán)中,該腳本為每個(gè)事件添加一個(gè)頁(yè)面,然后調(diào)用 EventTable 方法。

可在 圖 3 中看到這段腳本的輸出。

圖 3. 動(dòng)態(tài) PDF 的第一個(gè)版本


向下滾動(dòng)頁(yè)面,以展示每個(gè)事件都在自己的頁(yè)面上。此處的下一步操作是開(kāi)始將結(jié)果添加到頁(yè)面。

構(gòu)建結(jié)果表

在構(gòu)建 PDF 文件時(shí),構(gòu)建無(wú)表結(jié)構(gòu)就像構(gòu)建 HTML 一樣簡(jiǎn)單。構(gòu)建表的方法是構(gòu)建許多寬度、字體、填充顏色、行顏色等各不相同的單元。

清單 6 展示了設(shè)置表的標(biāo)題欄的添加代碼。

清單 6. 添加結(jié)果表標(biāo)題

<?php
define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');

require( 'fpdf.php' );
require( 'getresults.php' );

class PDF extends FPDF
{
function 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();
?>

此處的添加代碼用于設(shè)置字體、顏色和行寬。然后它將呈現(xiàn)包含四個(gè)標(biāo)題列的幾個(gè)單元格。然后調(diào)用 Ln 方法(該方法與回車鍵等效)啟用一個(gè)新行。

在瀏覽器中查看這段腳本時(shí),可以看到類似 圖 4 的內(nèi)容。

圖 4. 包含表的標(biāo)題行的頁(yè)面

在 圖 4 中,標(biāo)題以白色文本呈現(xiàn)在灰色背景上。這種格式有助于將其與呈現(xiàn)在標(biāo)題下面的數(shù)據(jù)進(jìn)行區(qū)分。要呈現(xiàn)比賽結(jié)果,請(qǐng)?jiān)?清單 7 中添加以下代碼。

清單 7. 添加完整的結(jié)果表

<?php
define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');

require( 'fpdf.php' );
require( 'getresults.php' );

class PDF extends FPDF
{
function 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();
?>

除了標(biāo)題行之外,在 EventTable 方法中還有一個(gè) foreach 循環(huán),它將在每個(gè)比賽上進(jìn)行迭代。圖 5 顯示了用于此用途的代碼。

圖 5. 包含結(jié)果表的 PDF

$fill 變量可通過(guò)切換來(lái)改變表中每行的顏色。優(yōu)勝隊(duì)的名稱和得分用加粗、斜體字體表示,這樣可以清晰顯示它們。還需注意的是,字體從標(biāo)題的 Arial 字體更改成了顯示比賽內(nèi)容所用的 Times 字體。

要完成示例代碼,則需要添加一些圖形。

使用圖形進(jìn)行修飾

向 PDF 添加圖像非常容易。首先需要從 Web 抓取一個(gè)圖像。我抓取了一個(gè)旱滑參賽隊(duì)的徽標(biāo),并將其存儲(chǔ)為 PNG 格式的圖像。 此后,我一直使用 清單 8 中的新代碼。

清單 8. 添加徽標(biāo)圖像

<?php
define('FPDF_FONTPATH','/Library/WebServer/Documents/derby/font/');

require( 'fpdf.php' );
require( 'getresults.php' );

class PDF extends FPDF
{
function 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中的關(guān)鍵方法是 Image 方法,它為圖像、位置和寬度選取一個(gè)文件名稱。所有其它參數(shù)都是可選的,因此您只指定您想要的信息便可。

到 SetXY 的一些新調(diào)用會(huì)將文本和表左右移動(dòng)到適當(dāng)?shù)奈恢?,防止其覆蓋圖像。

圖 6 顯示了這段腳本的輸出結(jié)果。

圖 6. 帶有徽標(biāo)圖像的已完成的 PDF

該 PDF 庫(kù)還提供了其他方法來(lái)呈現(xiàn)圖形、添加流文本、添加超鏈接、管理頁(yè)邊距和方向等結(jié)構(gòu),您可以完全控制您的 PDF 文件。

結(jié)束語(yǔ)


使用合適的工具,通過(guò) PHP 構(gòu)建 PDF 文件是非常容易的。這種方法非常適用于打印發(fā)x票或票據(jù),或填寫(xiě)表單,以及需要嚴(yán)格控制內(nèi)容布局的任何項(xiàng)目。

相關(guān)文章

  • PHP正則表達(dá)式之捕獲組與非捕獲組

    PHP正則表達(dá)式之捕獲組與非捕獲組

    這篇文章主要介紹了PHP正則表達(dá)式之捕獲組與非捕獲組的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Laravel多域名下字段驗(yàn)證的方法

    Laravel多域名下字段驗(yàn)證的方法

    這篇文章主要給大家介紹了關(guān)于Laravel多域名下字段驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 簡(jiǎn)單談?wù)刾hp延遲靜態(tài)綁定

    簡(jiǎn)單談?wù)刾hp延遲靜態(tài)綁定

    php5.3是php5的一個(gè)里程碑,加入了大量新特性。本文主要給大家介紹了php5.3的一個(gè)新功能--延遲靜態(tài)綁定,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2016-01-01
  • ThinkPHP框架任意代碼執(zhí)行漏洞的利用及其修復(fù)方法

    ThinkPHP框架任意代碼執(zhí)行漏洞的利用及其修復(fù)方法

    這篇文章主要介紹了ThinkPHP框架任意代碼執(zhí)行漏洞的利用及其修復(fù)方法,該漏洞的修復(fù)對(duì)于廣大使用ThinkPHP的開(kāi)發(fā)人員來(lái)說(shuō)尤為重要!需要的朋友可以參考下
    2014-07-07
  • Laravel框架在本地虛擬機(jī)快速安裝的方法詳解

    Laravel框架在本地虛擬機(jī)快速安裝的方法詳解

    這篇文章主要介紹了Laravel框架在本地虛擬機(jī)快速安裝的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Laravel框架的安裝步驟、操作注意事項(xiàng),并附帶說(shuō)明了centos7環(huán)境下php7編譯安裝curl擴(kuò)展的具體操作步驟,需要的朋友可以參考下
    2018-06-06
  • php結(jié)合ajax實(shí)現(xiàn)手機(jī)發(fā)紅包的案例

    php結(jié)合ajax實(shí)現(xiàn)手機(jī)發(fā)紅包的案例

    發(fā)紅包功能,當(dāng)我們輸入紅包數(shù)量和總金額后,PHP會(huì)根據(jù)這兩個(gè)值進(jìn)行隨機(jī)分配每個(gè)金額,保證每個(gè)人都能領(lǐng)取到一個(gè)紅包,每個(gè)紅包金額不等,就是要求紅包金額要有差異,所有紅包金額總額應(yīng)該等于總金額。
    2016-10-10
  • 探討:array2xml和xml2array以及xml與array的互相轉(zhuǎn)化

    探討:array2xml和xml2array以及xml與array的互相轉(zhuǎn)化

    本篇文章是對(duì)array2xml和xml2array以及xml與array的互相轉(zhuǎn)化進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Symfony控制層深入詳解

    Symfony控制層深入詳解

    這篇文章主要介紹了Symfony控制層,結(jié)合大量實(shí)例代碼深入分析了Symfony控制器的常見(jiàn)使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-03-03
  • PHP三元運(yùn)算的2種寫(xiě)法代碼實(shí)例

    PHP三元運(yùn)算的2種寫(xiě)法代碼實(shí)例

    這篇文章主要介紹了PHP三元運(yùn)算的2種寫(xiě)法代碼實(shí)例,需要的朋友可以參考下
    2014-05-05
  • yii2 RBAC使用DbManager實(shí)現(xiàn)后臺(tái)權(quán)限判斷的方法

    yii2 RBAC使用DbManager實(shí)現(xiàn)后臺(tái)權(quán)限判斷的方法

    這篇文章主要介紹了yii2 RBAC使用DbManager實(shí)現(xiàn)后臺(tái)權(quán)限判斷的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Yii2權(quán)限控制的原理與相關(guān)技巧,需要的朋友可以參考下
    2016-07-07

最新評(píng)論