DOMPDF:无法流式传输 pdf:标头已发送


DOMPDF: Unable to stream pdf: headers already sent

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

当用户提交多部分/表单数据时,数据将发布到自身。然后它经过验证过程。一切正常后,将使用模板文件生成一个新页面。没有输出,相反,dompdf 利用模板文件来流式传输 pdf 文件。在解决了"找不到 DOMPDF"、内存不足等问题的几个阶段后,我现在遇到了"无法流式传输 pdf:标头已发送"错误。

最常见的问题之一是在调用 stream() 之前存在换行符、空格或任何输出。我在<?php和>?之前和之后检查了空格。

也没有print_f或回声语句。如何解决此问题?问题出在哪里...在智能模板文件还是 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");

简单的解决方案:

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

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

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

ob_start();

很可能是代码中的某个空格或换行符导致这种情况。下面是调试它的简单方法:

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

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

替换此文件的第 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组件输出components/com_joomlacomponent/views/yourpdfdir/tmpl/default.php在开始 php 标签后立即输入

<?php
ob_start();

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

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

我遇到了这个问题。您要检查正在使用的所有变量。您传递的一个或多个变量为空,并且弄乱了渲染。

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

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

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

对我来说 -

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

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

问题