TCPDF ERROR: Some data has already been output to browser, can't send PDF file

Saudações prezados!

Estou desenvolvendo um sistema para gerar relatórios com TCPDF. O sistema está a funcionando perfeitamente no ambiente em desenvolvimento, mas quando publico para o ambiente em produção, os relatórios estão a gerar os erros na imagem em anexo.

Obs.: Já verifiquei as versões do php, e nos dois ambientes estão a rodar a mesma. Já testei em 3 ambientes diferentes, inclusive dentro do proprio servidor de desenvolvimento.

Preciso de ajuda para solucionar esse problema.

Segue, abaixo, o meu código na blank:

//////////////////////////////////////////////////////////////////////////////////////////////
// 								ENDEREÇAMENTO DAS BIBLIOTECAS
///////////////////////////////////////////////////////////////////////////////////////////////

sc_include_lib("tcpdf");

sc_include_library("prj", "laudo_tecnico", "laudo.php", true, true);

///////////////////////////////////////////////////////////////////////////////////////////////
// 							DEFINIÇÕES GERAIS DO RELATÓRIO
///////////////////////////////////////////////////////////////////////////////////////////////

// Criar um Novo Documento PDF
$pdf = new MYPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

///////////////////////////////////////////////////////////////////////////////////////////////
// 							DEFINIÇÕES DA APARENCIA DO RELATÓRIO
///////////////////////////////////////////////////////////////////////////////////////////////

// Conjunto de Informações de Documentos
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('EVANDRO ROSA');
$pdf->SetTitle('PARECER TÉCNICO');
$pdf->SetSubject('TCPDF Relatório Imagem');
$pdf->SetKeywords('TCPDF, PDF, exemplo, PDFReport, Imagem');

// Definições das Informações do Cabeçalho Padrão
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));

// Definição das Fontes do Header e Footer
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));

// Definição das Fontes Monospaced
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// Definição das Margens ESQUERDA, DIREITA E BAIXO
$pdf->SetMargins(14, 28, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);

// Definição da Quebra de Pagina Automática
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// Definição da Escala de Imagem
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// Regua de Apoio com espaçamento da grade de 5mm
$pdf->grid = false;

// Definição da Fonte
$pdf->SetFont('Times', '', 10, '', 'false');

$pdf->SetLineWidth(0.508);

// Adicionar Pagina
$pdf->AddPage();

//TICKET E REQUERENTE
sc_lookup(rs,"SELECT n_ticket, titulo_ticket, requerente, matricula_requerente FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$n_ticket={rs[0][0]};
$titulo_ticket={rs[0][1]};
$requerente={rs[0][2]};
$matricula_requerente={rs[0][3]};
}else{
$n_ticket="";
$titulo_ticket="";
$requerente="";
$matricula_requerente="";
}
/*
$pdf->Cell(35,13,'Ticket '.$n_ticket,1,0,'C');
$pdf->Cell(90,13,$titulo_ticket,1,0,'C');
$pdf->MultiCell(55,13,'Requerente: '. $requerente.'(Mat. '.$matricula_requerente.')',1,'C');
*/

$tbl = <<<EOD
<table border="1" cellpadding="5" cellspacing="0">
	<tr>
		<td width="19.5%" align="center"> <b>Ticket:</b> $n_ticket</td>
		<td width="50%" align="center"><b>$titulo_ticket</b></td>
		<td width="30%"> <b>Requerente:</b><br>$requerente (Mat. $matricula_requerente)</td>
	</tr>
</table>
EOD;
$pdf->writeHTML($tbl, true, false, false, false, '');
$pdf->Ln(1);

//DEFEITO RELATADO(REQUERENTE)
sc_lookup(rs,"SELECT descricao_defeito_relatado FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$descricao_defeito_relatado={rs[0][0]};
}else{
$descricao_defeito_relatado="";
}

$tbl = <<<EOD
	<tr>
		<td>
			<table border="1" bgcolor="#cad1da" cellpadding="5" cellspacing="0"> 
				<tr>
					<td align="center" height="25"><h3>Defeito relatado(Requerente)</h3></td>
				</tr>
				<tr style="background-color:#fff;" align="justify">
					<td align="" style="font-size: 14px">$descricao_defeito_relatado<p></p></td>
				</tr>
			</table>
		</td>
	</tr>
EOD;
$pdf->writeHTML($tbl, true, false, false, false, '');
$pdf->Ln(1); 

