#mpdf使用小结
最近需要在TP5上实现一个生成pdf并且提供下载的功能。之前没有接触过,在网上查到mpdf好像很好用,所以就着手尝试。文档是英文的,没有中文的好接受,而且网上的资料也比较少,故分享一下~


版本问题和mpdf文件修改问题

mpdf我用的6.0版本,之前在网上搜到的版本,有兴趣的小伙伴可以直接在Github上最新的版本。
在我使用的mpdf中,实例化采用的是类调用同名方法的形式,这在高版本或者一些框架下会报错,建议将类的同名方法改为构造方法__construct()


1.实例化及输出

Vendor('mpdf.mpdf');
$mpdf=new \mPDF('zh-CN','A4','','', 20,20,20,20);

zh-CN所指的是语言我们可以在config_lang2fonts.php中找到对应的代码
我们选择的语言不同默认的字体也是不同的,这里我们默认的是宋体。

  CASE "zh":  CASE "zho":    // Chinese
if ($country == "HK" || $country == "TW") { if ($adobeCJK) { $unifont = "gb"; }else { $unifont = "sun-exta"; }
}
else if ($country == "CN") { if ($adobeCJK) { $unifont = "sun-exta"; }else { $unifont = "sun-exta"; }
}else { if ($adobeCJK) { $unifont = "gb"; }else { $unifont = "sun-exta"; }
}
break;

第二个参数A4是纸张的大小,默认是竖版,可以设置为A4-L变成横板。当然除了A4还有其它很多纸张的尺寸。

后四个参数分别是margin-left,margin-right,margin-top,margin-bottom。它们是指每一页的内容距离页面边界的距离,我们可以通过调节它们,空出页眉、页脚以及一些有边框的背景图片。

$mpdf->Output($filename,$type);
//$type='I';在线预览模式
//$type='D';下载模式
//$type='f';生成后保存到服务器
//$type='s';返回字符串,此模式下$filename会被忽视

第一个参数是文件的名字,可以由我们来设置
第二个参数是我们输出的方式,有四种。

如果时选择了$type='f'文件将默认保存在项目的根目录下。
我们可以看一下mpdf.php文件

case 'F':$f=fopen($name,'wb');if(!$f) $this->Error('Unable to create output file: '.$name);fwrite($f,$this->buffer,strlen($this->buffer));fclose($f);break;

我们先会在默认目录下创建或打开一个名为$name的文件,再向其中写入内容。
如果想修改目录位置,在名字前直接加"/"
如果要想上,需要加"…/"先去上层目录。
例如,'../../11/'就会在上上层下的11文件夹下出现


2.写入正文以及设置页眉页脚

mpdf生成的PDF中所展现的所有内容几乎都是用HTML和CSS实现的
生成PDF中的正文:
$mpdf->WriteHTML($html); //$html是写好的界面用单引号括起来
同理,页眉页脚也是如此:
$mpdf->SetHeader($header);
$mpdf->SetFooter($footer);

//这是一个页脚的范例{PAGENO}是当前的页数,{nb}是总共的页数
<table class="footer"><tr><td width="65%"></td><td width="35%" style="text-align: right;font-size: 10pt;">第 {PAGENO} 页&nbsp;&nbsp;&nbsp;&nbsp;Page {PAGENO} </td>'.'</tr>
</table>

3.页面背景图片以及格式设置

mpdf支持很多CSS样式,其中就包括@page我们可以通过它对每一个页面进行设置。
设置背景图片,奇怪的是要求我的背景图片尺寸为798px*1125px,这样的才不会模糊或者超出,如果遇到相同情况可以参考一下。

@page diver{background: url(/public/static/PDF/test.png) center; background-size: cover;odd-header-name: html_myHeader;even-header-name: html_myHeader; odd-footer-name: html_myFooter;even-footer-name: html_myFooter;margin-bottom:60px;margin-top:80px;margin-right:79px;margin-left:80px; }

我们可以在@page里面设置我们想要的页眉和页脚(奇数和偶数页可以不一样)下面是页脚的范例:

