DOMXPath::query(): 渲染表达式无效

DOMXPath::query(): Invalid expression on Render

我刚刚开始使用 dompdf(前 MPDF 用户),它在我的开发环境中都可以正常工作,但是一旦我将它放在我的服务器上,它就会随机给我以下错误:

Type: ErrorException;
Message: DOMXPath::query(): Invalid expression;
File: /public_html/system/storage/vendor/dompdf/dompdf/src/Css/Stylesheet.php;
Line: 1034;

line of this file

$nodes = @$xp->query($query["query"]);

有一个similar issue from 2014,我尝试使用第一个post中的代码进行调试,但没有成功。

我有所有需要的库,我是 运行 PHP 7.3.23 和 dompdf 版本 0.8.6。

奇怪的是,如果我使用 filp/whoops,我不会显示任何错误,但如果我不使用,则会出现上述错误。

我在 dompdf 文档中找不到如何调试,因此非常感谢任何帮助:)

我要渲染的代码可供查看on my gist here,我用来渲染它的代码如下


Options = new Options();
$dompdfOptions->set('isRemoteEnabled', TRUE);
$dompdf = new Dompdf($dompdfOptions);
$context = stream_context_create([
  'ssl' => [
    'verify_peer' => FALSE,
    'verify_peer_name' => FALSE,
    'allow_self_signed' => TRUE
  ]
]);
$dompdf->setHttpContext($context);
$dompdf->loadHtml($compiledContent);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('po-000013', array('Attachment' => 0));

出现错误的原因是 Dompdf 在解析样式表时生成了无效的 XPath 表达式。 XPath 查询在代码中以 @ 错误控制处理程序为前缀,以便 Dompdf 可以继续处理这些类型的错误。即使错误报告为 0(这就是 @ 抑制错误的方式),您的正常错误处理程序很可能仍在引发错误。另一方面,filp/whoops 必须遵守错误报告级别。

然而,潜在的问题似乎是解析 Google 字体 URL 的问题。我发现如果您从 Google 字体样式表参考 Dompdf 中删除分号,则不会 运行 出现任何解析错误。

所以,而不是这个:

@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap');

使用这个:

@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@600&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@700&display=swap");