【问题标题】:Dompdf error "No block-level parent found. Not good."Dompdf 错误“未找到块级父级。不好。”
【发布时间】:2021-11-22 04:46:14
【问题描述】:
require_once("function/dompdf/dompdf_config.inc.php");
$dompdf = new DOMPDF();
foreach($modules as $module){
   $output = "Hello " .$module['name'];
   $dompdf->load_html($output);
   $dompdf->render();
   $output_pdf = $dompdf->output();
   file_put_contents($dir . $name_modulo . ".pdf", $output_pdf);

}

致命错误:未捕获的异常“DOMPDF_Exception”,消息“未找到块级父级”。不好。'

【问题讨论】:

  • @dragoste 谢谢!将单个 DOMPDF 实例创建到循环工作中.. 为什么?
  • 正如上面链接下的回答中提到的,DOMPDF 类没有正确清理自身。我不知道任何细节。
  • @dragoste,因为链接的问题中没有(接受的)答案,也许这应该保持开放和回答?

标签: php dompdf


【解决方案1】:

这个帖子晚了,但根据https://github.com/dompdf/dompdf/issues/902 的帖子,我能够通过删除<html><head></head><body></body></html> 之间的空格来解决这个问题

所以,不要像这样正确格式化 html 代码:

<html>
<head>
...
</head>
<body>
...
</body>
</html>

我删除了标签之间的所有新行或空格,现在看起来像这样:

<html><head>
...
</head><body>
...
</body></html>

然后一切都变得很笨拙

【讨论】:

  • 这个解决方案在 2 小时的研究试验和错误之后拯救了我。
  • 在我的情况下,PHP 版本升级导致了这个问题。但是您的解决方案有效。谢谢。
  • 一个非常令人沮丧的问题!这个解决方案也帮助了我。经过几个小时的调试...非常感谢!
【解决方案2】:

dompdf 文件夹 > dompdf_config.custom.inc.php 文件 > 尝试取消注释

define("DOMPDF_ENABLE_HTML5PARSER", true);

还将不支持的 html5 标签和属性替换为支持的标签和属性,清除 html 错误以获得更好的结果

【讨论】:

  • 该行在我的 dompdf_config.custom.inc.php 中不存在,添加它只会引发有关已发送标头的新错误。不确定它是否相关,因为它说 __autoload 已弃用。
【解决方案3】:

只要定义

$dompdf->set_option('enable_html5_parser', TRUE);

我认为它会解决问题。

或者可以编辑dompdf/dompdf_config.inc.php文件 转到第 322 行 改变

def("DOMPDF_ENABLE_HTML5PARSER", false);

def("DOMPDF_ENABLE_HTML5PARSER", true);

