Thiagosm’s Weblog

June 7, 2008

Código de barra em python para boleto bancário.

Filed under: python — thiagosm @ 6:02 am

A um tempo atrás, estava desenvolvendo um sistema para provedor à rádio e surgiu interesse de gerar boleto bancário para os clientes. A idéia era quando o cliente tivesse bloqueado, seria redirecionado para uma página de bloqueio e identificando-se por IP e CPF, disponibilizar impressão do boleto bancário para efetuar o pagamento.

Eu já tinha visto vários exemplos com java, php porém com python utilizando o padrão 2 por 5 intercalado eu não tinha achado. Como o sistema de provedor é feito em python com turbogears, o ideal era ser feito em python.

Vamos agora ao que interessa, mostrar a classe.

É necessário ter biblioteca PIL instalada para utilizarmos a Image e a ImageDraw

Simples classe que eu utilizo:

#!/usr/bin/env python
# encoding: utf-8

import Image
import ImageDraw

class codigodebarra:
    def __init__(self):
        pass

    def getcodbarra(self, valor, posX=0, posY=0, height = 50):

        # padrão 2 por 5 intercalado ( utilizado em boletos bancários )
        padrao = ('00110', '10001', '01001', '11000', '00101',
                  '10100', '01100', '00011', '10010', '01010')

        # criando imagem
        imagem = Image.new('RGB',(750,80),'white')
        draw = ImageDraw.Draw(imagem)

        # verificando se o conteudo para gerar barra é impar, se for,
        # adiciona 0 no inicial para fazer intercalação em seguida dos pares 

        if (len(valor) % 2) != 0:
            valor= '0' + valor

        # faz intercalação dos pares
        l=''
        for i in range(0,len(valor),2):
            p1=padrao[int(valor[i])]
            p2=padrao[int(valor[i+1])]
            for p in range(0,5):
                l+=p1[:1] + p2[:1]
                p1=p1[1:]
                p2=p2[1:]

        # gerando espaços e barras
        barra=True
        b=''

        # P = preto
        # B = banco

        for i in range(0,len(l)):
            if l[i] == '0':
                if barra:
                    b+='P'
                    barra=False
                else:
                    b+='B'
                    barra=True
            else:
                if barra:
                    b+='PPP'
                    barra=False
                else:
                    b+='BBB'
                    barra=True

        # concatena inicio e fim
        b='PBPB' + b + 'PPPBP'

        # P = preto
        # B = banco 

        # percorre toda a string b e onde for P pinta de preto, onde for B pinta de banco 

        for i in range(0,len(b)):
            if b[i] == 'P':
                draw.line((posX,posY,posX,posY + height),'black')
            else:
                draw.line((posX,posY,posX,posY + height),'white')
            posX+=1
        return imagem

if __name__ == '__main__':
    # criando instância do objeto codigodebarra
    barra = codigodebarra()

    # codigo de barra completo em dígitos
    codigo='23793391265970787924921001306006538680000010567'
    # formato que deseja salvar a imagem (PNG,GIF)
    tipo='GIF'

    # retornando uma imagem a partir do código de barra
    image = barra.getcodbarra(codigo)

    # salvando imagem do tipo informado na variavel tipo
    image.save('%s.%s'%(codigo,tipo), tipo)

Resultado do código :

Advertisements

Blog at WordPress.com.