From 329616bcd3b5a7a79ab247034410a9532d0feebf Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Mon, 12 May 2025 17:56:25 +0400 Subject: [PATCH] fix: card creation fix --- assets/fonts/Arial Nova Cond.ttf | Bin 0 -> 63072 bytes constants.py | 2 + .../base_pdf_card_generator.py | 15 +++-- .../generator.py | 59 ++++++++++++++---- requirements.txt | 3 +- static/icons/denco.svg | 1 + 6 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 assets/fonts/Arial Nova Cond.ttf create mode 100644 static/icons/denco.svg diff --git a/assets/fonts/Arial Nova Cond.ttf b/assets/fonts/Arial Nova Cond.ttf new file mode 100644 index 0000000000000000000000000000000000000000..589b2aa109dc96e29c609f3acfbeb80b89ba381b GIT binary patch literal 63072 zcmdSCcYGAp`agco%xp=rn{3Z!HwnAhG}3#4kSwGS2!w+U9Z>cRbVH-_nFy*fZp%-^Vje7`bN&q&dix}p7ZqQ zInS(w5<+zN5C|zNs~tLXL46@1zn0)?_`s6VGOmK%`868nj$t*a84HJ4ju1lE;=FO< z%<*#u|B}cN64*!x|H;Ib`HtZ6hRuZ7P3ZI4--g>Z0mAabP7_x%7wUR3C~dm_vvAS5z0Jk^DE=fs0^QxJXh*RAewP%4P~DqcL3! znL~J-3;Yeb3E$L;OyO1BeNaAfuaXRIsanAWDU=-h6Iuzkh7E}({S6&fIgGf8!x^P` zTdby9)ra&g-1rN-Da0yH;ou-tFpzER3YYC~l>&sEH5$FAJ+=Xc=u2rFZhE{+!60I0*I2ya|L90b;Kws8>1HMm1OJzs? z2~wt&P<-g(Sc`bB>V%9{&`)v)(@Q_M}5@Uj~8 zn2PJ51*1dH209S5Dtff@DB80UeY)ttXwkDV9%JXAMbE})0bH=T9cBmu6?WQ1Zo#(7fG9|_=1*3!^^L|cQVMQbL+mx%TxAva#e zaSz%Nu8vxG7s-&_&a0~FWpO_?G1w2e=Fq{C- zOsDJ<26SFmcIk{b(jeiB^#LF9?~!4^VJg!RiZQ?)^o3$6S)phl%OoCWYfS|o_9IP< z23#f;~D8Xo?%CJjjd79L{gWwv)5|{8Lj!eeuaO}d@3xEq_DN~>yoq&t+7HjMoFUDZ_^5aoDGMQ!b zFOWAq5XT+B5tB24H1T%>hbO_C(34Dt6n#ks zUjW;oz%?{}E{+_D5U%0~yfJ+7-{Z(+7CM2uN(z|lDpj}+-719Q`kQ2);xW>y_yPSi z(4p_++61Y8q@o(fdr6)ouV&(8b4$7fa=>Je=@F*e6?c;e#UwnBJ`4sn2mdpU;4Suy zatZiiF3AvDz%vKY4}8IB3j3_&p92mrlWjsUnFly`@%uY(C|{Ku-9@IM)zhL zhE~r9l4a1pb*yo}krnVP{;AfHa@d@atO>6$+eBuejX`Tbb19k4fz4LU2A*Sp=QqHw z%~Bs`XEkW-Sfh#|VK^qCrK2rF%R}ppHcO?(vxFotLtnb(EuKf zp}&PoUJs$~Nd6ABH2^z0AGOeausy=L2{bznX93H}DVhuL&Aqm@rxxCu|nB3l9lT3C{!_EHVC&`26Z6KD#}q4~5w9YU+PuH&y!yh`b620c`t;Suu9koL&8HvBxW&r; z|M*jKfovK$vCNO{`A56`QZU5-@lSq|Cjw}%gjcL40VI$F5e?CjU=l)fL{ALFNKC{` zEF_dzNf@yqb_gdCB$D(31)U^{xWHpEB$mXHc+wj@1aFHZlN6Fl(nvbVAekhKWRo0{ zOY%rQ=|lRG0@9BZk|OY2e=>j+lM+%&%E&-cP6ojTkt$M6hLajnOGc29 zWE4Di52+^&@Y%N7j=E$PTiH>?ixk0dj~OB!|gS@+f(Pw3Elk z6XbE?CCA894)?qauR*cQA9rU7y1?bnms{3BX`n|>8JEdau3-+R+4*38@Z2cBAdxZvQ>&0wvb(9 zH+hI$rQy^`?tsMf!h?4~ZX7g%5cjBtde4a3n&DN$h7PG1Jg9tNS!qe}fd1~H!hQvP z`{d{4=45AOW~8U3rX(jNCiISvi;anPML8Y4A|t}>wlHg`#cVPf^tzB>ttKciK&?_L z1Rjw_6194*#dW34-mv0Euf|p4(mA}E%Aba&dWpgAbm<+Lsh(tiFRvoeON

