[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/utils.py

128 lines
2.9 KiB

3 years ago
import os
# import re
import qrcode
# import hashlib
import logging
from pyx import *
# import subprocess
from tempfile import mkstemp
from datetime import datetime
3 years ago
__all__ = ["generate_backup"]
3 years ago
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)
3 years ago
def _generate_barcode(chunkdata):
"""Generates data barcode image
Args:
chunkdata (str): ASC chunk data
Returns:
class: Represents an image object
"""
3 years ago
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(pdf, canvas, pageno):
"""Adds numbers to bottom of the page
Args:
pdf (class): PDF object
canvas (class): Canvas object
pageno (int): The page number
"""
3 years ago
canvas.text(10, 0.6, "Page {}".format(pageno + 1))
pdf.append(document.page(canvas, paperformat=PF_OBJ, fittosize=0, centered=0))
3 years ago
def generate_backup(ascfile):
"""Generates PDF backup file
3 years ago
Args:
ascfile (str): ASC (.asc) file path
3 years ago
"""
3 years ago
3 years ago
pageno = 0
pageid = 0
codeblocks = []
3 years ago
chunkdata = "^1 "
c = canvas.canvas()
3 years ago
with open(ascfile) as file:
3 years ago
ASCDATA = file.read()
3 years ago
3 years ago
unit.set(defaultunit="cm")
pdf = document.document()
for char in list(ASCDATA):
if len(chunkdata) + 1 > QRCODE_MAX_BYTE:
codeblocks.append(_generate_barcode(chunkdata))
3 years ago
chunkdata = "^" + str(len(code_blocks) + 1) + " "
chunkdata += char
codeblocks.append(_generate_barcode(chunkdata))
3 years ago
for bc in range(len(codeblocks)):
3 years ago
if pageid >= QRCODE_PER_PAGE:
_finish_page(pdf, c, pageno)
c = canvas.canvas()
pageno += 1
pageid = 0
c.text(
QRCODE_X_POS[pageid] + TEXT_X_OFFSET,
QRCODE_Y_POS[pageid] + TEXT_Y_OFFSET,
"{} ({}/{})".format(
text.escapestring(ascfile.split(os.sep)[-1]), bc + 1, len(codeblocks)
3 years ago
),
3 years ago
)
3 years ago
c.insert(
bitmap.bitmap(
QRCODE_X_POS[pageid],
QRCODE_Y_POS[pageid],
codeblocks[bc],
3 years ago
height=QRCODE_HEIGHT,
3 years ago
)
3 years ago
)
3 years ago
3 years ago
pageid += 1
3 years ago
3 years ago
_finish_page(pdf, c, pageno)
3 years ago
3 years ago
fd, temp_barcode_path = mkstemp(".pdf", "qr_", ".")
pdf.writetofile(temp_barcode_path)
os.rename(temp_barcode_path.split(os.sep)[-1], "{}.pdf".format(ascfile))