//DADOS DO EQUIPAMENTO
sc_lookup(rs,"SELECT tipo_equipamento, codigo_equipamento, bem_patrimonial FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$tipo_equipamento={rs[0][0]};
$codigo_equipamento={rs[0][1]};
$bem_patrimonial={rs[0][2]};
}else{
$tipo_equipamento="";
$codigo_equipamento="";
$bem_patrimonial="";
}

$tbl = <<<EOD
<table>
	<tr>
		<td>
			<table border="1" bgcolor="#cad1da" cellpadding="5" cellspacing="0"> 
				<tr>
					<td align="center" height="25"><h3>Dados do equipamento</h3></td>
				</tr>
				<tr style="background-color:#fff;">
					<td style="font-size: 14px"> Tipo de equipamento: $tipo_equipamento
								    		 <p> ID do equipamento: $codigo_equipamento</p>
								    		 <p> Bem patrimonial: $bem_patrimonial</p><p></p>
					</td>
				</tr>
			</table>
		</td>
	</tr>
</table>
EOD;
$pdf->writeHTML($tbl, true, false, false, false, '');
$pdf->Ln(1);

//RESULTADO DO DIAGNÓSTICO
sc_lookup(rs,"SELECT resultado_diagnostico FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$resultado_diagnostico={rs[0][0]};
}else{
$resultado_diagnostico="";
}

$tbl = <<<EOD
<table>
	<tr>
		<td>
			<table border="1" bgcolor="#cad1da" cellpadding="5" cellspacing="0">
				<tr>
					<td align="center" height="25"><h3>Resultado do diagnóstico</h3></td>
				</tr>
				<tr style="background-color:#fff;">
					<td align="" style="font-size: 14px">$resultado_diagnostico<p></p></td>
				</tr>
			</table>
		</td>
	</tr>
</table>
EOD;
$pdf->writeHTML($tbl, true, false, false, false, '');
$pdf->Ln(1);

//CONCLUSÃO
sc_lookup(rs,"SELECT conclusao FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$conclusao={rs[0][0]};
}else{
$conclusao="";
}

$tbl = <<<EOD
	<tr>
		<td>
			<table border="1" bgcolor="#cad1da" cellpadding="5" cellspacing="0">
				<tr>
					<td align="center" height="25"><h3>Conclusão e recomendação</h3></td>
				</tr>
				<tr style="background-color:#fff;">
					<td style="font-size: 14px">$conclusao<p></p></td>
				</tr>
			</table>
		</td>
	</tr>
EOD;
$pdf->writeHTML($tbl, true, false, false, false, '');
$pdf->Ln(4);

//$pdf->AddPage('H', 'A4');
//$pdf->SetAutoPageBreak(true,14);

$pdf->Ln();

//$pdf->Cell(100,5,'Evandro Filomeno Correia da Rosa',0,0,'C');

sc_lookup(rs,"SELECT nome_tecnico, matricula_tecnico, chefe_sector, matricula_chefe_sector, chefe_departamento, matricula_chefe_departamento FROM laudo_tecnico WHERE id_parecer_tecnico=[ids]");
if(!empty({rs})){
$nome_tecnico={rs[0][0]};
$matricula_tecnico={rs[0][1]};
$chefe_sector={rs[0][2]};
$matricula_chefe_sector={rs[0][3]};
$chefe_departamento={rs[0][4]};
$matricula_chefe_departamento={rs[0][5]};
}else{
$nome_tecnico="";
$matricula_tecnico="";
$chefe_sector="";
$matricula_chefe_sector="";
$chefe_departamentor="";
$matricula_chefe_departamento="";
}

