Skip to content

Instantly share code, notes, and snippets.

@edo9k
Created May 31, 2016 22:08
Show Gist options
  • Save edo9k/32d885495b7261193fe2c92cdd65a19b to your computer and use it in GitHub Desktop.
Save edo9k/32d885495b7261193fe2c92cdd65a19b to your computer and use it in GitHub Desktop.
Gera código de barras no estilo usado por bancos brasileiros. (usando a biblioteca PIL) Correção do código encontrado em https://thiagosm.wordpress.com/2008/06/07/codigo-de-barra-em-python/
#!/usr/bin/env python
# encoding: utf-8
import sys
from PIL import Image, ImageDraw, ImageFont
class codigodebarra:
def __init__(self):
pass
def getcodbarra(self, valor, posX=150, posY=0, height = 60):
# 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()
if len(sys.argv) > 1:
codigo = sys.argv[1]
else:
# 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))
@checchia
Copy link

PIL não tem versão para Linux e Python3? Há alguma alternativa?

@edo9k
Copy link
Author

edo9k commented Aug 28, 2020

PIL não tem versão para Linux e Python3? Há alguma alternativa?

Pillow é um fork de PIL que roda en Python3.
https://pillow.readthedocs.io/en/stable/installation.html

Tem um tempo que no programo em Python, mas imagino que não seja difícil atualizar esse código... se não conseguir bate um fio lá no twitter @edo9k 🤑

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment