From ba73d5cb097ee026abad3becf972ac338a7125ce Mon Sep 17 00:00:00 2001 From: fakz9 Date: Tue, 11 Jun 2024 15:15:48 +0300 Subject: [PATCH] feat: new barcode generator --- barcodes/pdf/generator.py | 50 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/barcodes/pdf/generator.py b/barcodes/pdf/generator.py index 3e86934..e031120 100644 --- a/barcodes/pdf/generator.py +++ b/barcodes/pdf/generator.py @@ -82,10 +82,10 @@ class PDFGenerator: buffer.seek(0) return buffer - def generate_large_text(self, barcode_value, text, num_duplicates=1): + def generate(self, barcode_value, text, num_duplicates=1): buffer = BytesIO() - # Create document with specified page size + # Создаем документ с указанным размером страницы doc = SimpleDocTemplate(buffer, pagesize=(self.page_width, self.page_height), rightMargin=1 * mm, @@ -93,35 +93,47 @@ class PDFGenerator: topMargin=1 * mm, bottomMargin=1 * mm) - # Create paragraph with new style + # Создаем абзац с новым стилем paragraph = Paragraph(text, self.small_style) - # Create barcode - barcode = code128.Code128(barcode_value, humanReadable=True) + # Получаем ширину и высоту абзаца + paragraph_width, paragraph_height = paragraph.wrap(self.page_width - 2 * mm, self.page_height) - # Function to draw barcode on canvas + # Рассчитываем доступное пространство для штрихкода + human_readable_height = 6 * mm # Высота human-readable текста + space_between_text_and_barcode = 4 * mm # Отступ между текстом и штрихкодом + barcode_height = self.page_height - paragraph_height - human_readable_height - space_between_text_and_barcode - 4 * mm # Учитываем поля и отступы + + # Создаем штрихкод + available_width = self.page_width - 2 * mm # Учитываем поля + + # Приблизительное количество элементов в штрихкоде Code 128 для средней длины + num_elements = 11 * len(barcode_value) # Примерная оценка: 11 элементов на символ + + # Рассчитываем ширину штриха + bar_width = available_width / num_elements + barcode = code128.Code128(barcode_value, + barWidth=bar_width, + barHeight=barcode_height, + humanReadable=True) + + # Функция для отрисовки штрихкода на canvas def add_barcode(canvas, doc): barcode_width = barcode.width - barcode_x = (self.page_width - barcode_width) / 2 # Center the barcode - barcode.drawOn(canvas, barcode_x, self.page_height - barcode.height - 5) + barcode_x = (self.page_width - barcode_width) / 2 # Центрируем штрихкод + barcode_y = human_readable_height + 2 * mm # Размещаем штрихкод снизу с учетом отступа + barcode.drawOn(canvas, barcode_x, barcode_y) - # Create list of elements to add to the document + # Создаем список элементов для добавления в документ elements = [] for _ in range(num_duplicates): - elements.append(Spacer(1, 8 * mm)) elements.append(paragraph) + elements.append(Spacer(1, space_between_text_and_barcode)) # Отступ между текстом и штрихкодом elements.append(PageBreak()) - # Build document - doc.build(elements[:-1], onFirstPage=add_barcode, onLaterPages=add_barcode) # Remove the last PageBreak + # Создаем документ + doc.build(elements[:-1], onFirstPage=add_barcode, onLaterPages=add_barcode) # Убираем последний PageBreak buffer.seek(0) return buffer - def generate(self, barcode_value, text, num_duplicates=1): - paragraph = Paragraph(text, self.small_style) - # Get the width and height of the paragraph - paragraph_width, paragraph_height = paragraph.wrap(self.page_width - 2 * mm, self.page_height) - if paragraph_height > 30: - return self.generate_large_text(barcode_value, text, num_duplicates) - return self.generate_small_text(barcode_value, text, num_duplicates)