<htmlpagefooter name="myFooter" style="display:none"><table class="footer"><tr><td width="65%"></td><td width="35%" style="text-align: right;font-size: 10pt;">第 {PAGENO} 页&nbsp;&nbsp;&nbsp;&nbsp;Page {PAGENO} </td>'.'</tr></table>
</htmlpagefooter>

如果不需要我们可以这样设置:odd-header-name: _blank;

我们也可以在@page里重新设置margin的距离。

关于如何调用@page:
<div style="page:diver">就可以了


4.字体设置

mpdf手册上有关于字体设置的讲解,但还是遇到了不少坑。

步骤一:下载字体文件,ttf或者ttc文件
将字体文件放到ttfont文件夹里(中文命名的文件最好把中文改掉,否则后面可能会找不到)

步骤二:设置config_fonts.php文件
我们按照如下格式添加字体,不同的键对应的时不同情况下显现的字体

//"dejavuserif"就是我们的font-family属性
"dejavuserif" => array('R' => "DejaVuSerif.ttf",//regular平常字体'B' => "DejaVuSerif-Bold.ttf",//加粗时显现字体'I' => "DejaVuSerif-Italic.ttf",//斜体时显现字体'BI' => "DejaVuSerif-BoldItalic.ttf",//斜粗时显现),

举个例子:

//此时我们用的字体就是DejaVuSerif-Bold.ttf中的字体
font-family:"dejavuserif";
font-weight:bold;//注意mpdf只支持nomal和bold,不支持数字

步骤三:在html中设置font-family

h1 {font-size: 20pt;font-family:sun-exta;
}

如果到现在为止你能顺利的完成字体的设置,那恭喜你你很幸运

问题一:字体就在文件夹里,但就是报错显示找不到TTF文件
mPDF Error - cannot find TTF TrueType font file
解决办法:修改mpdf.php(主文件)中MPDF的路径
可以试试我这样修改

$absolute_path=str_replace('mpdf.php', '', __FILE__);
if (!defined('_MPDF_PATH')) define('_MPDF_PATH', $absolute_path);

问题二:都设置完了,发现字体也没有被修改(中文字体修改问题)
解决办法:$mpdf ->autoLangToFont = true;//如果你写了一定要把它删掉!!
方法很简单,但不是很好发现。

注:
当初是因为生成pdf并下载后,并应该加粗的字体没有加粗,想用换字体的方法解决这个问题,才开始看如何换字体的。
现在仔细想想,在系统默认的CJK字体里并没有加粗时字体的ttf文件,而在后来的尝试中发现英文是可以加粗的,所以推测是字体的原因导致无法加粗显示。
希望指正。


5.水印设置

mpdf的水印设置真的很简单方便

//文字水印
$mpdf->SetWatermarkText('水印',0.1);//参数一是文字,参数二是透明度
$mpdf->showWatermarkText = true;$mpdf->SetWatermarkImage(url,0.1);//参数一是图片的位置,参数二是透明度
$mpdf->showWatermarkImage = true;

6.CSS

css支持
mpdf很好的支持了大部分的CSS样式,我们可以在这里查看。

外部css
①我们可以使用link标签引用外部css
<link rel="stylesheet" type="text/css" href="theme.css" />
②我们可以把写入mode设为css模式,然后引入外部css文件

$stylesheet = file_get_contents('style.css');
$mpdf->WriteHTML($stylesheet,1);
//$mode=1,Use this when you want to set a CSS stylesheet

我遇到的不支持样式
实现文字自动换行(长英文):
word-wrap:break-word;
前面提到的加粗(部分支持):
font-weight


7.增加分页

mpdf分页函数:
当需要更改分页之后的设置时推荐使用(语言、尺寸……)

AddPage();
AddPageByArray();//官方推荐

写在html中的标签:
<pagebreak>我们可以使用这个标签在html中进行分页
它有一个比较有用的属性 resetpagenum=1我们可以重置当前页页码为1
当然在这里也可以更改诸多设置,详情查看手册。

此外
与上面对应的还有一对函数和标签

TOCpagebreak();
TOCpagebreakByArray();
<tocpagebreak>

TOC是指table of contents,目录。我这次没有使它,有一个原因是不知道为什么会多出一页空白页,而且没有生成目录的需求,用pagebreak足以。
如果有研究了的小伙伴望交流一二。


8.参考

mpdf手册
mpdf_example

PHP生成PDF——mpdf用法小结相关推荐

  1. PHP生成PDF Mpdf扩展

    官网:showWatermarkText – mPDF Variables – mPDF ManualmPDF is a PHP library which generates PDF files f ...

  2. php 生成PDF的方法之一 --mpdf使用

    mpdf的下载地址:https://files-cdn.cnblogs.com/files/wlphp/mpdf.rar 大概写法: /*** 生成PDF文件*/public function gen ...

  3. 使用mpdf生成pdf文件

    本文主要需求是将html页面转换为pdf文档 1.安装mpdf工具类 (composer方式) composer require mpdf/mpdf:8.0.3 2.控制器里调用 <?php/* ...

  4. PHP中使用mpdf导出PDF文件以及生成PDF的方法

    电子书内容介绍了关于PHP.核心技术.实践方面的内容,目前豆瓣.亚马逊.当当.京东等电子书综合评分为:7.1 PHP中使用mpdf 导出PDF文件的实现方法 mPDF是一个很强大的PDF生成库,能基本 ...

  5. php mpdf例子,yii2使用mpdf生成PDF文件

    ​​yii2里面带有生成PDF的插件,我们通过安装就可以使用. 参考地址:(​https://github.com/mpdf/mpdf) ​https://mpdf.github.io/ 通过comp ...

  6. 利用velocity模板以及itext生成pdf

    利用velocity模板以及itext生成pdf 我整理的源码:http://download.csdn.net/download/u012174571/8748897 首先是velocity的使用: ...

  7. python根据模板生成pdf文件_程序生成word与PDF文档的方法(python)

    程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用free ...

  8. Linux: chmod 和 chown用法小结

    chmod chmod指令是更改文件读写执行权限的. 文件权限可以通过ls -a或ll来看,在每个文件前有10个字符,第一个是d是文件夹,否则为一划.后面三组rwx,分别是读取,写入和执行的权限; 三 ...

  9. 生成的url无法显示_快速生成PDF文档~~

    官方文档:https://pypi.org/project/pdfkit/ 1.安装并配置环境 1)安装python-pdfkit:$ pip install pdfkit2)安装wkhtmltopd ...

最新文章

  1. nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
  2. NYOJ 203 三国志(Dijkstra+贪心)
  3. ado.net 插入一条数据
  4. 17款加速效率的CSS工具
  5. ASP.NET Core 管道再探
  6. jenkins未授权访问漏洞记录(端口:7001,80,8080,50000)
  7. ajax前端post请求json格式参数,前端js导出,参数以json格式发送post请求
  8. 基于JAVA+Servlet+JSP+MYSQL的旅游酒店机票预订管理系统
  9. poj 1459 Power Network 多源多汇网络流
  10. python库cloudmusic: 网易云爬虫解决方案,轻松获取你想要的数据。
  11. 让我来告诉你:大学计算机专业的学生应该去考什么证书.
  12. mysql 页大小_查找最佳页面大小
  13. PTA 4-4 查询水果价格
  14. CMD和AMD的区别
  15. 深造分布式 打败面试官 招式二 新手上路
  16. 深度揭秘 Promise 微任务和执行过程
  17. Haproxy+Keepalived+MySQL高可用均衡负载部署
  18. fabric QA
  19. 游戏模型外包-【精刚石数位】
  20. 【源码】YOLOv5云端API部署

热门文章

  1. 如何判断车与路边线距离_如何保持车身与边线距离在30cm以内?科二科三都要知道...
  2. 企业如何做好大数据项目的选型
  3. 地铁票务管理系统_地铁票务管理系统-.doc
  4. java中什么算是重载,java中什么是重载
  5. 2022年讲究高效办公,快来看看这些让你提高效率的软件
  6. 声音识别动画(上)-----矩形声音识别动画
  7. 用python基础知识绘制任意格数的棋盘进行五子棋游戏
  8. 从火灾演习中认识火灾以及火灾发生时如何确保消防设备的正常运行
  9. 安排,Mycat教程-分布式数据库中间件课程
  10. 《软件供应商手册:SBOM的生成和提供》解读