關於PHP操作PDF

語言: CN / TW / HK

theme: channing-cyan

最近在做一個電商的專案,某天專案經理突然甩過來一個PDF

“快按照這個模版,給客戶做個匯出訂單出庫單的功能”

"看到是PDF的模版,看看陌生的PHP(已經在JAVA道路上漸行漸遠),心裡有一瞬間萬念俱灰,不得已開始面向百度程式設計,在檢視諸多XXCSDN,XX書之後仍未獲得有效方案"

"兩天過後"

"終於看到今天的主人公 TCPDF"

先附上官網大大TCPDF

上實操

1. 毫無疑問,對於PHPER來說,安裝新的依賴,直接composer

//在你的composer.json檔案中新增依賴 "require": { "tecnickcom/tcpdf": "^6.2.13" }

然後

composer update

或者你可以在專案下執行

composer require tecnickcom/tcpdf

2.此時你專案中已經安裝好了TCPDF

``` // 一個最簡單的dmeo $pdf = new TCPDF(); // create TCPDF object with default constructor args $pdf->AddPage(); // pretty self-explanatory $pdf->Write(1, 'Hello world'); // 1 is line height

$pdf->Output('hello_world.pdf'); // send the file inline to the browser (default). ```

該demo可以用於檢測你安裝和引用是否成功

3.手把手專案實戰

1️⃣: 先上PDF

1648111723368.jpg

2️⃣: 分析PDF

  1. 我們通過截圖可以看出頁面含有一個公共的頁頭,而且還是一張公司logo圖.
  2. 頁面大體有三部分組成,兩個左右圖表,一些文字以及一張logo公章圖

3️⃣: 實操

``` //首先例項化PDF物件 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // create new PDF document $pdf->SetCreator('DimStar'); $pdf->SetAuthor('DimStar'); // $pdf->SetTitle('TCPDF Example 001'); // $pdf->SetSubject('TCPDF Tutorial'); // $pdf->SetKeywords('TCPDF, PDF, example, test, guide'); // $logo = dirname(FILE) ."/logo.jpg"; // set default header data //這裡著重說下頁頭的圖片是如何實現的,起初想著拿靜態資源中的一張圖代替PDF_HEADER_LOGO引數中但是實際發現無論是絕對路徑的圖片還是網路圖片地址都無法生效 //最終將logo圖與composer安裝的tcpdf檔案包中的tcpdf_logo.png檔案進行了替換 ///這裡只可以設定logo圖的寬,但其實高也會隨著寬進行等比例的縮放 $pdf->SetHeaderData(PDF_HEADER_LOGO, 40, '', '', array(0,64,255), array(0,64,128)); $pdf->setFooterData(array(0,64,0), array(0,64,128));

    // set header and footer fonts

// $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    // set margins

// $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); // $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

    // set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

    // set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

    $pdf->SetFont('stsongstdlight', '', 12, '', true);

    // Add a page
    // This method has several options, check the source code documentation for more information.
    $pdf->AddPage();
    //組裝訂單資料
    $sumCN = CommonUtil::convertAmountToCn($order['pay_price'],0);
    $table = "";
    foreach ($cartInfo as $k => $v){
        $price = $order['disCountStatus'] == 2 ? $v['cart_info']['vip_truePrice'] : $v['cart_info']['truePrice'];
        $sum = bcmul($price, $v['cart_info']['cart_num'],2);
        $table .= '<tr>
        <td>' . $v['cart_info']['productInfo']['product_code'] . '</td>
        <td colspan="2">' . $v['cart_info']['productInfo']['store_name'] . '</td>
        <td>' . $v['cart_info']['productInfo']['attrInfo']['suk'] . '</td>
        <td>' . $v['cart_info']['productInfo']['unit_name'] . '</td>
        <td>' . $v['cart_info']['cart_num'] . '</td>
        <td>' .  $price . '</td>
        <td>' . $sum .'</td>
    </tr>';
    }
    //不足6條資料進行補充防止頁面不夠長,章蓋在空白處
    if(count($cartInfo) < 6){
        for ($i = count($cartInfo); $i <6; $i++){
            $table .= '<tr>
                <td></td>
                <td colspan="2"></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>';
        }
    }
    $startTime = date("Y/m/d");
    $endTime = date("Y/m/d",time() + 31536000);
    //這裡說下用的是最最最最基礎的table佈局編寫的html,為什麼要用這種方式編寫html呢?因為tcpdf支援的css太低階了,唯有接觸table佈局才能實現我們想要的樣式
    $html = <<<EOD

銷 售 合 同

供方: 深圳逗點生物技術有限公司 合同編號: {$contractNumber}
需方: {$userInfo['real_name']}
一、產品名稱、數量、金額:
{$table}
產品編碼 產品名稱 包裝規格 規格型號 數量 含稅單價 價稅合計
合計: {$order['pay_price']} 人民幣大寫: {$sumCN}
備註: {$order['remark']}
二、質量要求:產品技術引數符合需方訂貨的要求。產品質量根據提供客戶的說明書為標準。由運輸造成的破損, 由供方承擔。
三、運輸方式及費用負擔:採用快遞運輸,費用由供方負擔。
四、包裝標準:外包裝為普通紙箱。
五、付款方式及發票:轉賬,款到發貨。供方提供13%增值稅銷售發票。
六、本合同在履行過程中發生爭議,雙方當事人協商解決。
七、本合同一式兩份,供方需方各一份。本合同傳真件同樣有效。
供 方
單位名稱: 深圳逗點生物技術有限公司
單位地址: 深圳市龍崗區布吉街道甘李六路12號中海信創新 產業城12棟1樓
委託代理人: {$sale}
電話: 0755-25498787
傳真: 深圳逗點生物技術有限公司
公司賬號: 44201595600052506437
開戶銀行: 中國建設銀行深圳東湖支行
戶名: 深圳逗點生物技術有限公司
需 方
單位名稱: {$userInfo['real_name']}
單位地址: {$userInfo['f_biz_address']}
委託代理人: {$userInfo['f_contact']}
行動電話: {$userInfo['f_mobile']}
固定電話:
郵編:
傳真:
合同有效期: {$startTime} 至 {$endTime}

EOD; //這裡其實就是蓋那個章哦,這個地方要使用網路路徑 $pdf->Image($site_url .'/uploads/1.png', 30, 180, 75, 75, 'PNG', '', '', true, 150, '', false, false, 1, false, false, false);

// output the HTML content
$pdf->writeHTML($html, true, false, true, false, '');
// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output($name, 'F');

```

總結

到這裡基本上就已經實現通過tcpdf從0匯出較複雜的PDF.

「其他文章」