【讨论】:

    【解决方案4】:

    转到配置文件 dompdf_config.custom.inc.php 并取消注释 define("DOMPDF_ENABLE_HTML5PARSER", true);检查一下,基本上它需要在您的配置文件中启用 html5 解析器。

    【讨论】:

      【解决方案5】:

      只需从dompdf_config.custom.inc.php 这个文件中取消注释define("DOMPDF_ENABLE_HTML5PARSER", true); 这一行。

      你可以在vendor/dompdf/dompdf这个目录中找到这个codeigniter的文件。

      【讨论】:

        【解决方案6】:

        如果您使用 composer require 安装了 dompdf,那么如果您不想修改供应商文件夹,则使用 set_option 方法定义 enable_html5_parser 选项效果很好

        因此,将以下内容添加到每个创建错误的文档中

        $dompdf->set_option('enable_html5_parser', TRUE);
        

        【讨论】:

          【解决方案7】:

          我也不知道为什么关于 ("DOMPDF_ENABLE_HTML5PARSER", true) 的答案也被否决了。因为我花了 30 多个小时试图弄清楚为什么会在我的网站上发生这种情况,直到我遇到了这个解决方案。因此,如上所述,我通过将其设置为“TRUE”来启用“DOMPDF_ENABLE_HTML5PARSER”。并且立即解决了有关“未找到块级父级”的错误,并且我的脚本可以正常工作。也许第二个答案被否决了,因为它重复了之前的答案(但是让一个人休息一下,你为什么不呢?也许他没有看到它......)。或者也许“downvoter”有态度问题。

          【讨论】:

            【解决方案8】:

            我在 PHP 5.6 上使用 domPDF 0.8.3 时遇到了同样的问题,我既找不到 dompdf_config.custom.inc.php 也找不到 dompdf_config.inc.php,也没有工作;为了解决我的问题,我在我的 CSS 中添加了 body {display:block;} 并且没有进一步的问题。

            【讨论】:

              【解决方案9】:

              我尝试定位空白区域或其他空间。没有成功,所以 我只是最小化了作为 PDF 模板的 HTML 文件 它删除了所有的空格、空格等 为我工作

              【讨论】:

                【解决方案10】:

                您可以启用上面提到的 HTML5 解析器,也可以更新 dompdf 库。我发现将 dompdf 库从 6.2 更新到 8.2 克服了这个错误,但是如果你像我一样使用 Drupal,你必须做一些技巧才能让 Drupal 识别该库的新版本(见这里:@987654321 @)

                【讨论】:

                  【解决方案11】:

                  对于较新版本的 Dompdf,您可以使用它来启用 HTML5 解析器:

                  use Dompdf\Options;
                  
                  $options = new Options();
                  $options->set('isHtml5ParserEnabled', true);
                  $dompdf = new Dompdf($options);
                  

                  【讨论】:

                    【解决方案12】:

                    在我的情况下,它有点不同。

                    pdf 创建代码在循环中,但 dom pdf 对象创建在循环之上。因此,当它第二次尝试创建 pdf 时,我看到了上述错误。为了解决它,每次我创建一个新对象时它都按预期工作。

                    例子:

                    (代码不工作)

                    //Reference of Dompdf namespace
                    use Dompdf\Dompdf;
                    use Dompdf\Options;
                    
                    //instantiate and use the Options class
                    $options    =   new Options();
                    $options->set('enable_html5_parser', true);
                    
                    $dompdf     =   new Dompdf($options);
                    for($i = 0; $i < $count; $i++) {
                      //Create PDF
                      $dompdf->loadHtml($form_data);
                      $dompdf->setPaper('A4', 'landscape');
                      $dompdf->render();
                      $output = $dompdf->output();
                      file_put_contents($pdf_file_name, $output);
                    }
                    

                    工作代码:

                    //Reference of Dompdf namespace
                    use Dompdf\Dompdf;
                    use Dompdf\Options;
                    
                    //instantiate and use the Options class
                    $options    =   new Options();
                    $options->set('enable_html5_parser', true);
                    
                    for($i = 0; $i < $count; $i++) {
                      $dompdf     =   new Dompdf($options);
                      //Create PDF
                      $dompdf->loadHtml($form_data);
                      $dompdf->setPaper('A4', 'landscape');
                      $dompdf->render();
                      $output = $dompdf->output();
                      file_put_contents($pdf_file_name, $output);
                    }
                    

                    【讨论】:

                    • 我看不出你的两个代码有什么区别。
                    • 没有看到描述并正确描述您如何评论没有区别以及您如何否决它。 Dompdf 对象在不工作代码的循环之外。在工作代码中,它在循环内移动。
                    • 我认为没有必要多次实例化 DomPdf,除非您使用不同的选项。我能够通过升级 DomPdf 来解决我的问题。如果使用 PHP 7 尤其如此。
                    • 版本一直在升级,你不知道我用的是哪个版本。最初你说你没有看到差异。现在你说不需要在升级版本上多次实例化 DomPdf。在不知道我使用过的版本的情况下,你怎么能拒绝它。我确定您没有检查每个 dompdf 版本。我已经清楚地提到单一实例化对我不起作用。如果您在很长时间后对特定的库或软件发表评论或回答,大多数情况下都会对其进行更新,但不知道版本,您如何发表评论。
                    猜你喜欢
                    • 2018-06-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-01-27
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-08-08
                    • 1970-01-01
                    相关资源
                    最近更新 更多