mpdf html轉pdf

瀏覽:118 發布日期:2020/04/03 分類:技術分享 關鍵字: mpdf
mpdf html轉pdf
在線查看pdf ,下載pdf,保存pdf 至服務器
composer require mpdf/mpdf
2020-04-03 寫的
2020-04-04 發現PHPExcel的文章忘了寫保存至本地,同時發現文件名稱有可能存在中文名稱,那么pdf也有可能存在中文名,于是使用函數名稱mb_convert_encoding
2020-04-05 修改設置的fileName 以便支持中文的文件名稱<?php

/**
 *  +----------------------------------------------------------------------
 *  | ThinkPHP [ WE CAN DO IT JUST THINK ]
 *  +----------------------------------------------------------------------
 *  | Copyright (c) 2020 ahai574 All rights reserved.
 *  +----------------------------------------------------------------------
 *  | Licensed ( ++++ahai574++++ )
 *  +----------------------------------------------------------------------
 *  | Author: 阿海 <[email protected]>
 *  +----------------------------------------------------------------------
 *  將html---轉---pdf
 *  更多細節 如果需要自行參考手冊網站:https://mpdf.github.io/
 * 
 */

namespace app\common\library;

use Mpdf\Mpdf;

class PHPPdfLib
{
    /**
     * 文件保存名稱,不用寫后綴名稱
     * @param string
     */
    private $fileName = 'mpdf.pdf';

    /**
     * 每一頁的頁眉
     * eg:<div style='text-align:center;color:red;font-size:12px;'>我是頁眉</div>
     */
    private $header = "";

    /**
     * 每一頁的頁腳
     * eg:<div style='text-align:center;color:red;font-size:12px;'>我是頁腳</div>
     */
    private $footer = "";

    /**
     * 正文 --- html文本內容
     * 您可以設置CSS值page-break-before,以always | left | right用于任何塊級元素(P,DIV等)。
     * 這將強制分頁,但是請注意,所有封閉的(外部)塊元素都將被“關閉”,并且其特性將丟失。
     * 您可以設置CSS值page-break-inside到avoid任何塊元素。
     * mPDF會嘗試避免在塊內進行分頁,但這只能在最多2頁上使用,并且與表格自動調整大小或表格旋轉不兼容
     * eg:<style>div{font-size:30px;color:red}</style><h2 style='text-align:center'>阿海</h2><div>正文</div>主題
     * @param string
     */
    private $content = "";

    /**
     * null:在線查看[我本地查看亂碼-找到原因-不能使用其他網站的圖片鏈接[本地的相對地址或絕對地址均可],也就是圖片的文件必須在本地,不能跨域],
     * true:下載至本地[沒有問題], 
     * false:保存至服務器[沒有問題]
     * @param null|boolean
     */
    private $desc = null;

    /**
     * 保存至服務器的路徑
     */
    private $filePath = "";

    /**
     * 水印
     * ['path'=>'水印相對路徑即可 如runtime/.../**.png','text'=>'水印文本','alpha'=>'透明度,大于0小于等于1','size'=>'大小','pos'=>'位置','behind'=>'水印文字和水印圖片是否在內容后面']
     */
    private $water = [];

    /**
     * mpdf 的臨時文件目錄
     */
    private $tempdir = "";