Q&rtD 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 literal 0 HcmV?d00001 diff --git a/constants.py b/constants.py index f32ae77..63ec3fa 100644 --- a/constants.py +++ b/constants.py @@ -17,6 +17,8 @@ API_ROOT = "/api" APP_PATH = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else os.path.dirname(__file__) +STATIC_PATH = os.path.join(APP_PATH, "static") + KAFKA_CERTS_PATH = os.path.join(APP_PATH, "certs") allowed_telegram_ids = [ diff --git a/generators/base_pdf_card_generator/base_pdf_card_generator.py b/generators/base_pdf_card_generator/base_pdf_card_generator.py index 5248bab..7313f16 100644 --- a/generators/base_pdf_card_generator/base_pdf_card_generator.py +++ b/generators/base_pdf_card_generator/base_pdf_card_generator.py @@ -15,10 +15,15 @@ class BasePdfCardGenerator: self._session = session assets_folder = os.path.join(APP_PATH, 'assets') fonts_folder = os.path.join(assets_folder, 'fonts') - font_file_path = os.path.join(fonts_folder, 'DejaVuSans.ttf') + + dejavu_font_file_path = os.path.join(fonts_folder, 'DejaVuSans.ttf') + pdfmetrics.registerFont(TTFont('DejaVuSans', dejavu_font_file_path)) + + arial_font_file_path = os.path.join(fonts_folder, 'Arial Nova Cond.ttf') + pdfmetrics.registerFont(TTFont('Arial Nova Cond', arial_font_file_path)) + self.page_width = 58 * mm self.page_height = 40 * mm - pdfmetrics.registerFont(TTFont('DejaVuSans', font_file_path)) self.styles = getSampleStyleSheet() self._set_small_paragraph_styles() @@ -64,11 +69,9 @@ class BasePdfCardGenerator: bottomMargin=1 ) - def _get_paragraph_style(self, font_size: int): + def _get_paragraph_style(self, font_size: int, font_name: str = "Arial Nova Cond"): common_paragraph_style = { - "parent": self.styles['Normal'], - "fontName": "DejaVuSans", - "spaceAfter": 4, + "fontName": font_name, "fontSize": font_size, } return ParagraphStyle( diff --git a/generators/warehouse_place_qr_code_generator/generator.py b/generators/warehouse_place_qr_code_generator/generator.py index 6155234..40ae7dc 100644 --- a/generators/warehouse_place_qr_code_generator/generator.py +++ b/generators/warehouse_place_qr_code_generator/generator.py @@ -1,16 +1,50 @@ +import os from io import BytesIO +from reportlab.graphics import renderPDF from reportlab.lib.units import mm from reportlab.pdfgen.canvas import Canvas from reportlab.platypus import Paragraph, SimpleDocTemplate, Frame from reportlab_qrcode import QRCodeImage +from svglib.svglib import svg2rlg +from constants import STATIC_PATH from generators.base_pdf_card_generator.base_pdf_card_generator import BasePdfCardGenerator from services.warehouse_management import WmsService class WarehousePlaceQRCodeGenerator(BasePdfCardGenerator): + @staticmethod + def _get_big_font_size_from_str(value: str | int) -> int: + value = str(value) + dots = value.count(".") + string = value.replace(".", "") + length = len(string) + dots / 3 + + if length > 8: + return 30 + elif length > 5: + return 37 + return 48 + + @staticmethod + def _get_mid_font_size_from_str(value: str | int) -> int: + value = str(value) + dots = value.count(".") + string = value.replace(".", "") + length = len(string) + dots / 3 + + if length > 8: + return 22 + elif length > 6: + return 26 + elif length > 4: + return 30 + return 34 + async def generate(self, place_id: int, is_short: bool) -> BytesIO: + icon_path = os.path.join(STATIC_PATH, "icons", "denco.svg") + service = WmsService(self._session) place_code = await service.get_code_of_place(place_id) @@ -18,25 +52,28 @@ class WarehousePlaceQRCodeGenerator(BasePdfCardGenerator): doc: SimpleDocTemplate = self._create_doc(buffer) def on_first_page(canvas: Canvas, doc): - denco_paragraph = Paragraph('DENCO', self.small_centered_style) + svg_icon_scale = 0.04 + drawing = svg2rlg(icon_path) + drawing.scale(svg_icon_scale, svg_icon_scale) if is_short: - qr = QRCodeImage(place_code, size=20 * mm) - qr.drawOn(canvas, 39 * mm, -4) + qr = QRCodeImage(place_code, size=17 * mm) + qr.drawOn(canvas, 42 * mm, -4) - number_paragraph = Paragraph(str(place_code), self._get_paragraph_style(26)) - number_frame = Frame(x1=0 * mm, y1=-15 * mm, width=42 * mm, height=30 * mm) - denco_frame = Frame(x1=0 * mm, y1=-2 * mm, width=42 * mm, height=20 * mm) + font_size = self._get_mid_font_size_from_str(place_code) + number_paragraph = Paragraph(str(place_code), self._get_paragraph_style(font_size)) + number_frame = Frame(x1=0 * mm, y1=-15 * mm, width=45 * mm, height=30 * mm) + renderPDF.draw(drawing, canvas, 3, 35) else: - qr = QRCodeImage(place_code, size=25 * mm) - qr.drawOn(canvas, 34 * mm, -4) + qr = QRCodeImage(place_code, size=20 * mm) + qr.drawOn(canvas, 39 * mm, -2 * mm) - number_paragraph = Paragraph(str(place_code), self._get_paragraph_style(34)) + font_size = self._get_big_font_size_from_str(place_code) + number_paragraph = Paragraph(str(place_code), self._get_paragraph_style(font_size)) number_frame = Frame(x1=0 * mm, y1=9 * mm, width=60 * mm, height=30 * mm) - denco_frame = Frame(x1=0 * mm, y1=-13 * mm, width=58 * mm, height=20 * mm) + renderPDF.draw(drawing, canvas, 67, 3) number_frame.addFromList([number_paragraph], canvas) - denco_frame.addFromList([denco_paragraph], canvas) empty_paragraph = Paragraph("", self.small_centered_style) elements = [empty_paragraph] diff --git a/requirements.txt b/requirements.txt index 14bf1ca..80a9b60 100644 --- a/requirements.txt +++ b/requirements.txt @@ -38,4 +38,5 @@ weasyprint number_to_string pdfrw fpdf -PyMuPDF \ No newline at end of file +PyMuPDF +svglib diff --git a/static/icons/denco.svg b/static/icons/denco.svg new file mode 100644 index 0000000..c76ad6e --- /dev/null +++ b/static/icons/denco.svg @@ -0,0 +1 @@ + \ No newline at end of file