php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案

简介: php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案

关于mPDF

mPDF是一个PHP类库,它由UTF-8编码的HTML生成PDF文件。


为什么要引入mPDF?

1.需要将HTML文档生成pdf供客户端下载或预览;

2.前端可以直接使用html2canvas,JS前端插件。html2canvas实际上是截图,即将前端页面截图成为图片然后保存为pdf,文档中的文字无法复制,且在支持自动分页,大数据量的情况下,使用不佳;

3.mPDF,支持从服务器端渲染,按照需求在客户端进行预览、下载等设置;


开发实践

版本

Software: mPDF, Unicode-HTML Free PDF generator *

Version: 6.0

安装

使用composer安装;或者直接将mPDF项目包全部拷贝至资源引入目录,此处不再赘述。

调用

/*打印PDF详情页
* $url, 域名;
* $pro_id, 项目Id;
* $pro_types,机构类型;
* $waterMark,水印文字;
* $pro_serial,项目编号;
*/
function printPdf($url, $pro_id, $pro_types, $waterMark, $pro_serial)
{
    require_once("libs/mpdf/mpdf.php");
    $mpdf = new mPDF('utf-8', 'A4', '', '宋体', 0, 0, 20, 10);
    //添加水印;
    $mpdf->SetWatermarkText($waterMark, 0.1);//水印文字,透明度
    $mpdf->showWatermarkText = true; //开启水印
    if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $waterMark, $match)) {
        $mpdf->watermark_font = 'GB';
    }
    //获取内容;
    $mpdf->useAdobeCJK = true;
    $html = file_get_contents($url . '?m=Surveyor&a=surveyorDetail&act=detail&pro_id=' . $pro_id . '&pro_types=' . $pro_types);
    //设置PDF页脚内容
    $footer = '<table width="100%" style="vertical-align: bottom; font-size: 9pt; color: #000;"><tr style="height:30px"></tr><tr><td width="10%"></td><td width="80%" align="center" style="font-size:14px;color:#000"></td><td width="10%" style="font-size:14px;color:#000;">页码: {PAGENO} / {nb}</td></tr></table>';
    //添加页眉和页脚到pdf中
    $mpdf->SetHTMLFooter($footer);
    //设置pdf显示方式
    $mpdf->SetDisplayMode('fullpage');
    //创建pdf文件
    $mpdf->WriteHTML($html);
    //输出pdf
    $mpdf->Output($pro_serial . '.pdf', 'I');//'D';下载模式
    exit;
}

实例化

$mpdf = new mPDF('utf-8', 'A4', '', '宋体', 0, 0, 20, 10);

‘utf-8’,指语言编码。在config_lang2fonts.php中找到对应的代码,选择的语言不同默认的字体也是不同的,这里我们默认的是宋体。

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

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

文档内容获取

为避免在php封装函数中涉及大量的HTML混合文本,在项目使用应用中,采用file_get_contents函数,获取需要生成PDF文档的网页版详情页,然后将mPDF的类调用进行二次封装。

 $html = file_get_contents($url . '?m=Surveyor&a=surveyorDetail&act=detail&pro_id=' . $pro_id . '&pro_types=' . $pro_types);

水印文字

    //添加水印;
    $mpdf->SetWatermarkText($waterMark, 0.1);//水印文字,透明度
    $mpdf->showWatermarkText = true; //开启水印
    if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $waterMark, $match)) {
        $mpdf->watermark_font = 'GB';
    }

输出模式配置

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

填坑实录

