DOMXPath::query():Render上的表达式无效



我刚刚开始使用dompdf(前MPDF用户(,它在我的开发环境中都能工作,但当我把它放在服务器上时,它会随机给我以下错误:

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

这个文件的行是

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

2014年也有类似的问题,我在第一篇文章中尝试使用代码进行调试,但没有成功。

我有所有必需的库,并且我正在运行PHP 7.3.23和dompdf的0.8.6版本。

奇怪的是,如果我使用filt/woops,我不会显示任何错误,但如果我不使用,就会出现上面的错误。

我在dompdf文档中找不到如何调试,所以任何帮助都将不胜感激:(

我要渲染的代码可以在这里查看我的要点,我用来渲染它的代码如下


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(@就是这样抑制错误的(,正常的错误处理程序也很可能仍然会引发错误。另一方面,filt/woops必须遵守错误报告级别。

然而,根本问题似乎是解析谷歌字体URL的问题。我发现,如果你从谷歌字体样式表引用中删除分号,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");

最新更新