'A4', 'orientation' => 'L', 'margin_top' => 12, 'margin_bottom' => 12, 'margin_left' => 10, 'margin_right' => 10, 'tempDir' => runtime_path('mpdf'), 'header_html' => '', 'footer_html' => '', 'watermark_text' => '', 'css_files' => [], 'default_font' => 'notosanssc', 'font_dirs' => [public_path('fonts')], 'font_data' => [ 'notosanssc' => ['R' => 'NotoSansSC-Regular.ttf', 'B' => 'NotoSansSC-Bold.ttf'], ], 'asset_base' => '', 'enable_html5_parser' => true, ], $options); $defaultConfig = (new ConfigVariables())->getDefaults(); $defaultFontConfig = (new FontVariables())->getDefaults(); $fontDirs = array_merge($defaultConfig['fontDir'], $opts['font_dirs']); $fontData = array_merge($defaultFontConfig['fontdata'], $opts['font_data']); $mpdf = new Mpdf([ 'format' => $opts['format'], 'orientation' => $opts['orientation'], 'margin_left' => $opts['margin_left'], 'margin_right' => $opts['margin_right'], 'margin_top' => $opts['margin_top'], 'margin_bottom' => $opts['margin_bottom'], 'tempDir' => $opts['tempDir'], 'fontDir' => $fontDirs, 'fontdata' => $fontData, 'default_font' => $opts['default_font'], 'enable_html5_parser' => $opts['enable_html5_parser'], ]); if ($opts['header_html']) $mpdf->SetHTMLHeader($opts['header_html']); if ($opts['footer_html']) $mpdf->SetHTMLFooter($opts['footer_html']); if (!empty($opts['watermark_text'])) { $mpdf->SetWatermarkText($opts['watermark_text']); $mpdf->showWatermarkText = true; $mpdf->watermarkTextAlpha = 0.08; } // 资源绝对化(如果你有相对路径的图片等) $html = PdfHelper::absolutizeAssetUrls($html, $opts['asset_base']); // === 关键改动:把 抽出来,作为 HEADER_CSS 写入 === [$inlineCss, $cleanHtml] = $this->extractCssAndCleanHtml($html); // 先写外部 css_files if (!empty($opts['css_files'])) { foreach ($opts['css_files'] as $cssFile) { if (is_file($cssFile)) { $mpdf->WriteHTML(file_get_contents($cssFile), HTMLParserMode::HEADER_CSS); } } } // 再写内联 的内容拼成一段 CSS,并把这些 ,DOTALL 支持跨行 if (preg_match_all('/]*>(.*?)<\/style>/is', $html, $m)) { foreach ($m[1] as $block) { // 去掉 HTML 注释,以防注释把 CSS 包起来 $block = preg_replace('//', '', $block); $cssParts[] = trim($block); } // 从 HTML 删除所有