PHP使用Dompdf实现HTML转PDF功能

项目原因,使用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这个仓库下载,里面已经下载了字体文件和脚本,下载下来直接执行脚本就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值