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

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

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()];}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 GPT-4o 释放完整能力前,听听实时多模态 AI 创业者的一手经验 | 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 5 月中旬 GPT-4o 的发布&#xff0c;让人与 AI 的交互&#xff0c;从对话框的文本交流加速推进…

去除uni微信小程序button的边框

想要去除button的边框&#xff0c;如下未去除边框时&#xff0c;非常影响观感。 解决方法 使用伪元素::after&#xff0c;简单但是易忘&#xff0c;正常情况下,我直接是给button上加上一个类名直接设置border&#xff1a;none&#xff0c;但是这样是无效的&#xff0c;应该如下…

前端canvas实现图片涂鸦(Vue2、Vue3都支持)

先看一下效果图吧 代码组成&#xff1a;画笔大小、颜色、工具按钮都是组件&#xff0c;通俗易懂&#xff0c;可以按照自己的需求调整。 主要代码App.vue <template><div class"page"><div class"main"><div id"canvas_panel&qu…

Codeforces Round 803 (Div. 2) C. 3SUM Closure (数学模拟 + 暴力枚举)

给你一个长度为 n 的数组 a 。如果对于所有不同的索引 i &#xff0c; j &#xff0c; k &#xff0c;和 aiajak 都是数组的元素&#xff0c;那么这个数组称为 3SUM 闭合数组。更正式地说&#xff0c;如果对于所有整数 1≤i<j<k≤n 存在某个整数 1≤l≤n 使得 aiajakal 是…

动态规划part01 Day41

动态规划算法解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 LC509斐波那契数 LC70爬楼梯 LC746使用最小花费爬楼梯 dp[]含义&#xff1a;爬到第i层楼梯的最小花费

梯度下降、反向传播、激活函数、参数初始化、批量归一化是深度学习中常用的几个概念

梯度下降、反向传播、激活函数、参数初始化、批量归一化是深度学习中常用的几个概念。下面我将对这些概念进行简要的凝练解释&#xff0c;并给出相应的例子。 梯度下降&#xff08;Gradient Descent&#xff09;: 原理: 通过迭代地调整参数&#xff0c;使得损失函数的值最小化…

B站尚硅谷git学习记录

文章目录 一、Git概述1.何为版本控制2.为什么需要版本控制3.版本控制工具 二、Git常用命令1.设置用户签名1.1 基本语法1.2 案例实操 2.初始化本地库2.1 基本语法2.2 案例实操 3.查看本地库状态3.1基本语法3.2 案例实操&#xff08;1&#xff09;首次查看&#xff08;工作区没有…

前端面试题01-11

面试题解答 1. ES5、ES6和ES2015有什么区别? ECMAScript是JavaScript的标准&#xff0c;每隔几年就会发布新的版本。ES5、ES6和ES2015都是这个标准的一部分。 ES5&#xff08;ECMAScript 5&#xff09;&#xff1a;发布于2009年&#xff0c;是对之前版本的重大更新&#xf…

TinyEngine 低代码引擎:带你5分钟高效构建游戏登录界面

本文由体验技术团队 TinyEngine 项目成员李旭宏创作&#xff0c;欢迎大家实操体验&#xff0c;本体验项目基于 TinyEngine 低代码引擎提供的环境&#xff0c;通过体验简单拖、拉、拽的形式帮助开发者快速了解低代码引擎的使用流程&#xff0c;达到快速开发游戏登录界面的效果。…

143.栈和队列:用队列实现栈(力扣)

题目描述 代码解决 class MyStack { public:queue<int> que; // 定义一个队列用于实现栈// 构造函数&#xff0c;初始化队列MyStack() {}// 向栈中推入元素 xvoid push(int x) {que.push(x); // 使用队列的 push 方法将元素 x 添加到队列尾部}// 从栈中弹出并返回栈顶元…

【MIT 6.5840(6.824)学习笔记】GFS

1 分布式存储系统难点 在设计大型分布式系统或存储系统时&#xff0c;初衷通常是为了获得显著的性能提升&#xff0c;通过数百台计算机的资源来并行完成大量工作。因此&#xff0c;性能问题成为最初的关注点。一个自然的想法是将数据分片&#xff08;Sharding&#xff09;&…

《数字图像处理》笔记/期末复习资料

目录 1 简述二值图像、灰度图像与彩色图像间的区别。 2 图像量化时&#xff0c;如果量化级比较小会出现什么现象&#xff1f;为什么&#xff1f; 3 图像增强的目的是什么&#xff1f; 4 什么是中值滤波&#xff0c;有何特点&#xff1f; 5 叙述高通滤波、低通滤波、带通滤…

区块链技术引领:Web3时代的新网络革命

随着区块链技术的快速发展和不断成熟&#xff0c;人们已经开始意识到它所带来的潜在影响&#xff0c;尤其是在构建一个更加去中心化、安全和透明的互联网时。这个新的互联网时代被称为Web3&#xff0c;它将不再受制于传统的中心化平台&#xff0c;而是更多地依赖于去中心化的网…

Rust最新版安装(v1.78.0+)

系统&#xff1a;Windows 11 专业版 23H2rustc&#xff1a;1.78.0 配置环境变量和设置配置文件 新建文件夹“C:\Rust\Rustup”和“C:\Rust\Cargo”。【以管理员身份运行】打开CMD 设置系统环境变量&#xff0c;如下设置RUSTUP_DIST_SERVER&#xff0c;其余同理 C:\Windows\S…

产线问题排查

CPU过高 使用top命令查看占用CPU过高的进程。 导出CPU占用高进程的线程栈。 jstack pid >> java.txt Java 内存过高的问题排查 1.分析OOM异常的原因&#xff0c;堆溢出&#xff1f;栈溢出&#xff1f;本地内存溢出&#xff1f; 2.如果是堆溢出&#xff0c;导出堆dump&…

前端大文件上传

首先&#xff0c;我们需要使用Blob对象的 slice 方法将文件切分成多个切片。 const CHUNK_SIZE 1024 * 1024; // 我们选择1MB作为每个切片的大小 let file document.getElementById("upload").files[0]; // 得到所选文件 let totalSize file.size; let chunks […

Golang | Leetcode Golang题解之第103题二叉树的锯齿形层序遍历

题目&#xff1a; 题解&#xff1a; func zigzagLevelOrder(root *TreeNode) (ans [][]int) {if root nil {return}queue : []*TreeNode{root}for level : 0; len(queue) > 0; level {vals : []int{}q : queuequeue nilfor _, node : range q {vals append(vals, node.V…

什么是CSTP测试认证,如何通过CSTP认证?

什么是CSTP测试认证&#xff1f; CSTP&#xff08;Certified Software Test Professional&#xff09;认证是由国际软件测试认证委员会&#xff08;International Software Testing Qualifications Board, ISTQB&#xff09;制定的一种专业软件测试认证。该认证旨在提高软件测…

Java中获取运行时资源

Java中获取运行时资源 在Java中&#xff0c;将运行时资源&#xff08;如配置文件、图片、模板文件等&#xff09;放在类路径&#xff08;classpath&#xff09;中的某个位置。 使用getResource()方法 URL resourceUrl getClass().getClassLoader().getResource("confi…

C#算法(15)—求四边形的外接矩形

前言 在上位机软件开发的过程中,我们经常需要一个四边形的外接矩形,这个外接矩形通常有两种一种是正外接矩形,一种是最小面积的最小外接矩形,最常见的应用是我们需要从一个四边形中截取一部分图像,然后对这个截取出来的图像进行处理,下面分别介绍这两种外接矩形的求法 …