Штрих-код Reportlab Code128 как HTML-тег изображения со схемой URI данных в Python

Мне нужно создать штрих-коды Code128 с Python / Django, которые должны быть встроены в HTML-документ.

Я не хочу делать какие-либо временные (или кэш) файлы на диске. Вот почему я хочу встроить их в схему URI данных.

результат должен быть примерно таким:

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

можете ли вы порекомендовать мне простой способ сделать это?

теперь я использую ReportLab для создания таких штрих-кодов и встраивания их в PDF-файлы, но я не знаю, как экспортируйте их как схему URI данных. Если это рекомендуемый способ сделать это.

4 ответов


Это мое собственное решение:

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


это должно сделать трюк. Я использовал 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)

выход

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

обновление

в комментариях было хорошее предложение изменить модуль Code128, чтобы ему не нужно было сохранять изображение в файловой системе. Вы можете изменить Code128, чтобы он вернул вам объект image вместо сохранения его в файл. Для этого вам нужно будет изменить только одну строку кода. Изменить строку 162 с:

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

в:

return im

вы пробовали собрать штрих-код на лету с каждым символом, представленным своими собственными данными изображения? Вот пример:

105, {Start C} 00, A: {space}, B:{space} 98, A: {Escape B}, B:{Escape A} 14, A: {.},Си.{:}  00, A: {space}, B:{space} 14, A: {.},Си.{:}  64, A: {NUL}, B: {<code>}07, A: {' }, B:{'} 74,a: {LF}, B: {j} 101, A: {FNC 4}, B: {Switch A}, C:{Switch A}106,{Stop}
009821140014649507749

этот представляет тот же штрих-код, что и в вашем примере, но не требует промежуточной графики и занимает около трети пространства. Данные, используемые для создания образа, можно получить из массива и использовать для заполнения целевого HTML Javascript или другим клиентским или серверным приложением.

вы можете найти полный список символов кода 128 на http://notionovus.com/blog/code-128-barcode/

Я не уверен в ротации. Я не пробовал еще.


для коллег-гуглеров: предлагаемое решение не зависит от ReportLab, мы можем включить штрих-код в наш HTML-шаблон из его представления base64, учитывая, что у нас уже есть изображение, созданное с другой библиотекой:

data_uri = open("sample.png", "rb").read().encode("base64").replace("\n", "")
# HTML Image Element
img_tag = '<img alt="" src="data:image/png;base64,{0}">'.format(data_uri)
print img_tag
# CSS Background Image
css = 'background-image: url(data:image/png;base64,{0});'.format(data_uri)
print css