TCPDF错误:某些数据已经输出,无法发送PDF文件

时间:2013-04-15 08:45:15

标签: php tcpdf

尝试将自己的数组添加到代码中时,我一直收到此错误。 这是我的阵列;

$array = array();

while (odbc_fetch_row($rs))
{
$array[] = odbc_result($rs,'Product Name');
} 
$test = print_r($array);

原始代码在这里。我正在使用示例页面来尝试它,因为我知道示例页面工作正常。

http://www.tcpdf.org/examples/example_001.phps

此代码位于$ html变量之前,当它设置时,我只需将$ test变量添加到$ html变量中。 odbc连接工作正常,示例在我添加任何代码之前工作正常,但是当我运行脚本时,我收到此错误;

Array ( [0] => Test1 [1] => Test2 ) TCPDF ERROR: Some data has already been output, can't send PDF file

数组中还有两个以上的项目。有什么想法吗?

15 个答案:

答案 0 :(得分:30)

只需使用ob_start();在页面顶部。

答案 1 :(得分:22)

添加函数ob_end_clean();在调用输出功能之前。 它在自定义Wordpress功能中为我工作!

ob_end_clean();
$pdf->Output($pdf_name, 'I');

答案 2 :(得分:9)

在调用Output函数之前添加函数ob_end_clean()。

答案 3 :(得分:5)

此问题意味着您有标题。删除标签

  

>

在代码的末尾,并确保在开头没有空格。

答案 4 :(得分:5)

我只是想补充一点,我收到了这个错误,在我将Output目标参数从F更改为FI之前,没有任何问题可以解决。 换句话说,我必须输出文件和内联。

Output('doc.pdf', 'I')

Output('doc.pdf', 'FI')

我不知道为什么这会产生差异,但它为我修复了错误......

答案 5 :(得分:3)

导致“数据已输出”的tcpdf文件位于名为tcpdf.php的tcpdf文件夹中。你可以修改它:

添加 ob_end_clean(); 一行,如下所示(第3行最后一行):

public function Output($name='doc.pdf', $dest='I') {
    //LOTS OF CODE HERE....}
    switch($dest) {
        case 'I': {
        // Send PDF to the standard output
        if (ob_get_contents()) {
        $this->Error('Some data has already been output, can\'t send PDF file');}
        //some code here....}
            case 'D': {         // download PDF as file
        if (ob_get_contents()) {
    $this->Error('Some data has already been output, can\'t send PDF file');}
            break;}
        case 'F':
        case 'FI':
        case 'FD': {
            // save PDF to a local file
                 //LOTS OF CODE HERE.....       break;}
        case 'E': {
            // return PDF as base64 mime email attachment)
        case 'S': {
            // returns PDF as a string
            return $this->getBuffer();
        }
        default: {
            $this->Error('Incorrect output destination: '.$dest);
        }
    }
           ob_end_clean(); //add this line here 
    return '';
}

现在让我们来看看你的代码 我看到你把$ rs和$ sql搞混了。这些是两个不同的东西一起工作。

$conn=odbc_connect('northwind','****','*****');
if (!$conn) {
   exit("Connection Failed: " . $conn);
 }

$sql="SELECT * FROM products"; //is products your table name?
$rs=odbc_exec($conn,$sql);
if (!$rs) {
  exit("Error in SQL");
}

while (odbc_fetch_row($rs)) {
  $prodname=odbc_result($rs,"Product Name"); //but preferably never use spaces for table names.
 $prodid=odbc_result($rs,"ProdID");  //prodID is assumed attribute
  echo "$prodname";
  echo "$prodid";
}
odbc_close($conn);

now you can use the $prodname and output it to the TCPDF output.  

我假设您正在连接到MS访问数据库。

答案 6 :(得分:2)

使用 ob_end_clean();

$ pdf->输出($ file,' I'); 打开pdf。 它对我有用

答案 7 :(得分:1)

对于我的案例,Footer方法的格式错误的html代码(缺少td)导致osx出错。

public function Footer() {
$this->SetY(-40);
$html = <<<EOD
<table>
<tr>
 Test Data
</tr>
</table>
EOD;
$this->writeHTML($html);
}

答案 8 :(得分:1)

我有这个,但与OP不同,我在TCPDF错误消息之前看不到任何输出。

事实证明,在我的脚本开始时,在&lt;?php标记之前有一个UTF8 BOM(字节顺序标记),所以在我有机会调用ob_start()之前。在TCPDF错误消息之前还有一个UTF8 BOM。

答案 9 :(得分:1)

此问题是apache/php显示错误时。

此数据(html)销毁pdf输出。

您必须在 php.ini 中关闭显示错误。

答案 10 :(得分:1)

我有这个奇怪的错误 而罪魁祸首是PHP开放标签开头的空白区域

即使没有ob_flushob_end_clean

确保在white spaces阻止

之后或之后没有额外的<?php ?>

答案 11 :(得分:1)

对于仍面临此问题的用户,请尝试添加:

libxml_use_internal_errors(true);

loadHtml调用之前并添加

libxml_use_internal_errors(false);

通话后

这为我解决了。

答案 12 :(得分:1)

使用ob_start();在代码的开头。

答案 13 :(得分:0)

我遇到了同样的错误,但最终我通过抑制PHP错误解决了它 只需将此代码error_reporting(0);放在打印页面的顶部

    <?php 
    error_reporting(0); //hide php errors
    if( ! defined('BASEPATH')) exit('No direct script access allowed');
    require_once dirname(__FILE__) . '/tohtml/tcpdf/tcpdf.php';
    .... //continue

答案 14 :(得分:0)

“某些数据已经输出,无法发送PDF文件”错误是指PHP的输出缓冲区。

所以您需要在发送输出之前清除输出缓冲区的所有内容。

ob_end_clean(); // Clean any content of the output buffer

然后

$pdf->Output('example_001.pdf', 'I'); // Send the PDF !