Skip to content

Instantly share code, notes, and snippets.

@Mikael-Lovqvist
Created May 12, 2025 22:42
Show Gist options
  • Save Mikael-Lovqvist/28cca3d5a1fbd4752c445fa0cfbb6693 to your computer and use it in GitHub Desktop.
Save Mikael-Lovqvist/28cca3d5a1fbd4752c445fa0cfbb6693 to your computer and use it in GitHub Desktop.
Example of using https://github.com/WhyNotHugo/python-barcode for terminals (tested on dark background with FedEx app)
import sys
from io import BytesIO
from barcode import Code128
from barcode.writer import BaseWriter
class TerminalWriter(BaseWriter):
def __init__(self, dark_background=True, padding=16, height=8):
blocks = ' ', '▐', '▌', '█'
def initialize(raw_code):
bit_length = 2
[code] = raw_code
l_padding = padding
r_padding = padding + bit_length - (len(code) % bit_length)
self.text_center_width = len(code) // bit_length
self.text_padding = l_padding // bit_length
code = '0' * l_padding + code + '0' * r_padding
if dark_background:
#Light on dark
rendered_code = ''.join(blocks[~int(code[i:i+bit_length], 2)] for i in range(0, len(code), bit_length))
else:
#Dark on light
rendered_code = ''.join(blocks[int(code[i:i+bit_length], 2)] for i in range(0, len(code), bit_length))
self.pending_result = f'{rendered_code}\n' * height
self.pending_text_line = bytearray(b' ' * len(rendered_code))
def paint_module(xpos, ypos, width, color):
pass
def paint_text(x, y):
text = bytes(self.text, 'ascii')
for index, char in enumerate(text):
self.pending_text_line[
self.text_padding +
(1 + 2 * index) * self.text_center_width // (2 * len(text)) #center under code
] = char
line = str(self.pending_text_line, 'ascii')
self.pending_result += f'\n{line}\n'
def finish():
pass
super().__init__(initialize, paint_module, paint_text, finish)
def write(self, content, target):
assert not content
target.write(bytes(self.pending_result, 'utf-8'))
rv = BytesIO()
Code128(sys.argv[1], writer=TerminalWriter()).write(rv)
print(str(rv.getvalue(), 'utf-8'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment