gerar boletos php em PDF utilizando TCPDF

521 views
Skip to first unread message

Lasaro

unread,
Jun 27, 2014, 8:41:09 AM6/27/14
to php-b...@googlegroups.com, ph...@googlegroups.com
Bom dia!

Senhores,

Estou tentando gerar meus boletos em pdf utilizando a biblioteca TCPDF.
Dá erro para gerar a imagem do código de barras, exibindo a informação abaixo:
  TCPDF ERROR: Some data has already been output, can't send PDF file
Alguém já conseguiu contornar esta situação?

Valeu,
Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente. 

Leonardo Weslei Diniz

unread,
Jun 27, 2014, 9:32:16 AM6/27/14
to ph...@googlegroups.com, php-b...@googlegroups.com
Chama um ob_start e antes de dar output executa um ob_clean, isso ta acontecendo porque em algum lugar você imprimiu algo na tela impossibilitando a modificação dos headers para saída do PDF.
Att.


--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg
---
Você recebeu essa mensagem porque está inscrito no grupo quot;PHP MG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para phpmg+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Leonardo Weslei Diniz
Inteligencia de negócios • DPC Distribuidor Atacadista • http://www.dpcnet.com.br/
leonard...@gmail.com • leon...@leonardoweslei.com • leon...@agilesoft.com.br
Cel.: +55 33 8405-7254 • Skype: leonardoweslei
 • http://agilesoft.com.br • http://leonardoweslei.com
http://fb.com/leonardoweslei • http://twitter.com/leonardoweslei
 • CV: http://linkedin.com/in/leonardoweslei

Lasaro

unread,
Jun 27, 2014, 10:07:26 AM6/27/14
to ph...@googlegroups.com
Leonardo,

ob_start e ob_clean não resolveu.

Leonardo Weslei Diniz

unread,
Jun 27, 2014, 10:31:36 AM6/27/14
to ph...@googlegroups.com
Verifique se não tem nenhum print, echo ou saída HTML nos códigos chamados antes da chamada do out.

Lasaro

unread,
Jun 27, 2014, 10:49:10 AM6/27/14
to ph...@googlegroups.com
Leonardo,

tem não, o erro só ocorre qdo chamo o código de barras (fbarcode($dadosboleto["codigoBarras"]))

Lasaro

unread,
Jul 1, 2014, 9:30:25 AM7/1/14
to php-b...@googlegroups.com, ph...@googlegroups.com
Maico, boa pedida...

Acho que é por ai msm...
Compartilhando o problema com todos é melhor assim chegamos a uma solução mais rápida e esta facilita a vida de mtos que passarem por aqui...
Fiz algumas modificações no código, ele estava apresentando erros de fechaChaves, segue o código com modificações http://pastebin.com/DpRnhdFg
Porém agora está dando erro na linha 6 (
Fatal error: Call to undefined function geraCodigoBanco() in /var/www/html/sindicoatende/funcoes_itau.php on line 6)
Percebi que falta fazer as funções qto a sua pergunta na linha 75 é uma boa, peguei o script pronto então tenho que analizar com mais calma.
Vou analisar com mais calma no decorrer do dia.

Obrigado pela contribuição.
Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.




Em 30 de junho de 2014 22:39, Maicon Pinto <maiconsi...@gmail.com> escreveu:
Oi Lásaro, eu não conheço a biblioteca, mas de qualquer forma, seguindo o erro, faz um teste se possível:

http://pastebin.com/bxVqbNrR

Em resumo, só troquei a parte em que dava "echo" ou exibia HTML, e coloquei em um variável e dei return no final.

Se puder testar e avisar erro ou solução...

;)

--
Você recebeu essa mensagem porque está inscrito no grupo quot;php-brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para php-brasil+...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para php-b...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/php-brasil.

Para mais opções, acesse https://groups.google.com/d/optout.



--

Lasaro

