FPDF错误:已输出某些数据,无法发送PDF

36

我正在使用 fpdf 库来完成我的项目,并将其用于扩展 drupal 模块。以下是相关代码:

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();

给我一个错误:FPDF 错误:已输出一些数据,无法发送 PDF

我尝试在 drupal 区域名称 test.php 之外的单独文件中创建此文件,并在查看时它可以工作。这里有人知道为什么不起作用吗?或者这里有人可以指点我使用哪个正确的 PDF 库来在 drupal 中查看 HTML 到 PDF 格式。

15个回答

55

要让fpdf正常工作,除了fpdf生成的内容外,就不能有任何其他输出。例如,以下代码可以正常工作:

<?php
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>

虽然这样做不行(请注意在开头的<?标签前面有一个空格)

 <?php
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>

另外,这种方法也不起作用(使用 echo 会破坏它):

<?php
echo "About to create pdf";
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>

我不确定Drupal方面的事情,但我知道fpdf要求绝对没有非fpdf输出。


1
噢,好的,因为我只是将代码插入到.tpl文件中。它有一些使用echo/print、HTML标签和JavaScript语法的代码块。 - Wondering Coder
顺便说一句 - 我不在 PHP 中使用短标签。我使用的是 <?php ?>。 - Wondering Coder
2
没错,那就是你的问题。使用 echo 也会破坏 fpdf(我将编辑我的答案以显示这一点)。短标签与长标签不应该有任何区别,但你必须确保在你的 PHP 标签之外没有任何一个字符。 - Gordon Bailey
@GordonBailey 在 PHP MVC 框架中使用 fpdf 的方法是什么?例如在 PhalconPHP 中,但是对于 MVC 的概念性答案也非常欢迎。 - eomeroff
谢谢@gordeon,我遇到了同样的问题,mpdf也出现了这个问题,但是在本地主机上可以输出pdf,但是在服务器上无法输出,然后我删除了"<?php"标签前面的空格,问题得到了解决。 - Bhavin Thummar
显示剩余2条评论

41

在顶部添加ob_start();,在结尾处添加ob_end_flush();

<?php
    ob_start();
    require('fpdf.php');
    $pdf = new FPDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',16);
    $pdf->Cell(40,10,'Hello World!');
    $pdf->Output();
    ob_end_flush(); 
?>

1
这是解决我的问题的答案,做得很好。 - Humphrey
1
这是解决FPDF错误的方案:一些数据已经被输出,无法发送PDF。 - Ravi Shrimali

25

我遇到了以下的错误:
FPDF错误:某些数据已经被输出,无法发送PDF

为了解决这个错误: 前往fpdf.php文件,在其中找到第996行。

function Output($name='', $dest='')

之后进行如下更改:

function Output($name='', $dest='') {   
    ob_clean();     //Output PDF to so

我点赞这个答案是因为它有效,特别是在你的 <?php ?> 标签外面有空格或换行符,并且无法找到它们的情况下。从调用函数中调用 "ob_clean" 可能更安全,而不是在 "Output" 函数内部调用。请注意,它也会隐藏可能实际上导致问题的任何合法错误消息。如果您修复错误(无论如何都应该这样做),那么可能会解决您的问题,而不需要使用此类“黑客”技巧。 - UncaAlby
我使用了那个,但是它显示给我 - 注意:ob_clean():在/var/www/html/-------/fpdf.php的第981行中未能删除缓存。没有要删除的缓存。 - Wasim Khan
这对我来说完美地运作着。我给你点赞。 - Naren Verma
在将文件从一个新服务器移动到另一个新服务器后,我注意到了OP指出的错误。没有做任何更改,只是从Windows Server 2012更新到2016。添加ob_clean();解决了问题。 - Burndog
对我来说完美的工作。 当我尝试比较两个字符串时,我遇到了这个问题。 - Keno
我正在使用这个库:https://github.com/myokyawhtun/PDFMerger,它对我很有效。相反,我修改了`/tcpdf/tcpdf.php`。 - mike

5
尝试在不选中“BOM注释”选项的情况下保存文件,即在Adobe Dreamweaver中,选择“另存为”,取消文件名下方的复选框,“包括Unicode签名(BOM)”。
在Notepad++中,您应该选择菜单:编码,“以UTF-8无BOM编码”。
并将其设置为其他创建的文件的默认值,这将在未来节省很多麻烦。

3
在我的情况下,我设置了:
ini_set('display_errors', 'on');
error_reporting(E_ALL | E_STRICT);

当我发出生成报告的请求时,浏览器显示了一些警告(如使用弃用函数)。关闭 display_errors 选项后,报告成功生成。

3

你好,你的页面顶部是否有一个会话头或任何包含文件?如果有,那么尝试在页面顶部添加以下代码,应该可以正常工作。

<?

while (ob_get_level())
ob_end_clean();
header("Content-Encoding: None", true);

?>

干杯🍻


2

如果您的代码在PDF生成之前输出提示/警告,请尝试将其关闭。使用error_reporting(0)命令。然后再处理警告信息。


4
这应该发布为评论。 - Marko Popovic

2

FPDF错误信息将指向发送某些内容的PHP行。

如果您没有任何提示,哪个文件和行发送了一些内容,则可能在您的包含/要求文件中存在编码不匹配。

对于我而言:

  • fpdf.php 是 ANSI 编码的,
  • 我的 pdf-generator.php 是 UTF-8 编码的,以及
  • 我的 database-connect-inlude 是 UTF-8 编码的(这个 UTF-8 编码引发了 FPDF 错误。我不得不将其切换回 ANSI)

2

包含的 PHP 文件中即使有一个空格也会导致该警告。任何情况下都不应该有任何输出。


2

在脚本开头添加

ob_start();
require ('fpdf.php');

并且在最后,output()之后。
ob_end_flush();

它对我有用!=)


今天出现了这个错误。它过去三年一直在工作,但今天无法工作。 - Rajesh
这个方法很有效,但请确保您没有div或其他HTML内容(即使是空格),否则会悄悄失败。 - m3nda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接