laravel 使用mpdf将html转化成pdf

2023-09-15 18:46:53
  • 安装方式
    composer require mpdf/mpdf

  • 常用配置

$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
// 获取默认的字体包文件路径
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
// 获取默认的字体包
$fontData = $defaultFontConfig['fontdata'];
$options = [ 
    'debug'=>true,
    'mode' => 'utf-8',
    'format' => 'A4',
    'useAdobeCJK' => true,
    'baseScript'=>1,
    'autoVietnamese'=>true,
    'autoArabic'=>true,
    'autoScriptToLang' => true,
    // 'autoLangToFont'   => true,
    'useSubstitutions' => true,
    'mgl' => 0,
    'mgr' => 0,
    'mgt' => 0,
    'mgb' => 0,
    'mgh' => 0,
    'mgf' => 0,
    'margin_left' => 10,
    'margin_right' => 10,
    'margin_top' => 10,
    'margin_bottom' => 16,
    'orientation' => 'P',
    // 'setAutoTopMargin' => 'stretch', 
    'setAutoBottomMargin' => 'stretch',
    'default_font_size' => 14,
	'fontDir' => array_merge($fontDirs, [
        public_path('ttf')
    ]),
    'fontdata' => $fontData + 
        [
            'customsongti' => [
                // 宋体
                'R' => 'songti.ttf'
            ],
            'customtimes'=>[
                // 新罗马斜体
                'R'=>'TimesNewRomanItalic.ttf'
            ]
        ],
    'default_font'=>'customsongti'
];

业务需求中,需要将部分文字和图片隐藏,但是需要保留对应的宽度到pdf上。

  1. 文字隐藏。将所有要隐藏的文字转换为span元素,增加一个类名,新建一个css文件,添加样式visibility: hidden !important;,通过WriteHTML($cssHtml, HTMLParserMode::HEADER_CSS)加载即可生效
  2. 图片隐藏。图片用上述方式一直不生效,后面尝试了直接把样式写到标签的style中生效了,style="visibility: hidden;height:0.1px;"。(这里是期望图片隐藏后空白内容的高度跟左右文字的高度一致,所以加入了height:0.1px,为什么设置0.1呢,因为设置0也不正常(时间太久,忘记是高度又撑起来还是别的问题了))
  3. 页面中的内容包含中文、英文、数字和变量,在数学学科中,变量需要显示为新罗马斜体,其他内容则用宋体,但是mpdf并不支持css中设置多字体的方法。故将所有的斜体的字母匹配出来,单独写样式。
// 匹配所有的斜体中的字母和数字
 $html = preg_replace_callback('/<span style="(.*)">(.*)<\/span>/isU',function($matches){
 			// 如果有斜体样式
            if(strpos($matches[1],'font-style:italic;') !== false){
                $text = $matches[2];
                // 要用新字体的字符
                $chars = ['a',  'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','A','B','C','D','E','F','G'.'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z','+','-','=','0','1','2','3','4','5','6','7','8','9'];
                // 匹配字符
                $preg = '/['.implode('',$chars).']+/isu';
                $text = preg_replace_callback($preg,function($matches){
                        $chars = $matches[0];
                        // 给指定的字符加样式类
                        return '<span class="mathChars">'.$chars.'</span>';
                },$text);
                // 原有的样式依旧保留
                return '<span style="'.$matches[1].'">'.$text.'</span>';
            }else{
                return $matches[0];
            }
        }, $html);
更多推荐

RabbitMQ消息可靠性(二)-- 消费者消息确认

一、消费者消息确认是什么?在这种机制下,消费者在接收到消息后,需要向RabbitMQ发送确认信息,告知RabbitMQ已经接收到该消息,并已经处理完毕。如果RabbitMQ没有接收到确认信息,则会将该消息重新加入队列,等待其他消费者继续处理。消费者消息确认机制能够保证消息不会因为消费者宕机或其他原因而丢失,从而保证了消

Polygon ID架构

1.引言身份分类:1)物理身份:如驾照、身份证等。2)数字身份:又分为:2.1)中心化数字身份:如传统的中心化web2网站账号密码登录。2.2)联邦身份:如通过facebook或谷歌账号授权登录不同网站或应用。2.3)去中心化自治身份:自己持有并管理数据。可有选择的公开或证明,具备隐私属性。PolygonID架构中主要

大模型应用发展的方向|代理 Agent 的兴起及其未来(上)

“介绍了人工智能代理的历史渊源与演进,接着探讨了大型语言模型(LLMs)的发展,以及它们在知识获取、指令理解、泛化、规划和推理等方面所展现出的强大潜力。在此基础上,提出了一个以大型语言模型为核心的智能代理概念框架,该框架包括大脑、感知和行动这三个主要组成部分。”01—长期以来人工智能领域一直追求与人类水平相当甚至超越人

视频画面噪点太多难处理?AI工具一键消除

很多时候我们下载或者录制的视频画面都会有带噪点的问题,噪点就像密密麻麻的小颗粒,这样非常影响观看,这个时候我们需要使用视频降噪功能,视频降噪可以提升视频内容的保真。那么视频画面噪点如何处理呢?视频噪点,也称为视频噪声,是指由于各种原因导致的视频图像中出现的不规则的杂点、花点或小斑点。这些噪点会严重影响视频的观感和质量,

Java基于SpringBoot的校园博客系统

第一章:简介本系统主要根据博主的需求做出分析,让博主更好的在线查看校园博客系统信息等,管理员后台管理系统数据等功能。从这个系统的操作来说,能够有效的进行信息的添加、修改、查询、删除一些校园博客系统信息,在一定的程序上能够实现了自动化。设计该系统的主要目的是为实现通过网络来减少人力和财力的投入,不断提高工作效率。文章首发

强化学习从基础到进阶--案例与实践[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现对于深度强化学习这块规划为:基础单智能算法教学(g

27、Flink 的SQL之SELECT (SQL Hints 和 Joins)介绍及详细示例(2-2)

Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.2

基于SpringBoot的甘肃非物质文化网站设计与实现

目录前言一、技术栈二、系统功能介绍用户信息管理商品分类管理申请信息管理订单信息管理三、核心代码1、登录模块2、文件上传模块3、代码封装前言现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本甘肃非物质文化网站就是在这样的大环境下诞生,其可以帮助管理者在

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

全文链接:http://tecdat.cn/?p=30131最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据(查看文末了解数据免费获取方式)间的相关分析和预测分析,主要内容包括其使用实例,具有一定的参考价值,需要的朋友可以参考一下(点击文末“阅读原文”获取完整代码

K8s的网络——Underlay和Overlay网络

0.基础知识1)网络7层基础知识在网络7层协议基础里,第一层物理链路;第二层是数据链路层,在第一层的基础上引入MAC地址做数据转发。MAC地址在局域网内具有唯一性,主机A发送数据时,会向局域网内进行广播,每个主机根据mac地址自动匹配。网桥、交换机都是工作在数据链路层。由MAC地址构建的网络可以叫以太网。在网络中接入设

热文推荐