    public function __construct($config = [])
    {
        isset($config['fileName']) && $this->fileName =  mb_convert_encoding($config['fileName'], 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');
        isset($config['content']) && $this->content = $config['content'];
        isset($config['header']) && $this->header = $config['header'];
        isset($config['footer']) && $this->footer = $config['footer'];
        isset($config['desc']) && $this->desc = $config['desc'];
        $this->water = (isset($config['water']) && is_array($config['water'])) ? array_merge(['path' => '', 'text' => '', 'alpha' => 0.9, 'size' => 'D', 'pos' => 'F', 'behind' => true], $config['water']) : [];
        $this->filePath = isset($config['filePath']) ? $config['filePath'] : "runtime/uploads/files/" . date("Y-m-d");
        //設置默認的臨時目錄
        $this->tempdir = isset($config['tempdir']) ? $config['tempdir'] : 'runtime/temp_pdf';
        //文件名去除后綴,強制文件后綴為pdf
        if (strripos($this->fileName, ".") !== false) {
            $this->fileName = substr($this->fileName, 0, strripos($this->fileName, ".")) . ".pdf";
        } else {
            $this->fileName .= ".pdf";
        }
    }

    /**
     * 設置html內容
     * @param $html html內容
     */
    public function setHtmlContent($html)
    {
        $this->content = $html;
    }

    /**
     * 下載pdf
     * @return empty|string
     */
    public function createServer()
    {
        try {
            //創建臨時文件目錄
            if (!file_exists($this->tempdir)) {
                    @mkdir($this->tempdir, 0777, true);
                }

                $mpdf = new Mpdf(['tempDir' => $this->tempdir]);

                //設置中文字體--亂碼解決
                $mpdf->autoScriptToLang = true;
                $mpdf->autoLangToFont = true;
                //您可以設置CSS值page-break-inside到avoid任何塊元素。mPDF會嘗試避免在塊內進行分頁,但這只能在最多2頁上使用,并且與表格自動調整大小或表格旋轉不兼容
                $mpdf->use_kwt = true;
                //頁眉
                $mpdf->SetHTMLHeader($this->header);

                //頁腳
                $mpdf->SetHTMLFooter($this->footer);

                //調試圖片不顯示時,可以使用--會報告錯誤原因
                // $mpdf->showImageErrors = true;

                //是否加水印
                if (is_array($this->water) && count($this->water) > 0) {
                    //watermarkImgBehind --- true:將水印圖像放置在頁面內容后面;false:將水印圖像放置在所有頁面內容的前面
                    $mpdf->watermarkImgBehind = $this->water['behind'];

                    //水印圖片
                    if (isset($this->water['path']) && !empty($this->water['path'])) {
                        $mpdf->showWatermarkImage = true;
                        $mpdf->SetWatermarkImage($this->water['path'], $this->water['alpha'], $this->water['size'], $this->water['pos']);
                    }

                    //水印文字
                    if (isset($this->water['text']) && !empty($this->water['text'])) {
                        $mpdf->showWatermarkText = true;
                        $mpdf->SetWatermarkText($this->water['text'],  $this->water['alpha']);
                    }
                }

                //記住一點,所有的參數設置必須在寫入內容之前。至于分頁建議在html代碼里面設置
                //您可以設置CSS值page-break-before,以always | left | right用于任何塊級元素(P,DIV等)。
                //這將強制分頁,但是請注意,所有封閉的(外部)塊元素都將被“關閉”,并且其特性將丟失。
                //WriteHTML第二個參數0:html內容+css樣式 1:css樣式,不編譯html代碼, 2:只編譯html內容,style包含的樣式原樣輸出 3:不編譯html代碼,4:將html代碼寫入到緩沖區
                $mpdf->WriteHTML($this->content, 0);

                //在線看---有bug---亂碼---直接展示在瀏覽器頁面 : 找到原因-- 不能使用其他網站的圖片鏈接,也就是圖片的文件必須在本地,不能跨域
                if (is_null($this->desc)) {          
                    $mpdf->Output();
                    exit;
                }

                //下載至本地
                if ($this->desc == true) {

                    $mpdf->Output($this->fileName, true);
                    exit;
                }

                //保存至服務器
                if ($this->desc == false) {
                    //創建保存文件的目錄--文件目錄
                    if (!file_exists($this->filePath)) {
                        // @mkdir($this->filePath, 0777, true);
                        @mkdir(iconv("UTF-8", "GBK", $this->filePath), 0777, true);
                    }
                    //如果文件已經存在,則以新建文件名稱--保存文件,避免覆蓋文件
                    if (file_exists($this->filePath . "/" . $this->fileName)) {
                        $this->fileName = substr($this->fileName, 0, strripos($this->fileName, ".")) . "_" . date("Y") . "_" . date("m") . "_" . date("d") . "_" . rand(0, 10000) . ".pdf";
                    }
                    $mpdf->Output($this->filePath . "/" . $this->fileName, false);
                    
                    return $this->filePath . "/" . $this->fileName;
                }
         
        } catch (\Mpdf\MpdfException $e) { 
            echo $e->getMessage();
            
        }


        
    }
}
最佳答案
評論( 相關
后面還有條評論,點擊查看>>
滚雪球理财骗局揭秘