未捕获的Mpdf\MpdfException异常:HTML代码大小超过pcre.backtrack_limit 1000000

15
我正在使用MPDF库开发代码,将HTML代码生成PDF。对于HTML代码,我是从外部HTML文件中读取的。但是,当HTML代码较大时,它不起作用。有没有办法解决这个问题,或者是否有其他支持我的功能的库?
当HTML文件较大时,会出现以下错误: 致命错误:Uncaught Mpdf\MpdfException:HTML代码大小超过pcre.backtrack_limit 1000000。您应该使用WriteHTML()以更小的字符串长度。

你可以在文本编辑器中查看HTML - 也许你可以预处理HTML以剥离不需要的部分,然后再将其提供给mpdf。如果不行,也许你可以以某种方式将其分成较小的片段。 - Dave S
4个回答

30

15

在导出大型文档时,我遇到了同样的问题。正如Finwe建议的那样,我通过将要导出的HTML分成较小的部分来解决这个问题。以下是伪代码:

在我想要导出的HTML文件中,我插入一个标记,以后会用它来拆分HTML。在这种情况下,我使用单词“块”:

<body>
@if (count($doc_items) > 0)
@foreach($doc_items as $item)
chunk
<div>
     {{-- Item text here --}}
</div>
</body>

在控制器端,我修改以下参数以防万一,尽管这可能取决于导出大小而不必要:

ini_set('max_execution_time', '300');
ini_set("pcre.backtrack_limit", "5000000");

然后我处理 HTML:

$chunks = explode("chunk", $html);
foreach($chunks as $key => $val) {
    $mpdf->WriteHTML($val);
}

这太厉害了,我一定要试试看..!谢谢 - raphjutras
@AdriRomas 你是如何将页面的HTML赋值给$html的? - Bennett
1
@Bennett 你好。在我的情况下(我使用 Laravel PHP 框架),可以通过 render 函数来完成,代码如下:$html = view('documents.exportView', compact('document', 'doc_items'))->render(); - AdriRomas
2
使用<!-- chunk -->作为标记,因为它不会在html中呈现 - Jerem
我尝试按照这个非常好的答案所解释的方法来拆分一个带有图片的大型报告。结果发现问题出在图片上,因为它们是HTML中的base64编码文本,长度达到了1.4m字符。我尝试拆分base64代码,但是writeHtml()不会像这样组合块,它需要有效的html,并将我的base64片段添加为可见文本。因此,在我的情况下,除了增加memory_limitpcre.backtrack_limit之外,没有其他办法。然而,这很容易且在我的情况下有效。 - peter_the_oak

3

1
ini_set('memory_limit', '900000M');
ini_set("pcre.backtrack_limit", "2000000");

下午好,我是这样解决问题的,编辑这两个变量,以及我提供的数量,这样它就可以处理49页3351行的文件,如果文件更重,则两个数量都必须增加,例如,在上面呈现的比例中,如果文件为59页4351行,则代码将是

 ini_set('memory_limit', '1500000M');
 ini_set("pcre.backtrack_limit", "3000000");

根据文件大小的不同,等等,直到它们不再出现错误。

有时会出现错误,我能够用简单的方法解决它。最好的问候


请将您的答案翻译成英语,以便所有人都能理解。此外,请在您的答案中添加一些解释 - 在另一个答案中已经建议修改限制。 - Nico Haase
下午好,是的,建议修改pcre.backtrack_limit而不是memory_limit,两者结合加上我提供的数量可以为我处理49页、3351行的文件,如果文件更重,则应增加数量。 发生错误,但我很容易地解决了它,用一个简单的方法。 最好的问候 - Duber Pesca - un Cristiano
请通过编辑您的答案添加所有澄清内容。 - Nico Haase
好的,谢谢,我已经编辑好了(Y), 待下次再见。 - Duber Pesca - un Cristiano
给定的配置听起来像一个相当糟糕的想法。 1500000M 的内存限制等于 1500G,我怀疑任何好的 PHP 应用程序都不需要那么多的内存。 - Nico Haase
好的,它对我起作用了。 每个人都会看到他所做的。 - Duber Pesca - un Cristiano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接