在Reportlab SimpleDocTemplate上应用对齐方式以在行数中追加多个条形码

2024-09-29 19:02:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用ReportlabSimpleDocTemplate创建pdf文件。我必须写(画)多个图像行,这样我可以调整文件中的许多图像。在

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


Tags: 文件图像viewgetdocpdfresponsefilename
1条回答
网友
1楼 · 发布于 2024-09-29 19:02:38

由于你的问题表明你需要灵活性,我认为最明智的方法是使用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,如下所示:

^{pr2}$

哪些输出:

Example of barcode table

相关问题 更多 >

    热门问题