首先确保安装了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');
$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()];
yii2 mpdf下载pdf文件配合ZipArchive压缩的性能优化和采坑经验一、基本准备1. 环境配置:2. 前提条件3. 业务需求4. 采坑点及业务难点二、业务过程1. 第一步:将每条数据根据视图文件渲染,生成一个pdf文件,保存在服务器上2. 第二步:将生成好的pdf文件们,放入压缩包3. 视图层,执行回调函数,下载压缩文件
一、基本准备
1. 环境配置:
语言:PHP:7.0.9
服务器:Apache:2.4
框架:Yii2
2. 前提条件
项目里安装好mpdf插件,
可以使用composer
$mpdf = new mPDF();
$mpdf->SetWatermarkText('水印文字', 0.3);//水印文字,透明度
$mpdf->showWatermarkText = true; //开启水印
$mpdf->SetImportUse();
$pageCount = $mpdf->SetSourceFile('old.pdf'); //读取原始文件页数
for ($i=1; $i<=$pageCount; $i++) { //循环添加原始文件
php composer.phar require kartik-v/yii2-mpdf "*"
或者把"kartik-v/yii2-mpdf":"*" 加到composer.json文件的require段 执行 composer update
$pdf = new Pdf([
'mode' => Pdf::MODE_UTF8,
'form...
<?php
function water($r_img, $d_img='',$gzip=80,$str="www.verycd.com", $f_size=5, $pos=5,$f_color="#ff0000")
if(extension_loaded("gd") && file_exists($r_img))
$img_info= getimages