composer 安装的 dompdf/dompdf 生成 PDF 中文乱码问题,完美解决方案。
DOMPDF 是一个支持 CSS 2.1 语法,可以将 HTML 到 PDF 完美转换的包,默认情况下,中文会出现类似下面情况:

从本质上讲,dompdf 是(主要是)一个用 PHP 编写的符合 CSS 2.1 的 HTML 布局和渲染引擎。 它是一个样式驱动的渲染器:它将下载和读取外部样式表、内联样式标签以及单个 HTML 元素的样式属性。 它还支持大多数表现形式的 HTML 属性,接下来介绍如何完美解决 DOMPDF 中文乱码问题。
composer require dompdf/dompdf
要使用自定义的字体,以及中文字体,要使用 dompdf/utils 独立的项目,项目地址:https://github.com/dompdf/utils.git。该项目中的 load_font.php 用于生成自定义字体(含中文)文件,需要 CLI 命令行方式运行。
// 让 dompdf 支持微软雅黑字体 php .\load_font.php 'msyh' .\fonts\msyh.ttf
PS:font 字体生成后的存放路径:
vendor/dompdf/dompdf/lib/fonts/
再执行之前 PDF 导出,中文显示正常,如图:

load_font.php 命令行运行说明:
Usage: .\load_font.php font_family [n_file [b_file] [i_file] [bi_file]]
font_family: the name of the font, e.g. Verdana, 'Times New Roman',
monospace, sans-serif. If it equals to "system_fonts",
all the system fonts will be installed.
n_file: the .ttf or .otf file for the normal, non-bold, non-italic
face of the font.
{b|i|bi}_file: the files for each of the respective (bold, italic,
bold-italic) faces.
If the optional b|i|bi files are not specified, load_font.php will search
the directory containing normal font file (n_file) for additional files that
it thinks might be the correct ones (e.g. that end in _Bold or b or B). If
it finds the files they will also be processed. All files will be
automatically copied to the DOMPDF font directory, and afm files will be
generated using php-font-lib (https://github.com/PhenX/php-font-lib).
Examples:
./load_font.php silkscreen /usr/share/fonts/truetype/slkscr.ttf
./load_font.php 'Times New Roman' /mnt/c_drive/WINDOWS/Fonts/times.ttf
dompdf 中文乱码,完整测试代码:
<?php
require_once "vendor/autoload.php";
use Dompdf\Dompdf;
use Dompdf\Options;
$options = new Options();
$options->setDefaultFont('msyh');
$dompdf = new Dompdf($options);
$dompdf = new Dompdf($options);
$dompdf->loadHtml('
<style>
.font-zh {
font-family: "msyh"
}
</style>
<p class="font-zh">CommandNotFound 坑否</p>
');
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
// Output the generated PDF to Browser
// Attachment: 0 直接显示, 1 强制下载
$dompdf->stream(null, ['Attachment' => 0]);
MARK:DomPDF 保存 PDF 到指定目录,不需要输出浏览器,直接保存 PDF:
<?php
require_once 'vendor/autoload.php';
use Dompdf\Dompdf;
// 创建一个新的 Dompdf 实例
$dompdf = new Dompdf();
// 加载 HTML 内容
$html = '<h1>Hello, World!</h1><p>This is a test PDF document.</p>';
$dompdf->loadHtml($html);
// 设置纸张大小和方向
$dompdf->setPaper('A4', 'portrait');
// 渲染 PDF
$dompdf->render();
// 指定保存 PDF 的路径
$filePath = '/path/to/your/directory/output.pdf';
// 将生成的 PDF 保存到指定路径
file_put_contents($filePath, $dompdf->output());
echo "PDF 文件已保存到: " . $filePath;