Штрих-код 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
вот пример результата:
это должно сделать трюк. Я использовал 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
вы пробовали собрать штрих-код на лету с каждым символом, представленным своими собственными данными изображения? Вот пример:
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