项目原因,使用composer安装会有各种依赖问题,处理起来麻烦,所以直接选择手动下载安装,下面是手动下载安装Dompdf并使用的详细教程。
一、下载Dompdf
稳定版本:https://github.com/dompdf/dompdf/releases
解压缩后放到extend扩展目录,确保包含的依赖也被正确安装或下载(php-font-lib、php-svg-lib 和 sabberworm/php-css-parser)
目录截图:
二、解决中文乱码问题
下载中文字体包:GitCode - 全球开发者的开源社区,开源代码托管平台
下载字体转换脚本:https://github.com/dompdf/utils
将字体文件放到extend/dompdf/vendor/dompdf/dompdf/fonts
将脚本文件放到extend/dompdf/vendor/dompdf/dompdf
如下图:
注意load_font.php文件加载vendor/autoload.php的路径问题,要对应extend/dompdf/vendor/autoload.php文件的路径
执行脚本,将字体文件转换为Dompdf可识别的格式。
php extend/dompdf/vendor/dompdf/dompdf/load_font.php simhei extend/dompdf/vendor/dompdf/dompdf/fonts/simhei.ttf
执行成功输出如下图:
执行成功后extend/dompdf/vendor/dompdf/dompdf/lib/fonts文件夹会多出几个字体文件
设置使用字体
$options = new Options();
$options->set('defaultFont', 'simhei'); // 设置默认字体
$dompdf = new Dompdf($options);
三、指定某些 HTML 内容放在第二页
直接在需要设置的元素上加上以下内联样式:
page-break-before: always;
注意事项
1.分页符必须放在块级元素上(如 <div>、<h1>、<p>),不能直接在 <span> 或纯文本上使用。
2.分页符不会生效于 display: inline 的元素,确保你的元素是块级元素。
3.分页符在某些复杂布局中可能失效,尽量避免嵌套过深的结构。
四、完整使用代码
<?php
namespace app\common\logic;
use think\facade\Env;
use Dompdf\Dompdf;
use Dompdf\Options;
require_once Env::get('root_path') . 'extend/dompdf/autoload.inc.php';
class ContractPdf
{
/**
* 生成pdf文件
**/
public static function htmlToPdf($data)
{
$html = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>签收回执单</title>
<style>
* {
word-wrap: break-word; /* 支持换行 */
overflow-wrap: break-word; /* 支持换行 */
}
table {
border-collapse: collapse; /* 合并边框 */
width: 100%; /* 设置表格宽度 */
}
table th,table td {
border: 1px solid #000; /* 设置单元格边框 */
padding: 8px; /* 设置单元格内边距 */
text-align: center; /* 设置文本对齐方式 */
line-height: 16px;
}
</style>
</head>
<body>
<div style="line-height: 30px;">
<div style="font-size: 22px;text-align: center;margin-bottom: 20px;">签收回执单</div>
<div>
<div style="margin-bottom: 20px;">
出租方:_____________________
</div>
<div>
<div style="text-indent: 2em;">
关于承租户___________与我方租用下表设备。双方签署后,即成为双方交易不可分割的依据,且双方均认可其具有法律效力。本次租赁设备的交付清单如下:
</div>
<div style="text-indent: 2em;">
订单编号:________________
</div>
<table style="margin: 30px 0;">
<thead>
<tr>
<th>商品名称</th>
<th>规格配置</th>
<th>租期</th>
<th>数量</th>
<th>设备押金</th>
</tr>
</thead>
<tbody>
<tr>
<td>全新国行iPhone16 pro max</td>
<td>沙漠色钛金属色,256G</td>
<td>2020/4/14-2021/4/13<br>(共365天)</td>
<td>1</td>
<td>¥5499</td>
</tr>
</tbody>
</table>
<div>
以上产品符合订单要求!一式两份,各执一份。
</div>
<div>
承租方本人承诺诚信履约,如有违约同意按照_____________________的租赁服务协议内容执行,并承担由此产生的一切法律后果。
</div>
<div>
请承租人将此页签收,如果另行指定接收人请提前与我方沟通,经协商一致同意后,被指定接收人应提供承租人手写签署的授权委托书,若是单位或法人需加盖公章,并提供复印件等。签收后交付派件员,派件员一并邮寄回我方。
</div>
<div>
承租方接收人签名(必填):_____________________
</div>
<div>
承租方身份证号码(必填):_____________________
</div>
<div>
签收日期:________ 年________月________日
</div>
<div>
温馨提示:请使用的时候尽量保证机器的完整性,合同到期归还清除个人id并原模原样返回,包含原包装。归还前后留意设备完整,如有意外情况,请第一时间联系客服。
</div>
<div style="font-size: 14px;text-align: center;">
<div style="float: left;width: 33%;">
扫一扫微信再次下单<br>
<img src="https://php-hszl.yixiangonline.com/static/common/image/default/category_layout1.png" alt="" style="width: 130px;height: 130px;margin-top: 10px;" />
</div>
<div style="float: left;width: 33%;">
扫一扫支付宝再次下单<br>
<img src="https://php-hszl.yixiangonline.com/static/common/image/default/category_layout1.png" alt="" style="width: 130px;height: 130px;margin-top: 10px;" />
</div>
<div style="float: left;width: 33%;">
扫一扫加店铺客服<br>
<img src="https://php-hszl.yixiangonline.com/static/common/image/default/category_layout1.png" alt="" style="width: 130px;height: 130px;margin-top: 10px;" />
</div>
</div>
<div style="page-break-before: always;>
回执单使用说明:1、商家发货或收件方自提前,需电话告知收件方需要本人携带身份证和身份证复印件签收,签收需要登记签收信息。
</div>
<div>
2、支持签收回单的物流公司:德邦快递(增加5元回单成本),顺丰快递(增加5元回单成本)等。
</div>
<div>
3、此回单是客户签收的凭证,必要时具有法律效力,商家注意落实和保存回执单。
</div>
<div style="margin-top: 20px">
使用顺丰快递签收回单流程:1、拍照回传、电子回单、纸质回单:登录“顺丰速运+”微信小程序,在寄件页面,点击【增值服务】选择签单返还即可,快递员上门收件会按照签单返还操作寄出;
</div>
</div>
</div>
</div>
</body>
</html>
';
// 创建 DOMPDF 配置对象
$options = new Options();
$options->setIsRemoteEnabled(true); // 如果需要加载远程资源,启用远程加载
$options->set('defaultFont', 'simhei'); // 设置默认字体
$dompdf = new Dompdf($options);
// 加载 HTML 内容
$dompdf->loadHtml($html, 'UTF-8');
//设置纸张大小和方向
$dompdf->setPaper('A4', 'portrait');
//将html转为PDF
$dompdf->render();
//下载生成的pdf文件
//$dompdf->stream();
//将生成的pdf保存到服务器
file_put_contents('uploads/pdf/123.pdf',$dompdf->output());
}
}
效果图:
如果觉得上面一步步下载麻烦的话,可以直接在https://gitee.com/out-of-town/dompdf这个仓库下载,里面已经下载了字体文件和脚本,下载下来直接执行脚本就好了。