Используйте QrCodeWidget (или PlotArea) с утконосом

Мое приложение django использует отчет в формате pdf с несколькими кадрами reportlab, в котором я хотел бы добавить несколько штрих-кодов/qr-кодов.

У меня проблема в том, что каждый объект, который я добавляю в свой макет, должен быть Flowable. Таким образом, вопрос будет заключаться в том, чтобы использовать PlotArea (материнский класс QrCodeWidget) как Flowable.

Если у нас есть ответ здесь, сообщение об ошибке мы можем получить, если добавим QrCodeWidget как

AttributeError: QrCodeWidget instance has no attribute 'getKeepWithNext'

person christophe31    schedule 02.09.2013    source источник


Ответы (2)


Хорошо, я сделал свой Flowable, это было проще, чем я учил.

Это так же просто, как сделать это на холсте с помощью этого API.

from reportlab.platypus import Flowable
from reportlab.graphics.barcode import qr
from reportlab.graphics import renderPDF
from reportlab.graphics.shapes import Drawing

class QRFlowable(Flowable):
    # usage : 
    # story.append(QRFlowable("http://google.fr"))
    def __init__(self, qr_value):
        # init and store rendering value
        Flowable.__init__(self)
        self.qr_value = qr_value

    def wrap(self, availWidth, availHeight):
        # optionnal, here I ask for the biggest square available
        self.width = self.height = min(availWidth, availHeight)
        return self.width, self.height

    def draw(self):
        # here standard and documented QrCodeWidget usage on
        # Flowable canva
        qr_code = qr.QrCodeWidget(self.qr_value)
        bounds = qr_code.getBounds()
        qr_width = bounds[2] - bounds[0]
        qr_height = bounds[3] - bounds[1]
        w = float(self.width)
        d = Drawing(w, w, transform=[w/qr_width, 0, 0, w/qr_height, 0, 0])
        d.add(qr_code)
        renderPDF.draw(d, self.canv, 0, 0)
person christophe31    schedule 10.09.2013
comment
Работайте идеально. Спасибо - person Virako; 20.05.2016

Вы должны сгенерировать изображение из вашего QrCodeWidget и включить его в Image поток.

person G Gordon Worley III    schedule 02.09.2013
comment
Я думал об этом, но я не знаю, как это сделать, и я бы предпочел не записывать это на жесткий диск сервера. - person christophe31; 03.09.2013
comment
Вам не нужно записывать его: вы можете хранить его в памяти в файлоподобном объекте. К сожалению, нет другого способа поместить данные в PDF, кроме текста, изображений и других PDF-файлов. - person G Gordon Worley III; 03.09.2013
comment
Действительно, но поскольку обычный рендерер PDF обрабатывает эти PlotArea, я надеялся, что есть простой способ передать его утконосу. - person christophe31; 04.09.2013
comment
Поскольку это не было чем-то, что мне нужно было быстро, я ничего не делал до сегодняшнего дня, надеясь, что ответ немного похож на тот, который я наконец дал. Я видел, что вы внесли большой вклад в вопросы лаборатории отчетов о переполнении стека. спасибо за другие ответы ^^. - person christophe31; 10.09.2013