關於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.

「其他文章」