Mpdf生成pdf时,解决首行缩进与标点符号换行冲突的问题

问题描述

在将课文内容转换成pdf时,发现部分段落的首行缩进2个字符的样式消失了。:worried:
代码如下:

<?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;

效果如下:

Mpdf生成pdf时,解决首行缩进与标点符号换行冲突的问题

问题分析与确认

查看有问题的几篇课文后,发现应该是跟标点符号换行的问题有关。
给第一段的正文新增几个字符后发现果然如此~

Mpdf生成pdf时,解决首行缩进与标点符号换行冲突的问题

问题解决

这个插件的问题不好排查最终是哪里影响的,所以换了一种思维,不用htmlcss去控制,将首行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);

最终看一下效果

Mpdf生成pdf时,解决首行缩进与标点符号换行冲突的问题

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!