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

2024-05-15 05:58:01 发布

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

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

我不想在磁盘上创建任何临时(或缓存)文件。这就是为什么我想将它们作为数据URI方案嵌入。

结果一定是这样的:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">

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

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


Tags: 文件数据django方法文档imagesrcimg
3条回答

这应该能起到作用。我使用了Code128python模块来生成条形码。

代码

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)

输出

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

更新

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

im.save(path+value+"."+lower(extension), upper(extension))

致:

return im

你有没有试过用自己的图像数据来组装每个符号的条码?下面是一个例子:

<;图像 alt=“105,{Start C}”title=“105,{Start C}”src=“data:image/png;base64,ivborw0kggoaaansuheugaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAADklEQVQIHQEDAPz/acxgalsajajkmzkaaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“00,A:{space},B:{space}”title=“00,A:{space},B:{space}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/ACZgAK8Ah/krwu0aaasuvork5cyii=”width=“30”height=“60”>;<;img 是的 A lt=“21,A:{5},B:{5}”title=“21,A:{5},B:{5}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAADklEQVQIHQEDAPz/ACNgAKkAhD/i5lYAAAAASUVORK5CYII=”width=“30”height=“60”>;<;img A lt=“14,A:{.},B:{.}”title=“14,A:{.},B:{.}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/agygao8ah9wahqgaaaaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“00,A:{space},B:{space}”title=“00,A:{space},B:{space}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/ACZgAK8Ah/krwu0aaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“14,A:{.},B:{.}”title=“14,A:{.},B:{.}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/agygao8ah9wahqgaaaaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“64,A:{NUL},B:{}" title=" 64,A:{NUL},B:{”src=“数据:image/png;base64,ivborw0kggoaaansuhueugaaaaaaababaqmaaay+cydaaablbmveuaaad//+l2Z/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAADklEQVQIHQEDAPz/af5gar8av0a69koaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“95,A:{US},B:{DEL}”title=“95,A:{US},B:{DEL}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaadkleqhqedapz/AELgAWcBIz+iur4aaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“07,A:{'},B:{'}”title=“07,A:{'},B:{'}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/agdgatayj/9lboaaaaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“74,A:{LF},B:{j}”title=“74,A:{LF},B:{j}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/ahmgazubgucd0y8aaasuvork5cyii=”width=“30”height=“60”>;<;img vork5cyii=“width=”30“height=”60“>;<;图像 A lt=“25,A:{9},B:{9}”title=“25,A:{9},B:{9}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/abpgajaex9glyqaaaaaaaaasuvork5cyii=”width=“30”height=“60”>;<;img A lt=“12,A:{,},B:{,}”title=“12,A:{,},B:{,}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaaaaaaaaaabaqmaaay+cydaaablbmveuaaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaaadkleqhqedapz/aexgapsarevarksaaaaasuvork5cyii=”width=“30”height=“60”>;<;img” alt=“106,{Stop}”title=“106,{Stop}”src=“数据:图像/png;base64,ivborw0kggoaaansuheugaaaa0aaaababaqmaaaa/57zeaaablbbmveuaad//+l2Z/daaaacxbiwxmaaa7eaaaoxagvkw4baaADklEQVQIHQEDAPz/Adigarma2dpjzt8aaasuvork5cyii=“width=”30“height=”60“>;
009821140014649507749

这表示与示例相同的条形码,但不需要中间图形,并且占用大约三分之一的空间。用于构成图像的数据可以从数组中访问,并用于用Javascript或其他客户端或服务器端应用程序填充目标HTML。

您可以在http://notionovus.com/blog/code-128-barcode/找到代码128符号的完整列表

我不确定轮换。我还没试过呢。

这是我自己的解决方案:

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)

你还可以把条码旋转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

下面是一个示例结果:

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

相关问题 更多 >

    热门问题