Reportlab的Code128条形码作为HTML图像标签,在Python中使用数据URI方案

Jul*_*pov 8 python django reportlab barcode data-url

我需要用Python/Django创建一个Code128条形码,它必须嵌入HTML文档中.

我不想在磁盘上制作任何临时(或缓存)文件.这就是我想将它们嵌入数据URI方案的原因.

结果必须是这样的:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
Run Code Online (Sandbox Code Playgroud)

你能推荐我一个简单的方法吗?

现在我使用ReportLab创建这样的条形码并将它们嵌入到PDF文件中,但我不知道如何将它们导出为数据URI方案.如果这是建议的方法.

Jul*_*pov 12

这是我自己的解决方案:

from base64 import b64encode
from reportlab.lib import units
from reportlab.graphics import renderPM
from reportlab.graphics.barcode import createBarcodeDrawing
from reportlab.graphics.shapes import Drawing

def get_barcode(value, width, barWidth = 0.05 * units.inch, fontSize = 30, humanReadable = True):

    barcode = createBarcodeDrawing('Code128', value = value, barWidth = barWidth, fontSize = fontSize, humanReadable = humanReadable)

    drawing_width = width
    barcode_scale = drawing_width / barcode.width
    drawing_height = barcode.height * barcode_scale

    drawing = Drawing(drawing_width, drawing_height)
    drawing.scale(barcode_scale, barcode_scale)
    drawing.add(barcode, name='barcode')

    return drawing

def get_image():

    barcode = get_barcode(value = '01234567890', width = 600)
    data = b64encode(renderPM.drawToString(barcode, fmt = 'PNG'))
    print '<img src="data:image/png;base64,{0}">'.format(data)
Run Code Online (Sandbox Code Playgroud)

您还可以将条形码旋转90°:

def get_barcode_rotated(value, width, barWidth = 0.05 * units.inch, fontSize = 30, humanReadable = True):

    barcode = createBarcodeDrawing('Code128', value = value, barWidth = barWidth, fontSize = fontSize, humanReadable = humanReadable)

    drawing_width = width
    barcode_scale = drawing_width / barcode.width
    drawing_height = barcode.height * barcode_scale

    drawing = Drawing(drawing_width, drawing_height)
    drawing.scale(barcode_scale, barcode_scale)
    drawing.add(barcode, name='barcode')

    drawing_rotated = Drawing(drawing_height, drawing_width)
    drawing_rotated.rotate(90)
    drawing_rotated.translate(0, -drawing_height)
    drawing_rotated.add(drawing, name='drawing')

    return drawing_rotated
Run Code Online (Sandbox Code Playgroud)

这是一个示例结果:

http://pastehtml.com/view/ci7qei4k1.html


Mar*_*agh 5

这应该可以解决问题.我使用Code128 python模块生成条形码.

from Code128 import Code128
from base64 import b64encode

val = "9782212110708"
Code128().getImage(val, path="./")
data = b64encode(open(val + '.png').read())
print '<img src="data:image/png;base64,{0}">'.format(data)
Run Code Online (Sandbox Code Playgroud)

产量

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIMAAAAyAQAAAABXcFUb
AAAAjklEQVR4nGP8r2v6J/ihYotFKrs5qx9H2TwmBnQwKjIqMnRFGP+jCTzErkvS6IR80Yu5iScU
GBgYGFgYGP4b3j6t9Xn+ZG4jA6gIAxtDos26ROHFcF2M+32/XPjLwPCX8QLMnAOfXyz4xcDA8B+m
63/djHUCHxkYfkEt+///v8zHJg6GBpbi4/L///9/AADHAS8/nZ4QEQAAAABJRU5ErkJggg==">
Run Code Online (Sandbox Code Playgroud)

UPDATE

在评论中有一个很好的建议来修改Code128模块,这样它就不必将图像保存到文件系统中.您可以更改Code128,使其返回图像对象,而不是将其保存到文件中.您只需要更改一行代码即可实现此目的.更改第162行:

im.save(path+value+"."+lower(extension), upper(extension))
Run Code Online (Sandbox Code Playgroud)

至:

return im
Run Code Online (Sandbox Code Playgroud)