[mirror] Generates barcoded PDF to backup text files on paper
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.
 
backupill/backupill/backuper.py

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")