【问题标题】:DOMPDF: Unable to stream pdf: headers already sentDOMPDF:无法流式传输 pdf:标头已发送
【发布时间】:2013-10-31 17:27:04
【问题描述】:

我正在使用基于 html 表单输入和上传文件的 smarty 模板生成 php 页面。使用dompdf,我想将生成的页面保存为pdf文件。

当用户提交 multipart/form-data 时,数据会发布到自己。然后进行验证过程。一切正常后,使用模板文件生成一个新页面。没有输出,相反,dompdf 利用模板文件流式传输 pdf 文件。在解决了“找不到 DOMPDF”、内存不足等几个阶段的问题后,我现在遇到了“无法流式传输 pdf:标头已发送”错误。

最常见的问题之一是在调用 stream() 之前存在换行符、空格或任何输出。我在 ?.

之前和之后检查了空格

也没有 print_f 或 echo 语句。如何解决此问题?问题出在哪里……在 smarty 模板文件或 php 文件本身? 代码如下:

require_once("dompdf/dompdf_config.inc.php");
spl_autoload_register('DOMPDF_autoload');
$html = $smarty->fetch('index.tpl');
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper('a4', 'portrait');
$dompdf->render();
$dompdf->stream("newfile.pdf");

【问题讨论】:

  • 检查 dompdf 本身(或 smarty)没有做一些隐藏的输出。例如注释掉 $dompdf-stream() 调用,点击 url,然后保存内容...看看里面有什么。
  • 您使用的是哪个 smarty 版本?在某些旧版本中,smarty 会在编译文件的开头添加空格

标签: php smarty dompdf


【解决方案1】:

我遇到了同样的问题,我通过在顶部文件中添加以下代码解决了这个问题:

ob_start();

【讨论】:

    【解决方案2】:

    对我来说 - 解决方案是将我的文件编码为 UTF-8 而不是 UTF-8 BOM

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,查看源代码时没有明显的输出。对我来说,问题是我已经刷新了输出,尽管除了标题之外没有其他内容,并且阻止了流式传输输出并给出“标题已发送”消息。这是真的。我的解决方法是删除 flush() 和 ob_flush() 语句,然后流输出就可以工作了。

      【讨论】:

        【解决方案4】:

        简单的解决方案:

        在流之前写在下面的行,它将显示新行或空格的确切位置

        $f;
        $l;
        if(headers_sent($f,$l))
        {
            echo $f,'<br/>',$l,'<br/>';
            die('now detect line');
        }
        

        【讨论】:

        • 哇,真是天才!帮助我发现包含的远程文件是 UTF-8 但不是没有 BOM。
        • 太棒了!!!很棒,可以帮助我在 Codeingitor 中使用 dompdf 库时解决我的标头已发送问题。谢谢!!!
        • 我删除了所有空白仍然出现相同的错误。如果您有其他解决方案,请告诉我。
        • 我将我的 PDF 标记包裹在 php 括号中,然后在它们之后执行逻辑。 &lt;?php ob_start(); ?&gt; /* pdf markup */ &lt;?php $html = ob_get_clean(); ?&gt; &lt;?php // more logic.ob_get_clean(); 修复它之后删除 ?&gt;
        • 天才解决方案!
        【解决方案5】:

        在我的情况下,问题是通过在 dompdf_config_inc.php 中将 $_dompdf_show_warnings 设置为 false 来解决的

        【讨论】:

        • 隐藏错误并不能真正解决它们,即使它们可能并不重要
        【解决方案6】:

        我遇到了这个问题。你想检查你正在使用的所有变量。 您传递的一个甚至多个变量是空的并且会弄乱渲染。

        逐渐开始,摆脱所有php 并尝试生成pdf,然后如果它适合您,则添加代码逐块

        这将帮助您确定问题所在。

        【讨论】:

          【解决方案7】:

          替换此文件的第 3105 行:dompdf/lib/class.pdf.php

          if ( headers_sent()) {
            die("Unable to stream pdf: headers already sent");
          }
          

          $output = ob_get_clean();
          if ( headers_sent()) {
              echo $output; }
          

          然后在生成 pdf 输出的文件中,例如,如果您从 Joomla 组件输出 组件/com_joomlacomponent/views/yourpdfdir/tmpl/default.php 在开始的php标签后立即输入

          <?php
          ob_start();
          

          【讨论】:

            【解决方案8】:

            确保您的编辑器没有添加 Unicode Bom 描述 - 通过记事本将代码保存到文件,或者(如果您在 Dreamweaver 中工作)通过 Asign Unicode Signature (BOM) 或其他方式删除检查。 ;)

            【讨论】:

              【解决方案9】:

              我尝试回显,但没有找到空格或换行符。最后,我将 php 重定向到另一个页面而不是 PHP_SELF,问题就消失了。我没有更改任何代码。看起来 php 结束后存在 html 标签是违规因素。

              【讨论】:

              • 你应该在stream()函数之后调用exit;
              • @periklis 谢谢。 exit; 解决了将 DOMPDF 与 Opencart 包装为 $this->document->pdf() 方法时的标题警告。这应该在某个地方的文档中注明(也许我错过了)。
              【解决方案10】:

              很可能在您的代码中某处有空格或新行导致此问题。这是一个简单的调试方法:

              1. 在脚本的最后(在 stream() 调用上方)回显某些内容,例如 echo "end!";exit;
              2. 点击“查看源”页面,让空间更易于查看
              3. 如果你的“结束!”字符串没有出现在脚本的开头,然后在某处打印了一个字符
              4. 移动“回声结束!”进一步排列到您的代码,直到找到插入空间的位置

              另一种可能性是您在某处使用了引入不可打印字符的语言字符串。如果您的应用程序是多语言的,请确保您使用英语进行测试

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-06-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-06-17
                • 1970-01-01
                • 1970-01-01
                • 2011-06-02
                相关资源
                最近更新 更多