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

时间:2013-10-22 17:39:53

标签: php smarty dompdf

这个问题在各种论坛上被提出了数百次;有些已经解决了,有些则没有。我检查了大量资源,但我的问题无法解决。我正在使用基于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");

10 个答案:

答案 0 :(得分:12)

简单的解决方案:

在流之前写下面的行,它将显示新的行或空间到来的位置

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

答案 1 :(得分:3)

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

  1. 在脚本的最末端(在stream()调用之上)回显一些内容,例如echo "end!";exit;
  2. 点击“查看您的信息来源”,这样可以更容易看到空间
  3. 如果你的“结束!”字符串不会出现在脚本的最开头,然后出现一个字符
  4. 移动“echo end!”更进一步到您的代码,直到找到插入空格的位置
  5. 另一种可能性是你在某个地方使用了一个引入了不可打印字符的语言字符串。如果您的应用程序是多语言的,请确保您使用英语进行测试

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

替换此文件的第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 /视图/ yourpdfdir / TMPL /如default.php 在打开php标签后立即输入

<?php
ob_start();

答案 5 :(得分:0)

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

逐渐开始,通过删除所有php并尝试生成pdf,然后如果它适用于您添加代码逐块

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我遇到了这个问题,在查看来源时没有明显的输出。对我来说问题是我刷新了输出,即使除了标题之外没有输出,并且阻止了流输出给出“已经发送的标题”消息。这是真的。我的修复是删除flush()和ob_flush()语句,然后流输出工作。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

ob_start();

祝你好运!