unread,
Jul 1, 2014, 9:33:22 AM7/1/14
to php-b...@googlegroups.com, ph...@googlegroups.com
Esqueci de comentar, sei q o erro que apresenta é devido a falta da função...
Vou ter q fazê-la de outra forma? ou seria como a anterior?
No decorrer do código, existem outras funções... sei que terei que refazê-las todas.
--

Lasaro

unread,
Jul 1, 2014, 12:08:07 PM7/1/14
to php-b...@googlegroups.com, ph...@googlegroups.com
Maico,

Acrescentei as funções, e nada.... finalmente mesmo erro, voltamos a estaca zero (TCPDF ERROR: Some data has already been output, can't send PDF file).
Segue o link do código http://pastebin.com/dRrRkDNj
Acho pouco provável o erro estar no layout, por desencargo de consciência, segue o código do meu layout http://pastebin.com/AHCh2As3

Algum palpite?

Valeu pela atenção...

Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.

--

Vinícius Bertoldi

unread,
Jul 1, 2014, 12:56:54 PM7/1/14
to ph...@googlegroups.com
Lasaro,

Não sei se foi pq deu <<enter>> antes de colar o código, mas tem espaço e linha em branco antes do <?php
Tem que tirar tudo antes do <?php e depois do ?> principalmente se estiver usando include.
Já tentou fazer essa busca??

sds,

Lasaro

unread,
Jul 1, 2014, 1:17:03 PM7/1/14
to ph...@googlegroups.com
Perfeito, Vinícius, é exatamente isto msm.
Agora vou ter q trabalhar o layout para exibir corretamente as informações em seus respectivos lugares.

Valeu,
Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.


--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg
---
Você recebeu essa mensagem porque está inscrito no grupo quot;PHP MG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para phpmg+un...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--

Lasaro

unread,
Jul 1, 2014, 1:18:40 PM7/1/14
to ph...@googlegroups.com
Já vi q a briga agora é com o TC + vamos lá...
--

Lasaro

unread,
Jul 8, 2014, 6:29:32 PM7/8/14
to php-b...@googlegroups.com, ph...@googlegroups.com
Prezados,

Consegui gerar código de barras utilizando o TCPDF.
Para quem precisar, segue uma breve explicação de como fiz.

No arquivo do layout você faz um include da biblioteca: require_once('tcpdf/tcpdf_barcodes_1d.php');
Como utilizei os códigos do boleto php, precisei retirar os pontos da linha digitável, utilizei str_replace: $linhaDigitavelTC=str_replace(".", "", $dadosboleto["linhaDigitavel"]);
Em seguida armazenei na variável $params uma função que chama o a biblioteca enviando a linha digitável: $params = $pdf->serializeTCPDFtagParameters(array($linhaDigitavelTC, 'C128', '', '', 100, 10, 1, array('position'=>'S',  'bgcolor'=>array(255,255,255)), 'N'));    
Após, concatenei o código com o html: $html .= '<tcpdf method="write1DBarcode" params="'.$params.'" />';   
 
Consegui desta forma, se eu estiver enganado em alguma coisa, quem puder me corrigir eu agradeço.
Enviarei meus boletos ainda hoje para homologação.

Abs,
Lásaro




Em 3 de julho de 2014 16:29, Weliton Júnior <welitonvi...@gmail.com> escreveu:

Lasaro,

Quando você tentou utilizar deu que erro?

Olhando seu código no pastebin, coloque antes da linha: $pdf->writeHTML($html); isso:

         - $html.= 
codigoBarra($dadosboleto["codigo_barras"]);


Abraços,

Weliton Vieira Júnior
http://about.me/welitonjunior


Em 3 de julho de 2014 14:27, Lasaro <lasaroc...@gmail.com> escreveu:
Welliton,


É mais ou menos por aí msm.
Pesquisando na web descobri que o TCPDF tem funções exclusivas para gerar códigos de barras:

Barcodes

  1. [HTML] [PHP] 1D barcode in HTML format
  2. [PNG] [PHP] 1D barcode in PNG format
  3. [SVG] [PHP] 1D barcode in SVG format
  4. [SVGI] [PHP] 1D barcode in SVGI format
  5. [HTML] [PHP] 2D datamatrix barcode in HTML format
  6. [PNG] [PHP] 2D datamatrix barcode in PNG format
  7. [SVG] [PHP] 2D datamatrix barcode in SVG format
  8. [SVGI] [PHP] 2D datamatrix barcode in SVGI format
  9. [HTML] [PHP] 2D pdf417 barcode in HTML format
  10. [PNG] [PHP] 2D pdf417 barcode in PNG format
  11. [SVG] [PHP] 2D pdf417 barcode in SVG format
  12. [SVGI] [PHP] 2D pdf417 barcode in SVGI format
  13. [HTML] [PHP] 2D qrcode barcode in HTML format
  14. [PNG] [PHP] 2D qrcode barcode in PNG format
  15. [SVG] [PHP] 2D qrcode barcode in SVG format
  16. [SVGI] [PHP] 2D qrcode barcode in SVGI format

Estou pesquisando como passar os parâmetros...

A sua seria uma boa, tentei utilizar não consegui. Também pelo mesmo motivo que não consegui utilizar do TC.

Como passo os valores para sua função? como chamo a função no layout?


Obrigado pela atenção.


abs,


Lásaro Carvalho

Site:
www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.




Em 3 de julho de 2014 11:15, Weliton Júnior <welitonvi...@gmail.com> escreveu:

Lasaro,

Tive um problema com o código de barras em um boleto e resolvi alterando a função que montava ele. Altere a função que monta o código de barras por essa que estou encaminhando e concatena com $html. A função faz a mesma coisa que a sua, só que não usa imagens..


    function codigoBarra($linhaDigitavel) {
        $codigo = $linhaDigitavel;
        $barcodes = array('00110', '10001', '01001', '11000', '00101', '10100', '01100', '00011', '10010', '01010');
        $barraStart = '<div class="barcode"><div class="black thin"></div><div class="white thin"></div><div class="black thin"></div><div class="white thin"></div>';
        $barraStop = '<div class="black large"></div><div class="white thin"></div><div class="black thin"></div></div>';
        $retorno = "";

        for ($a = 9; $a >= 0; $a--) {
            for ($b = 9; $b >= 0; $b--) {
                $ind = ($a * 10) + $b;
                $texto = "";

                for ($c = 1; $c < 6; $c++) {
                    $texto .= substr($barcodes[$a], ($c - 1), 1) . substr($barcodes[$b], ($c - 1), 1);
                }
                $barcodes[$ind] = $texto;
            }
        }

        while (strlen($codigo) > 0) {
            $codEsq = (int) round($this->esquerda($codigo, 2));
            $codigo = $this->direita($codigo, strlen($codigo) - 2);
            $binario = $barcodes[$codEsq];

            for ($i = 1; $i < 11; $i += 2) {
                $retorno .= "<div class='black " . (substr($binario, ($i - 1), 1) == "0" ? "thin" : "large") . "'></div>";
                $retorno .= "<div class='white " . (substr($binario, $i, 1) == "0" ? "thin" : "large") . "'></div>";
            }
        }

        return $barraStart . $retorno . $barraStop;
    }

// 
.barcode .thin.black {
    border-left-width: 1px;
}
.barcode .thin.white {
    width: 1px;
}
.barcode .large.black {
    border-left-width: 3px;
}
.barcode .large.white {
    width: 3px;
}
.barcode .black {
    border-color: #000;
    border-left-style: solid;
    width: 0;
}
.barcode .white {
    background: none repeat scroll 0 0 #fff;
}

.barcode div {
    display: inline-block;
    height: 100%;
}


Abraços,

Weliton Vieira Júnior
http://about.me/welitonjunior


Em 3 de julho de 2014 08:48, Lasaro <lasaroc...@gmail.com> escreveu:

Leandro,

Fiz uns testes aqui e não funfou...
Inseri os códigos no layout conforme abaixo:
<?php
ob_start();
//resto do código

ob_end_clean();
$pdf->Output();
 
//$pdf->Output("teste.pdf","D");
?>


Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.


Em 3 de julho de 2014 08:10, Leandro Chaves <leandro...@gmail.com> escreveu:

Lazaro,
Faz um teste.
Coloca ob_start(http://www.php.net/manual/pt_BR/function.ob-start.php) no início do seu script, ele tem que estar antes da execução de qualquer outro código, bom no início do arquivo que é chamado pelo navegador.

E antes de do $pdf->Output(), usa ob_end_clean(http://www.php.net/manual/pt_BR/function.ob-end-clean.php).





Em 2 de julho de 2014 19:43, Lasaro <lasaroc...@gmail.com> escreveu:

Jean,

Valei pela dica.
Consegui fazer o layout do boleto conforme pretendo. Meu único problema agora é exibir o código de barras na função TCPDF.
O restante já consegui.
Segue meu layout depois de todas as correções http://pastebin.com/9HjWmcyS
Segue as funções http://pastebin.com/0X5NQSb6
O erro não está na função, comentando a linha $pdf->Output(); e dando um echo $html; o código de barras exibe perfeitamente.

Vc tem alguma idéia de onde esteja o erro?

Valeu,
Lásaro Carvalho
Site: www.lasarocarvalho.com.br
Antes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente.



Em 2 de julho de 2014 09:28, Jean Rafael Tardem Delefrati <jeande...@gmail.com> escreveu:

@Lasaro, o problema é saída antes da alteração do cabeçalho pelo PHP, porque o TCPDF altera estes dados.

Pensa o seguinte:

Quando você faz uma requisição de uma página para um computador via TCP/IP, ele vai mandar o pedido para o Apache (ou outro servidor) e o servidor vai tentar entender a requisição pela extensão do arquivo ou por outras configurações que você faça. 

Considerando uma requisição normal, digamos que a extensão do arquivo é .php, o Apache vai enviar um comando para o PHP processar aquela página e esperar um retorno, que, geralmente, é dividido em duas partes: um cabeçalho e o conteúdo da requisição (esse é o padrão TCP/IP). 

Esse cabeçalho tem as informações do arquivo que vai ser exibido, como tipo, tamanho, nome do arquivo etc. e é através dele que o Apache vai saber que tipo de retorno ele vai mandar para o cliente. Você pode até ver pela aba "Rede" do console do Chrome ou do Firebug.

O PHP permite alterar esses cabeçalhos que vão ser enviados para o Apache usando o comando "header". O problema é quando você altera esse comando depois que já mandou para o Apache o "corpo" do arquivo, que é esse o erro que está aparecendo para você. 

No seu caso, o PHP já está te avisando que ele não consegue alterar mais o tipo de retorno para PDF, porque ele já enviou alguma coisa para o Apache e este já enviou para o cliente como texto.

Agora a solução seria retirar qualquer coisa que possa estar sendo enviada para o Apache pelo PHP, eu chuto duas possibilidades: 
- Espaço antes do "<?php" - lembre-se que espaço também é texto
- BOM - Marca de ordem de Byte (Byte Order Mark, explicações aqui: http://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte), que nesse caso você corrige pelo editor que você está usando, você precisa abrir o arquivo e salvar novamente no formato unicode "sem BOM" (https://www.google.com/search?hl=en&q=notepad+salvar+unicode+sem+bom&rlz=1I7GGHP_pt-BR&gws_rd=ssl#hl=en&q=+salvar+unicode+sem+bom)

A outra possibilidade é você ter PHP fechando e abrindo dentro do arquivo ?> tipo assim <?php, que, na prática, é a mesma coisa que dar um echo, mas acho que esse problema o pessoal já corrigiu ali nos e-mails anteriores.

Abraço





--



--



--
Reply all
Reply to author
Forward
0 new messages