Merge pull request 'refactor' (#1) from gomelva/ptouch-print-labels:refactor into main

Reviewed-on: polkovnikovaav/ptouch-print-labels#1
This commit is contained in:
Анна Полковникова 2024-06-03 11:01:38 +03:00
commit a57b7f1ea2
2 changed files with 111 additions and 53 deletions

View File

@ -2,9 +2,17 @@
## Использование ## Использование
```python3 barcodegen.py КОД "Текст"``` ```python3 barcodegen.py ТИП_УСТРОЙСТВА/КОД "Текст"```
либо
```python3 barcodegen.py -i```
для печати нескольких наклеек за раз.
Код должен состоять из 12 цифр. Код должен состоять из 13 цифр.
Тип устройства может быть одним из следующих:
- `comp` - инвентарный номер для компьютера
- `mon` - инвентарный номер для монитора
- `net` - инвентарный номер для сетевого оборудования
- `token` - инвентарный номер для токена
- `print` - инвентарный номер для принтера/МФУ
- `flash` - инвентарный номер для флешки
- `hid` - инвентарный номер для HID устройств
- `ups` - инвентарный номер для UPS устройств
- `other` - инвентарный номер для других устройств

View File

@ -1,56 +1,106 @@
import sys,os import argparse
import pathlib
import subprocess
import sys
import time
from textwrap import dedent
from PIL import Image, ImageOps, ImageDraw, ImageFont
from barcode import EAN13 from barcode import EAN13
from barcode.writer import ImageWriter from barcode.writer import ImageWriter
from barcode.errors import NumberOfDigitsError, IllegalCharacterError
from PIL import Image, ImageOps, ImageDraw, ImageFont, ImageColor
from PIL.BdfFontFile import BdfFontFile
class ImageWitoutTextWriter(ImageWriter): PRODUCT_TYPES = {
def _paint_text(self, xpos, ypos): "comp": ("21", "инвентарный номер для компьютера"),
pass "mon": ("22", "инвентарный номер для монитора"),
"net": ("23", "инвентарный номер для сетевого оборудования"),
"token": ("24", "инвентарный номер для токена"),
"print": ("25", "инвентарный номер для принтера/МФУ"),
"flash": ("26", "инвентарный номер для флешки"),
"hid": ("27", "инвентарный номер для HID устройств"),
"ups": ("28", "инвентарный номер для UPS устройств"),
"other": ("29", "инвентарный номер для других устройств"),
}
def create_code_png(n, code, text): BARCODES_PATH = pathlib.Path().absolute() / "barcodes"
my_code = EAN13(code, writer=ImageWitoutTextWriter())
my_code.save("code" + str(n), {"module_height":11.0,"module_width":0.3,"dpi":169, "font_size":0, "text_distance":1})
image_file = Image.open("code{}.png".format(str(n))) def gen_ean13(ptype: str):
image_file = image_file.convert('1', dither=Image.Dither.NONE) product_code = PRODUCT_TYPES[ptype][0]
img=ImageOps.expand(image_file, border=17, fill=1) digits = product_code + str(round(time.time()))
draw = ImageDraw.Draw(img) digits = [int(i) for i in digits]
dst = "terminus.pil" checksum = (10 - (sum(digits[1::2]) * 3 + sum(digits[::2])) % 10) % 10
#with open("/home/applekeeper_cat/Загрузки/Terminus/ter-u16n.bdf", "rb") as f: return "".join(str(i) for i in (digits + [checksum]))
# bdf = BdfFontFile(f)
# bdf.save(dst)
font = ImageFont.load(dst)
draw.text((10,3), text, fill="black", font=font)
draw.text((100,100), my_code.get_fullcode(), fill="black", font=font)
img.save('code{}.png'.format(str(n)))
code = sys.argv[1]
try:
text = sys.argv[2]
except:
pass
n = 1
if(code == "i"): def create_code_png(filename: str | pathlib.Path, code, text):
while(True): if not filename.parent.exists():
try: filename.parent.mkdir(parents=True)
code = input("Код (q для печати/выхода): ")
if(code == "q"): my_code = EAN13(code, writer=ImageWriter())
com_str = "ptouch-print "
for i in range(1, n): image = my_code.render(
com_str += "--image \"code" + str(i) + ".png\" --pad 5 " writer_options={
os.system(com_str) "module_height": 11.0,
os.system("rm -f code*.png") "module_width": 0.3,
break "dpi": 169,
text = input("Текст: ") "font_size": 0,
create_code_png(n, code, text) "text_distance": 1,
n+=1 "write_text": None,
except (NumberOfDigitsError, IllegalCharacterError): }
print("Код введен неправильно.") )
else:
create_code_png(1, code, text) image = image.convert("1", dither=Image.Dither.NONE)
os.system("ptouch-print --image \"code1.png\"") image = ImageOps.expand(image, border=17, fill=1)
os.system("rm -f code1.png") draw = ImageDraw.Draw(image)
dst = "terminus.pil"
font = ImageFont.load(dst)
text_length = draw.textlength(text, font=font)
code_text_length = draw.textlength(code, font=font)
draw.text(((image.width - text_length) / 2, 3), text, fill="black", font=font)
draw.text(
((image.width - code_text_length) / 2, 100),
code,
fill="black",
font=font,
)
image.save(filename)
def parse_args():
help_for_text = """\
code is must be a 13 digit code
or one of the following:
"""
help_for_text = dedent(help_for_text) + "\n".join(
f"{code} - {desc[1]}" for code, desc in PRODUCT_TYPES.items()
)
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("code", type=str, help=help_for_text)
parser.add_argument(
"text", type=str, nargs="?", default="", help="Description for barcode"
)
parser.add_argument("--print", action=argparse.BooleanOptionalAction, default=True)
return parser.parse_args()
def main():
args = parse_args()
if args.code not in PRODUCT_TYPES:
if args.code.isdigit() and len(args.code) == 13:
barcode = args.code
else:
print("Invalid args")
sys.exit(1)
else:
barcode = gen_ean13(args.code)
filename = BARCODES_PATH / f"{barcode}.png"
print(f"Generated code: {barcode}")
create_code_png(filename, barcode, args.text)
if args.print:
subprocess.run(["ptouch-print", "--image", filename])
if __name__ == "__main__":
main()