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

问题描述 投票:0回答:11

我正在使用基于 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");
php smarty dompdf
11个回答
19
投票

简单的解决方案:

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

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

4
投票

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

ob_start();

3
投票

很可能是代码中某个地方有空格或换行导致了这种情况。这是一个简单的调试方法:

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

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


1
投票

替换该文件的第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();

0
投票

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


0
投票

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


0
投票

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

逐渐开始,删除所有

php
并尝试生成pdf,然后如果它适合您,则添加代码逐块

这将帮助您确定问题出在哪里。


0
投票

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


0
投票

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


0
投票

我有同样的问题:ufeffufeffufeffufeffufeff无法流式传输 pdf:标头已发送

你的任何提示都不起作用;值得注意的情况是,我所有的本地开发环境(Windows、Linux,有或没有虚拟主机地址)都没有出现这个问题,而实时环境(Hetzner)却出现了这个问题。肯定和现服环境有关,但我不知道如何继续。

基督教


-1
投票

在我的例子中,通过在 dompdf_config_inc.php 中将 $_dompdf_show_warnings 设置为 false 解决了问题

© www.soinside.com 2019 - 2024. All rights reserved.