Yii 结合MPDF 给PDF文件添加多行水印

首先确保安装了mpdf扩展 composer require mpdf/mpdf

php 复制代码
public function createWaterPdf($file_path,$water_text)
    {
        date_default_timezone_set('PRC');
        ini_set('memory_limit', '6400M');
        ini_set('max_execution_time', '0');

        try{

            $mpdf = new Mpdf();
            $pageCount   = $mpdf->SetSourceFile($file_path); //读取原始文件页数
            $tplId       = $mpdf->ImportPage(1); //获取第一张信息
            $size        = $mpdf->getTemplateSize($tplId);
            $orientation = $size['orientation'] ?? 'P';

            //创建缓存文件夹
            $cachePath = Yii::$app->basePath.'/runtime/pdfwater';
            if (!is_dir($cachePath)) {
                mkdir($cachePath, 0777, true);
            }
            //第一步:创建水印背景图片
            $width  = ceil($size['width'] / 25.4 * 300); //换算成300分辨率对应的尺寸大小
            $height = ceil($size['height'] / 25.4 * 300);
            $image  = imagecreate($width, $height);
            $bg     = imagecolorallocate($image, 255, 255, 255);
            imagefill($image, 0, 0, $bg);

            imagepng($image,$cachePath.'/background.png');
            imagedestroy($image);

            //第二步:创建水印图片
            $image  = $cachePath . '/background.png';
            $info   = getimagesize($image);
            $imgExt = image_type_to_extension($info[2], false);  //获取文件后缀

            $fun = "imagecreatefrom{$imgExt}";
            $imgInfo = $fun($image);

            $fontFile  = Yii::$app->params['fontPath'] . '/simhei.ttf'; //字体文件名,必须要,需要下载对应的字体文件,放到指定的目录
            $fontSize  = 70; //字体尺寸
            $fontColor = ImageColorAllocate($imgInfo,0,0,0); //字体颜色,这里是黑色
            $textAngle = 30; //文字显示的角度,0表示水平显示

            $x_length = $info[0];
            $y_length = $info[1];

            $text_length = (mb_strlen($water_text) + 3)*0.833*70;
            //判断用多大的纸张
            if ($orientation == 'P') {
                $water_h = ceil($x_length/3)-100;
                $page_width = $size[0];
                $page_height = $size[1];
            } else {
                $water_h = ceil($y_length/3)-100;
                $page_width = $size[1];
                $page_height = $size[0];
            }
            if ($page_width > 900 || $page_width < 150 || $page_height > 1200 || $page_height < 150) return ['code'=>2,'msg'=>'文件尺寸不符合要求']; //此处不限制文件大小也行

            $water_w = $text_length * 1.732;
            if ($water_w < 1000) $water_w = 1000;
            //重复添加水印
            for ($x = 0; $x < $x_length; $x += $water_w) {
                for ($y = 0; $y < $y_length; $y += $water_h) {
                    imagefttext($imgInfo,$fontSize,$textAngle,$x,$y,$fontColor,realpath($fontFile),$water_text); //把文字覆盖到图片上
                }
            }

            $quality = 100;
            if($imgExt == 'png') $quality = 9;//输出质量,JPEG格式(0-100),PNG格式(0-9)
            $getImgInfo = "image{$imgExt}";
            $getImgInfo($imgInfo, $cachePath.'/watermark.png', $quality);

            imagedestroy($imgInfo);

            //第三步:开始添加水印操作
            $arrPage = [
                'sheet-size' => [$page_width,$page_height], //指定纸张大小
                'orientation' => $orientation, //指定纸张方向
            ];

            for($i=1; $i<=$pageCount; $i++){ //循环添加原始文件
                $mpdf->AddPageByArray($arrPage);
                $tplId = $mpdf->ImportPage($i);
                $mpdf->UseTemplate($tplId);

                //开始给pdf添加水印
                $mpdf->SetWatermarkImage($cachePath.'/watermark.png');
                $mpdf->showWatermarkImage = true;
            }

            $mpdf->Output($cachePath.'/watermask.pdf','F'); //新文件

           
        }catch (\Exception $e){
            return ['code'=>1,'msg'=>$e->getMessage()];
        }

    }
相关推荐
两个人的幸福12 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820715 天前
PHP 扩展——从入门到理解
php
鹏仔先生15 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下16 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip16 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
weixin_3975740916 天前
PDF复杂表格的1:1还原引擎:跨页表格自动拼接技术实战
大数据·人工智能·pdf
Metaphor69216 天前
使用 Python 将 PDF 转换为 HTML
python·pdf·html
2601_9618451516 天前
粉笔行测5000题电子版|pdf|解析
pdf·新媒体运营·github·个人开发·内容运营·规格说明书·极限编程