2016-08-11 1 views
2

Я использую Reportlab SimpleDocTemplate для создания pdf-файла. Мне приходится писать (рисовать) несколько изображений по ряду строк, чтобы я мог настроить множество изображений внутри файла.Применить выравнивания в Reportlab SimpleDocTemplate для добавления нескольких штрих-кодов в количестве строк

class PrintBarCodes(View): 

    def get(self, request, format=None): 
     response = HttpResponse(content_type='application/pdf') 
     response['Content-Disposition'] = 'attachment;\ 
     filename="barcodes.pdf"' 

     # Close the PDF object cleanly, and we're done. 
     ean = barcode.get('ean13', '123456789102', writer=ImageWriter()) 
     filename = ean.save('ean13') 
     doc = SimpleDocTemplate(response, pagesize=A4) 
     parts = [] 
     parts.append(Image(filename)) 
     doc.build(parts) 
     return response 

В коде я напечатал в файле один штрих-код. И, результат отображается на изображениях, как показано ниже.

Но, мне нужно нарисовать несколько штрих-кодов. Как уменьшить размер изображения до рисования в pdf-файл и настроить его в порядке?

enter image description here

+0

Является ли ответ ниже того, что вы имели в виду? – B8vrede

+0

Да. Спасибо @ B8vrede –

ответ

2

Как ваш вопрос предполагает, что вам нужно гибкость, я думаю, что наиболее разумный подход использует Flowable «с. Штрих-код обычно не один, но мы можем make it one довольно легко. Поступая таким образом, мы можем позволить решить, сколько места в вашем макете для каждого штрих-кода.

Так шаг один BarcodeFlowable, который выглядит следующим образом:

from reportlab.graphics import renderPDF 
from reportlab.graphics.barcode.eanbc import Ean13BarcodeWidget 
from reportlab.graphics.shapes import Drawing 
from reportlab.platypus import Flowable 

class BarCode(Flowable): 
    # Based on https://stackoverflow.com/questions/18569682/use-qrcodewidget-or-plotarea-with-platypus 
    def __init__(self, value="1234567890", ratio=0.5): 
     # init and store rendering value 
     Flowable.__init__(self) 
     self.value = value 
     self.ratio = ratio 

    def wrap(self, availWidth, availHeight): 
     # Make the barcode fill the width while maintaining the ratio 
     self.width = availWidth 
     self.height = self.ratio * availWidth 
     return self.width, self.height 

    def draw(self): 
     # Flowable canvas 
     bar_code = Ean13BarcodeWidget(value=self.value) 
     bounds = bar_code.getBounds() 
     bar_width = bounds[2] - bounds[0] 
     bar_height = bounds[3] - bounds[1] 
     w = float(self.width) 
     h = float(self.height) 
     d = Drawing(w, h, transform=[w/bar_width, 0, 0, h/bar_height, 0, 0]) 
     d.add(bar_code) 
     renderPDF.draw(d, self.canv, 0, 0) 

Тогда, чтобы ответить на ваш вопрос, самый простой способ в настоящее время положить несколько штрих-кодов на одной странице будет с помощью Table так:

from reportlab.platypus import SimpleDocTemplate, Table 
from reportlab.lib.pagesizes import A4 

doc = SimpleDocTemplate("test.pdf", pagesize=A4) 

table_data = [[BarCode(value='123'), BarCode(value='456')], 
       [BarCode(value='789'), BarCode(value='012')]] 

barcode_table = Table(table_data) 

parts = [] 
parts.append(barcode_table) 
doc.build(parts) 

Какие выходы:

Example of barcode table

+0

можно ли это расширить до кода39? У него нет виджета afaik – Fourier

Смежные вопросы