AI教程网 - 未来以来,拥抱AI;新手入门,从AI教程网开始......

PHP生成PDF——mpdf用法小结

html转化为pdf AI君 61℃

#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

作者:alexandsunny
原文链接:https://blog.csdn.net/alexandsunny/article/details/81457896

转载请注明:www.ainoob.cn » PHP生成PDF——mpdf用法小结

喜欢 (3)or分享 (0)