5

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

当用户提交 multipart/form-data 时,数据会发布到自己。然后进行验证过程。一切正常后,使用模板文件生成一个新页面。没有输出,相反,dompdf 利用模板文件流式传输 pdf 文件。在解决了“找不到 DOMPDF”、内存不足等问题的几个阶段后,我现在遇到了“无法流式传输 pdf:标头已发送”错误。

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

也没有 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");
4

10 回答 10

18

简单的解决方案:

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

$f;
$l;
if(headers_sent($f,$l))
{
    echo $f,'<br/>',$l,'<br/>';
    die('now detect line');
}
于 2015-07-06T13:12:56.030 回答
3

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

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

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

于 2013-10-23T08:58:10.323 回答
3

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

ob_start();
于 2020-10-18T04:12:14.200 回答
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 组件输出 components/com_joomlacomponent/views/yourpdfdir/tmpl/default.php 在打开的 php 标记后立即输入

<?php
ob_start();
于 2014-10-08T09:27:50.723 回答
0

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

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

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

于 2015-02-03T14:54:51.253 回答
0

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

于 2013-10-23T11:28:12.473 回答
0

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

于 2014-07-16T00:00:57.887 回答
0

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

于 2016-09-10T00:21:19.353 回答
0

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

于 2016-08-06T20:11:38.587 回答
-1

就我而言,问题是通过在 dompdf_config_inc.php 中将 $_dompdf_show_warnings 设置为 false 来解决的

于 2015-03-20T12:19:00.187 回答