2025-03-17 18:06:54 +08:00

88 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/python
#coding: utf-8
# +-------------------------------------------------------------------
# | version:1.0
# +-------------------------------------------------------------------
# | django-vue-lyadmin 专业版
# +-------------------------------------------------------------------
# | Author: lybbn
# +-------------------------------------------------------------------
# | QQ: 1042594286
# +-------------------------------------------------------------------
# ------------------------------
# 条形码唛头生成--filters过滤
# ------------------------------
"""
@Remark: 生成条形码并转换为图片
ean13 只支持数字
code128 支持字符串
"""
import barcode
import base64
from barcode.writer import ImageWriter
import os
from django.conf import settings
import time
from PIL import Image, ImageDraw,ImageFont
from config import DOMAIN_HOST
from io import BytesIO
BARCODE_TYPE = 'code128'
CUSTOM_OPTIONS = {
"module_width": 0.2, # 单个条纹的最小宽度, mm
"module_height": 15.0, # 条纹带的高度, mm
"quiet_zone": 0, # 图片两边与首尾两条纹之间的距离, mm
"font_size": 7, # 条纹底部文本的大小,pt
"text_distance": 4.0, # 条纹底部与条纹之间的距离, mm
# "background": "rgba(0,0,0,0)", # 背景颜色默认为白色white设置为transparent需要ImageWriter的mode="RGBA"
}
def barCodeGenerate(content,imgpath=""):
"""
生成条形码唛头返回base64内容
content:条形码内容
"""
if not imgpath:
imgpath = os.path.join(settings.MEDIA_ROOT, 'temp')
if not os.path.exists(imgpath):
os.makedirs(imgpath)
filename = str(int(time.time()*100000))
code = barcode.get_barcode_class(BARCODE_TYPE)
# code_img = code(content, writer=ImageWriter(mode="RGBA"))#透明背景
code_img = code(content, writer=ImageWriter()) # 透明背景
# 暂存条形码并记录完整路径
file_save_name = code_img.save(imgpath+os.path.sep+filename, options=CUSTOM_OPTIONS)
# 合成唛头
bg = Image.open(os.path.join(settings.MEDIA_ROOT, 'maitou.jpg'))
x, y = bg.size
bc = Image.open(file_save_name)
# x2, y2 = bc.size
# bc = bc.resize((int(x2*0.85), int(y2*0.85)))
x1, y1 = bc.size
bg.paste(bc, (int(x/2)-int(x1/2), int(y/2)-int(y1/2)+60))
draw = ImageDraw.Draw(bg)
thefontpath = os.path.join(settings.MEDIA_ROOT, 'SourceHanSansCN-Medium.otf')
fontstyle = ImageFont.truetype(thefontpath,50, encoding="utf-8")
draw.text((int(x/2)-int(x1/2)-42, int(y/2)-int(y1/2)-10), text=content,font=fontstyle, fill='black')
#返回http路径
# fullfilepath = imgpath + os.path.sep + filename + ".png"
# bg.save(fullfilepath)
# web_img_url = DOMAIN_HOST + settings.MEDIA_URL + "/temp/" + filename + ".png" # 绝对路径http://xxx.xxx.com/media/xxx/xxxx/xxx.png
# return web_img_url
#返回base64
output_buffer = BytesIO()
bg.save(output_buffer,quality=100, format="PNG")
byte_data = output_buffer.getvalue()
base64_str = 'data:image/png;base64,' + base64.b64encode(byte_data).decode("utf-8")
#移除暂存条形码文件
exist_file = os.path.exists(file_save_name)
if exist_file:
os.remove(file_save_name)
return base64_str