1.先安照路径放好如图。
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} 页 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} 页 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.参考
include("../mpdf.php");
$mpdf=new mPDF('zh-CN','A4','','',32,25,27,25,16,13);
// LOAD a stylesheet
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;