Mpdf生成pdf时,解决首行缩进与标点符号换行冲突的问题
问题描述
在将课文内容转换成pdf时,发现部分段落的首行缩进2个字符的样式消失了。
代码如下:
<?php
require_once __DIR__ . '/bootstrap.php';
$mpdf = new \Mpdf\Mpdf([
'mode' => '',
'format' => 'A4',
'autoLangToFont'=>true,
'autoScriptToLang'=>true
]);
$html = '
<p style="text-indent:2em;">在我家的阳台上,长着我的植物朋友——一株漂亮的宝石花。不管你从哪个角度看,它都是那么妩媚,那么动人,所以,我很喜欢它。</p>
<p style="text-indent:2em;">今年春天,我尝试着掐了一片宝石花的叶子,按照妈妈的话种在花盆中,果然又育出了一盆宝石花。如今,它已经结出了花骨朵。我想知道宝石花生命力顽强的原因,就在网上查了资料。宝石花生命力很旺盛,非常耐旱,连着几个星期不给它浇水,照样能够生长,这是因为它的每一片叶子就像一座“小水库”,水分都储藏在叶子里,预备干旱时用。</p>
';
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
效果如下:
问题分析与确认
查看有问题的几篇课文后,发现应该是跟标点符号换行的问题有关。
给第一段的正文新增几个字符后发现果然如此~
问题解决
这个插件的问题不好排查最终是哪里影响的,所以换了一种思维,不用html
的css
去控制,将首行n个字符提取出来,转换成n个全角空格,即可解决。
// 处理首行缩进
$html = preg_replace_callback('/<p style="(.*)text-indent:(\d+)em;(.*)">(.*)<\/p>/isU',function($matches){
if($matches[2]){
if($matches[1] || $matches[3]){
return '<p style="'.$matches[1].$matches[3].'">'.str_repeat(' ',$matches[2]).$matches[4].'</p>';
}else{
return '<p>'.str_repeat(' ',$matches[2]).$matches[4].'</p>';
}
}else{
return $matches[0];
}
}, $html);
最终看一下效果
本作品采用《CC 协议》,转载必须注明作者和本文链接