我正在使用基于 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");
简单的解决方案:
在流之前写下几行,它将显示新行或空格即将到来的位置
$f;
$l;
if(headers_sent($f,$l))
{
echo $f,'<br/>',$l,'<br/>';
die('now detect line');
}
我遇到了同样的问题,我通过在顶部文件中添加以下代码解决了这个问题:
ob_start();
很可能是代码中某个地方有空格或换行导致了这种情况。这是一个简单的调试方法:
echo "end!";exit;
另一种可能性是您在某处使用的语言字符串引入了不可打印的字符。如果您的应用程序是多语言的,请确保您使用英语进行测试
替换该文件的第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();
我尝试回显,但没有发现空格或换行符。最后,我将 php 重定向到另一个页面而不是 PHP_SELF,问题就消失了。我没有更改任何代码。看起来 php 结束后 html 标签的存在是有问题的因素。
确保您的编辑器没有添加 Unicode Bom 描述 - 通过记事本将代码保存到文件,或者(如果您在 Dreamweaver 中工作)通过指定 Unicode 签名 (BOM) 或其他方式删除检查。 ;)
我遇到了这个问题。您想要检查正在使用的所有变量。 您传递的一个甚至多个变量为空并且会扰乱渲染。
逐渐开始,删除所有
php
并尝试生成pdf,然后如果它适合您,则添加代码逐块。
这将帮助您确定问题出在哪里。
我遇到了这个问题,在查看源代码时没有明显的输出。对我来说,问题是我已经刷新了输出,尽管除了标头之外没有其他内容,并且阻止了流式传输输出,给出了“标头已发送”消息。这是真的。我的解决方法是删除flush()和ob_flush()语句,然后流输出就可以工作了。
对我来说 - 解决方案是将我的文件编码为 UTF-8 而不是 UTF-8 BOM
我有同样的问题:ufeffufeffufeffufeffufeff无法流式传输 pdf:标头已发送
你的任何提示都不起作用;值得注意的情况是,我所有的本地开发环境(Windows、Linux,有或没有虚拟主机地址)都没有出现这个问题,而实时环境(Hetzner)却出现了这个问题。肯定和现服环境有关,但我不知道如何继续。
基督教
在我的例子中,通过在 dompdf_config_inc.php 中将 $_dompdf_show_warnings 设置为 false 解决了问题