我正在使用基于 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();
很可能是代码中的某个空格或换行符导致这种情况。下面是调试它的简单方法:
- 在
- 脚本的最后(在 stream() 调用上方)回显某些内容,例如
echo "end!";exit;
- 点击查看页面的"源代码",使空间更易于查看
- 如果你的"end!"字符串没有出现在脚本的开头,那么在某处打印了一个字符
- 将"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 解决了