You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.9 KiB
110 lines
2.9 KiB
import os
|
|
|
|
# import re
|
|
import qrcode
|
|
|
|
# import hashlib
|
|
import logging
|
|
from pyx import *
|
|
|
|
# import subprocess
|
|
from tempfile import mkstemp
|
|
from datetime import datetime
|
|
|
|
|
|
TEXT_X_OFFSET = 0.6
|
|
TEXT_Y_OFFSET = 8.2
|
|
PLAINTEXT_MAXLINECHARS = 73
|
|
|
|
QRCODE_HEIGHT = 8
|
|
QRCODE_PER_PAGE = 6
|
|
QRCODE_MAX_BYTE = 140
|
|
QRCODE_X_POS = [1.5, 11, 1.5, 11, 1.5, 11]
|
|
QRCODE_Y_POS = [18.7, 18.7, 10, 10, 1.2, 1.2]
|
|
|
|
PF_STR = "A4"
|
|
PF_OBJ = document.paperformat.A4
|
|
|
|
# suppressing all the warnings
|
|
for name in logging.Logger.manager.loggerDict.keys():
|
|
logging.getLogger(name).setLevel(logging.CRITICAL)
|
|
|
|
|
|
class Pill:
|
|
def __init__(self, asc_file):
|
|
self.ASC_FILE = asc_file
|
|
|
|
self.pageno = 0
|
|
self.pageid = 0
|
|
self.code_blocks = []
|
|
|
|
self._init_pdf()
|
|
|
|
with open(asc_file) as file:
|
|
self.ASCDATA = file.read()
|
|
|
|
def _init_pdf(self):
|
|
unit.set(defaultunit="cm")
|
|
self.pdf = document.document()
|
|
|
|
def _generate_barcode(self, chunkdata):
|
|
qr = qrcode.QRCode(
|
|
version=1,
|
|
border=4,
|
|
box_size=10,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_L,
|
|
)
|
|
qr.add_data(chunkdata)
|
|
qr.make(fit=True)
|
|
|
|
im = qr.make_image(fill_color="black", back_color="white")
|
|
|
|
return im
|
|
|
|
def _finish_page(self, pdf, canvas, pageno):
|
|
canvas.text(10, 0.6, "Page {}".format(pageno + 1))
|
|
pdf.append(document.page(canvas, paperformat=PF_OBJ, fittosize=0, centered=0))
|
|
|
|
def generate_backup(self):
|
|
chunkdata = "^1 "
|
|
c = canvas.canvas()
|
|
|
|
for char in list(self.ASCDATA):
|
|
if len(chunkdata) + 1 > QRCODE_MAX_BYTE:
|
|
self.code_blocks.append(self._generate_barcode(chunkdata))
|
|
chunkdata = "^" + str(len(self.code_blocks) + 1) + " "
|
|
chunkdata += char
|
|
|
|
self.code_blocks.append(self._generate_barcode(chunkdata))
|
|
|
|
for bc in range(len(self.code_blocks)):
|
|
if self.pageid >= QRCODE_PER_PAGE:
|
|
self._finish_page(self.pdf, c, self.pageno)
|
|
c = canvas.canvas()
|
|
self.pageno += 1
|
|
self.pageid = 0
|
|
|
|
c.text(
|
|
QRCODE_X_POS[self.pageid] + TEXT_X_OFFSET,
|
|
QRCODE_Y_POS[self.pageid] + TEXT_Y_OFFSET,
|
|
"{} ({}/{})".format(
|
|
text.escapestring(self.ASC_FILE), bc + 1, len(self.code_blocks)
|
|
),
|
|
)
|
|
|
|
c.insert(
|
|
bitmap.bitmap(
|
|
QRCODE_X_POS[self.pageid],
|
|
QRCODE_Y_POS[self.pageid],
|
|
self.code_blocks[bc],
|
|
height=QRCODE_HEIGHT,
|
|
)
|
|
)
|
|
|
|
self.pageid += 1
|
|
|
|
self._finish_page(self.pdf, c, self.pageno)
|
|
|
|
fd, temp_barcode_path = mkstemp(".pdf", "qr_", ".")
|
|
self.pdf.writetofile(temp_barcode_path)
|
|
os.rename(temp_barcode_path.split(os.sep)[-1], self.ASC_FILE + ".pdf")
|
|
|