1.先安照路径放好如图。

页面导出PDF并打印,mPDF类 - 图1

1.实例化及输出

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

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

  1. CASE "zh": CASE "zho": // Chinese
  2. if ($country == "HK" || $country == "TW") {
  3. if ($adobeCJK) { $unifont = "gb"; }
  4. else { $unifont = "sun-exta"; }
  5. }
  6. else if ($country == "CN") {
  7. if ($adobeCJK) { $unifont = "sun-exta"; }
  8. else { $unifont = "sun-exta"; }
  9. }
  10. else {
  11. if ($adobeCJK) { $unifont = "gb"; }
  12. else { $unifont = "sun-exta"; }
  13. }
  14. break;

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

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

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

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

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

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

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

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

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

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

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

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

  1. @page diver{
  2. background: url(/public/static/PDF/test.png) center;
  3. background-size: cover;
  4. odd-header-name: html_myHeader;
  5. even-header-name: html_myHeader;
  6. odd-footer-name: html_myFooter;
  7. even-footer-name: html_myFooter;
  8. margin-bottom:60px;
  9. margin-top:80px;
  10. margin-right:79px;
  11. margin-left:80px;
  12. }

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

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

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

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

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

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

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

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

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

举个例子:

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

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

  1. h1 {
  2. font-size: 20pt;
  3. font-family:sun-exta;
  4. }

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

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

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

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

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

5.水印设置

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

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

6.CSS

css支持
mpdf很好的支持了大部分的CSS样式,我们可以在这里查看
外部css
①我们可以使用link标签引用外部css
<link rel="stylesheet" type="text/css" href="theme.css" />
②我们可以把写入mode设为css模式,然后引入外部css文件

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

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

7.增加分页

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

  1. AddPage();
  2. AddPageByArray();//官方推荐

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

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

  1. TOCpagebreak();
  2. TOCpagebreakByArray();
  3. <tocpagebreak>

TOC是指table of contents,目录。我这次没有使它,有一个原因是不知道为什么会多出一页空白页,而且没有生成目录的需求,用pagebreak足以。

8.参考

mpdf手册
mpdf_example

  1. include("../mpdf.php");
  2. $mpdf=new mPDF('zh-CN','A4','','',32,25,27,25,16,13);
  3. // LOAD a stylesheet
  4. $mpdf->WriteHTML($html);
  5. $mpdf->Output();
  6. exit;