This commit is contained in:
Aborelis 2024-05-14 02:06:55 +02:00
parent b8cdab0e4a
commit a9337407b7
2 changed files with 48 additions and 41 deletions

View file

@ -24,7 +24,6 @@ from reportlab.lib.units import mm, cm
labelInfo = {
# 22x 32mm x 10mm mini labels
3044: (2, 11, (32, 10), (2, 2), (1, 1), (66.5 * mm, 120.5 * mm)),
# 189x 25.4mm x 10mm mini labels
4731: (7, 27, (25.4 * mm, 10 * mm), (2.5 * mm, 0), (9 * mm, 13.5 * mm), A4),
# 2.6 x 1 address labels
@ -36,14 +35,13 @@ labelInfo = {
5167: (4, 20, (126, 36), (0, 0), (54, 36), A4),
# 3.5 x 2 business cards
5371: (2, 5, (252, 144), (0, 0), (54, 36), A4),
# 48x 45.7x21.2mm
4778: (4, 12, (45.7 * mm, 21.2 * mm), (0.25 * cm, 0), (1.1 * cm, 2 * cm), A4),
# APLI 100984 40x 52.5x29.7mm
100984: (4, 10, (52.5 * mm, 29.7 * mm), (0, 0), (0, 0), A4),
}
class AveryLabel:
def __init__(self, label, **kwargs):
@ -53,40 +51,44 @@ class AveryLabel:
self.size = data[2]
self.labelsep = self.size[0] + data[3][0], self.size[1] + data[3][1]
self.margins = data[4]
self.topDown = True
self.top_down = True
self.debug = False
self.pagesize = data[5]
self.position = 0
self.__dict__.update(kwargs)
def open(self, filename):
"""open a canvas for the file"""
self.canvas = canvas.Canvas(filename, pagesize=self.pagesize)
if self.debug:
self.canvas.setPageCompression(0)
self.canvas.setLineJoin(1)
self.canvas.setLineCap(1)
def topLeft(self, x=None, y=None):
def top_left(self, x=None, y=None):
""" return top left"""
if x is None:
x = self.position
if y is None:
if self.topDown:
if self.top_down:
x, y = divmod(x, self.down)
else:
y, x = divmod(x, self.across)
return (
self.margins[0] + x * self.labelsep[0],
self.pagesize[1] - self.margins[1] - (y+1)*self.labelsep[1]
self.pagesize[1] - self.margins[1] - (y + 1) * self.labelsep[1],
)
def advance(self):
""" move to next position"""
self.position += 1
if self.position == self.across * self.down:
self.canvas.showPage()
self.position = 0
def close(self):
"""save and close canvas"""
if self.position:
self.canvas.showPage()
self.canvas.save()
@ -100,6 +102,7 @@ class AveryLabel:
# per iteration of the iterator.
def render(self, thing, count, offset=0, *args):
""" render loop"""
assert callable(thing) or isinstance(thing, str)
if isinstance(count, Iterator):
return self.render_iterator(thing, count)
@ -108,7 +111,7 @@ class AveryLabel:
for i in range(offset + count):
if i >= offset:
canv.saveState()
canv.translate( *self.topLeft() )
canv.translate(*self.top_left())
if self.debug:
canv.setLineWidth(0.25)
canv.rect(0, 0, self.size[0], self.size[1])
@ -120,14 +123,14 @@ class AveryLabel:
self.advance()
def render_iterator(self, func, iterator):
""" render loop for iterator """
canv = self.canvas
for chunk in iterator:
canv.saveState()
canv.translate( *self.topLeft() )
canv.translate(*self.top_left())
if self.debug:
canv.setLineWidth(0.25)
canv.rect(0, 0, self.size[0], self.size[1])
func(canv, self.size[0], self.size[1], chunk)
canv.restoreState()
self.advance()

View file

@ -2,8 +2,7 @@
from functools import partial
import AveryLabels
from AveryLabels import labelInfo
from reportlab.lib.units import mm
from reportlab.lib.units import toLength
from reportlab.pdfgen import canvas
@ -14,8 +13,11 @@ from reportlab_qrcode import QRCodeImage
from clize import run
import AveryLabels
from AveryLabels import labelInfo
project_homepage = "https://github.com/aborelis/ASN-Label-Generator"
PROJECT_HOMEPAGE = "https://github.com/aborelis/ASN-Label-Generator"
class LabelContext:
@ -57,6 +59,7 @@ class LabelContext:
def render(context: LabelContext, c: canvas.Canvas, width: float, height: float):
""" renders one label onto the provided canvas. To be used with AveryLabel. """
sub_label_width = width / context.sub_labels_x
sub_labelheight = height / context.sub_labels_y
@ -215,10 +218,11 @@ def labels():
def version():
"""Show the version"""
return "ASN Label Generator - version 0.1 \n" + project_homepage
return "ASN Label Generator - version 0.1 \n" + PROJECT_HOMEPAGE
def main():
"""Main function - entry point"""
run(generate, alt=[labels, version])