DOMXPath :: query:渲染上的表达式无效

问题描述

我刚刚开始使用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,我尝试使用第一篇文章中的代码进行调试,但是没有用。

我拥有所有必需的库,并且我正在运行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");