为了便于排版,项目初期采用table表格进行排版。一是为了配合word文档的排版模式,而是表格的排版也是简单实用。

  <table align="center" border="1" cellpadding="0" width="90%">
            <tr>
                <td colspan="4" class="title_td">机构信息</td>
            </tr>
            <tr>
                <td align="center" width="30%" class="evenTd">机构名称</td>
                <td colspan="3" align="center">{$data1["agency_name"]}</td>
            </tr>
            <tr>
                <td align="center" class="evenTd">机构负责人</td>
                <td colspan="3" align="center">{$data1["agency_contact"]}</td>
            </tr>
            <tr>
                <td align="center" class="evenTd">联系方式</td>
                <td colspan="3" align="center">{$data1["agency_phone"]}</td>
            </tr>
            <tr>
                <td align="center" class="evenTd">机构地址</td>
                <td colspan="3" align="center">{$data1["agency_address"]}</td>
            </tr>
            <tr>
                <td align="center" class="evenTd">机构级别</td>
                <td colspan="3" align="center">{$data1["agency_level"]}</td>
            </tr>
        </table>

当表格中的字符串太长时,文本字体会变小,且不会自动分页



  • 方案1
<table style="overflow: wrap">
  • 方案2
$mpdf->shrink_tables_to_fit=0
<table autosize="1">
  • 方案3
    方案1,2,在调试多次后,无效。从各种文档信息来看,主要是table自动适应的过程无法自动判断,需要增加分页标识符。但是这样的操作无形中是增加了客户端用户的操作步骤,并且让用户使用标准的分页标识符,是一种强人所难的行为。
 <div style="width: 89.5%;border: 1px solid #000;margin:0 auto;text-align: left;font-size:16px;overflow: wrap;">
  <div style="float: left;display: inline;width: 15%;" class="evenTd">传承脉络</div>
  <div style="float: left;display: inline;width: 85%;">{$data3["pro_vein"]}</div>
</div>

换成div的排版,成功解决。


@lockdata.cn

相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
9天前
|
PHP
在PHP中,字符串操作
在PHP中,字符串操作
18 3
|
10天前
|
自然语言处理 安全 PHP
深入浅出PHP编程:从基础到实战
【10月更文挑战第36天】本文将带你走进PHP的奇妙世界,无论你是初学者还是有一定经验的开发者,都将从中获益。文章首先介绍PHP的基础概念和语法,然后通过实际代码示例,展示如何利用PHP进行高效的Web开发。最后,我们将探讨一些高级主题,如面向对象编程、数据库操作以及安全性问题。让我们一起开启PHP的学习之旅吧!
|
11天前
|
存储 Serverless PHP
PHP编程入门:从基础到实战
【10月更文挑战第35天】本文将带你走进PHP的世界,从最基本的语法开始,逐步深入到实际应用。我们将通过简单易懂的语言和实际代码示例,让你快速掌握PHP编程的基础知识。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到你需要的内容。让我们一起探索PHP的魅力吧!
|
10天前
|
PHP
06 一文带你搞定PHP字符串操作
路老师带你深入PHP:本文详细介绍了PHP中的字符串定义、操作及常用函数,包括字符串的定义方式、定界符、字符串操作(如去除空格、获取长度、截取、替换、分割和合成等)。通过实例讲解,帮助你快速掌握PHP字符串处理技巧。
18 2
|
10天前
|
前端开发 PHP
10 PHP结合bootstrap完成分页
路老师分享了如何使用PHP实现CSDN问答列表的分页功能。首先,通过编写 `index.php` 文件,定义数据和分页逻辑。接着,安装 Composer 并配置 PHP 包管理工具,以引入 `jasongrimes/paginator` 分页插件。最后,展示分页效果并确保代码路径正确。下篇将介绍 PHP 和 Web 页面的交互。
18 0
|
13天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
23天前
|
存储 Java PHP
PHP编程之旅:从基础到实战
【10月更文挑战第23天】本文将带你走进PHP的世界,探索这个流行的服务器端脚本语言的魅力。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和实用的代码示例。我们将从PHP的基本概念开始,然后深入到实际应用中,最后通过一个实战项目来巩固所学知识。让我们一起开启这段激动人心的PHP编程之旅吧!
21 0
|
1月前
|
云安全 存储 小程序
PHP微信小程序解决方案PhpMall
PHP微信小程序解决方案PhpMall
39 0
|
2月前
|
XML SQL PHP
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。