DOMPDF: Não é possível transmitir o pdf: headers já enviados

Esta questão foi levantada centenas de vezes em vários fóruns; Alguns foram resolvidos, outros não. Verifiquei muitos resources, mas meu problema não pôde ser resolvido. Estou gerando a página do php usando o modelo smarty com base na input do formulário html e arquivos carregados. Usando dompdf, eu quero salvar a página gerada como um arquivo pdf. Quando o usuário envia o multipart / form-data, os dados são postados para si próprio. Então, ele é submetido ao processo de validação. Quando tudo está bem, uma nova página é gerada usando um arquivo de modelo. Não há saída, em vez disso, dompdf utiliza o arquivo de modelo para transmitir o arquivo pdf. Depois de resolver vários estágios de problemas como “DOMPDF não encontrado”, memory insuficiente, etc., agora estou preso com o erro “Não é possível transmitir pdf: headers já enviados”. Um dos problemas mais comuns é a presença de quebra de linha, espaço em branco ou qualquer saída antes do stream () é chamado. Verifiquei o espaço em branco antes e depois? Também não existem instruções de impressão_f ou eco. Como posso solucionar esse problema? Onde o problema está … no arquivo de modelo smarty ou no próprio arquivo php? Aqui está o código:

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"); 

solução simples:

escreva abaixo das linhas antes do stream, ele irá mostrar onde exatamente a nova linha ou espaço está chegando

 $f; $l; if(headers_sent($f,$l)) { echo $f,'
',$l,'
'; die('now detect line'); }

Provavelmente há um espaço em branco ou uma nova linha em algum lugar do seu código, causando isso. Aqui está uma maneira simples de depurá-lo:

  1. faça eco de algo no final do seu script (acima da chamada stream ()), por exemplo echo "end!";exit;
  2. Clique para “visualizar a fonte” da sua página, o que torna os espaços mais fáceis de ver
  3. Se o seu “fim!” A corda não aparece no início do seu script, então em algum lugar há um personagem impresso
  4. Mova o “fim do eco!” linha mais adiante do seu código, até que você localize onde o espaço foi inserido

Outra possibilidade é que você esteja usando uma string de linguagem em algum lugar que apresente um caracter não imprimível. Se o seu aplicativo for multilíngüe, certifique-se de testar usando inglês

Eu tentei ecoar, mas nenhum espaço em branco ou quebras de linha foram encontrados. No final, redirecionava o php para outra página em vez de PHP_SELF e o problema desapareceu. Não alterei nenhum código. Parece que a presença de tags html após o php terminou foi o fator ofensivo.

Certifique-se de que o seu editor não adicione uma descrição do Unicode Bom – guarde o código no arquivo pelo Bloco de Notas, ou (se você trabalha no Dreamweaver), remova o check por Assign Unicode Signature (BOM) ou algo assim. 😉

Substitua a linha 3105 deste arquivo: dompdf/lib/class.pdf.php

 if ( headers_sent()) { die("Unable to stream pdf: headers already sent"); } 

Com

 $output = ob_get_clean(); if ( headers_sent()) { echo $output; } 

Então, no arquivo que está gerando a saída de pdf, por exemplo, se você estivesse saindo de componentes do Componente do Joomla / com_joomlacomponent / views / yourpdfdir / tmpl / default.php Digite imediatamente após a tag de abertura do php

  

Encontrei este problema. Você deseja verificar todas as variables ​​que você está usando. Uma ou mesmo mais de uma variável que você está passando vem vazia e está mexendo no render.

Comece gradualmente, ao se livrar de todo o php e tentar gerar o pdf, então, se ele funcionar, adicione um bloco de código por bloco .

Isso irá ajudá-lo a identificar onde o problema é.

No meu caso, o problema foi resolvido configurando $ _dompdf_show_warnings para false em dompdf_config_inc.php

Eu tive esse problema, sem saída aparente ao visualizar a fonte. O problema para mim foi que eu tinha corrompido o resultado, mesmo que não existisse, exceto os headers, e que bloqueou a transmissão da saída dando a mensagem “encaminhamentos já enviados”. O que era verdade. Minha correção foi remover as instruções flush () e ob_flush (), e a saída de transmissão funcionou.

para mim – a solução era codificar meu arquivo para UTF-8 em vez de UTF-8 BOM