/*
sc_lookup(rs,"SELECT f.matricula FROM sec_users s INNER JOIN funcionarios f ON s.email=f.email WHERE s.login=[usr_name] AND id_parecer_tecnico=[ids]");
if(!empty({rs})){
$mat={rs[0][0]};
}else{
$mat=NULL;
}
*/
$tbl = <<<EOD
			<table border="" width="638">
				<tr>
					<td width="108" align="center">Técnico de Suporte:</td>
					<td width="278">__________________________________________ </td>
					<td width="56">Matrícula:</td>
					<td width="58">_________ </td>
					<td width="30">Data:</td>
					<td width="108">_____/____/_______</td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="108"></td>
					<td width="278" align="center">$nome_tecnico</td>
					<td width="56"></td>
					<td width="58" align="center">$matricula_tecnico</td>
					<td width="30"></td>
					<td width="108"></td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="638"></td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="188" align="center">Chefe de Sector de Suporte Técnico:</td>
					<td width="198">_____________________________ </td>
					<td width="56"></td>
					<td width="58">_________ </td>
					<td width="30"></td>
					<td width="108">_____/____/_______</td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="188"></td>
					<td width="198" align="center">$chefe_sector</td>
					<td width="56"></td>
					<td width="58" align="center">$matricula_chefe_sector</td>
					<td width="30"></td>
					<td width="108"></td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="638"></td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="128" align="center">Chefe de Departamento:</td>
					<td width="258">_______________________________________ </td>
					<td width="56"></td>
					<td width="58">_________ </td>
					<td width="30"></td>
					<td width="108">_____/____/_______</td>
				</tr>
			</table>
			<table border="" width="638">
				<tr>
					<td width="128"></td>
					<td width="258" align="center">$chefe_departamento</td>
					<td width="56"></td>
					<td width="58" align="center">$matricula_chefe_departamento</td>
					<td width="30"></td>
					<td width="108"></td>
				</tr>
			</table>	
EOD;

$pdf->writeHTML($tbl, true, false, false, false, '');
//$pdf->WriteHTML($html);

ob_end_clean();
$pdf->Ln(-4);
$nome_arquivo = $_SESSION['scriptcase']['parecer_tecnico']['glo_nm_path_doc'].'/'.'parecer_tecnico.pdf';
$pdf->Output($nome_arquivo, 'F');	 
$pdf->Output();

Segue, abaixo, o meu código na Biblioteca externa:

<?php

class MYPDF extends TCPDF {

    //Cabeçalho

    function Header()

    {

        // Tipo de fonte

        $this->SetFont('times', 'B', 10);

        // Titulo

        $this->SetTextColor(0,0,0);

        //$this->writeHTMLCell(35, '', '', 10, '<img src="../_lib/img/sys__NM__bg__NM__logo_smc_1.png" />',1);

        $this->writeHTMLCell(35, 14, 14, 10, $this->Image('../_lib/img/sys__NM__bg__NM__logo_smc_1.png', 14, 14, 54, 12),1);

        $this->Cell(90,14,'Parecer Técnico',1,0,'C');

        $this->MultiCell(55,14,'     Departamento de Tecnologia                            de Informação                 Sector de Suporte Técnico',1,'C');

    }

    //Rodape

    public function Footer()

    {  

        // Posicionado a 15mm do final da p&#65533;gina

        $this->SetY(-15);

        // Tipo de fonte

        $this->SetFont('helvetica', 'I', 8);

        // Numero da Pagina

        $this->SetTextColor(0,6,102);

        $this->Cell(0, 6, '______________________________________________________________________________________________________________________', 0,1,'C',0, '', 0, false, 'T', 'C');

        $this->Cell(0);

        $this->Cell(1, 6, ''.$this->getAliasNumPage().' de '.$this->getAliasNbPages().' ', 0, 0, 'C', 0, '', 0, false, 'T', 'C');

    }  

}  

?>

Bom dia.

Como tinha dito em tópico passado, aplicação blank o código é puramente responsabilidade do programador.

Vamos lá, olhando rapidamente seu código, vejo muito html, eu usaria menos html para imprimir conteúdo.

Segundo, se analisar o erro, é porque em algum momento do seu código esta sendo echoado um valor para o browser e a biblioteca TCPF (assim como todas biblitoecas pdf) não permite ecoar html para o browser. Possivelmente o php está encontrando erro no seu código e ecoa o erro para o Browser causando o erro no TCPDF.

Sugestão:

Comente de baixo para cima a maior parte de seu código. Deixe poucas linhas de código, e vá executando até encontrar o erro.

Se tivesse usando a aplicação report pdf poderia colocar em modo debug para analisar melhor o erro.

Como não mostra a linah de erro, configure na app blank para modo debug, erro de sql e erro de script para ver o número da linha e o arquivo com erro, assim vc pode localizar melhor o ponto de seu código que está com erro.

Vejo que vc tem nas cláusulas where de suas querys a global [ids], se [ids] contem mais de um vaçpr separados por algum delimitador vc deve estar encontrando erro de sql

WHERE id_parecer_tecnico=[ids]
1 Curtida

@InfinitusWeb boa tarde, obrigado pelo feedback!