Created
May 12, 2025 22:42
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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