You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django 2中合并多张生成的条形码图片?

实现多张条形码合并为单张图片的方案

嘿,我来帮你搞定多张条码合并的需求!结合你现有的Django View代码,我们可以用Pillow库来处理图片合并,先确保你已经安装了这个库:

pip install pillow

核心思路很简单:先批量生成每个条码的图片(直接在内存里处理,不用存临时文件),然后创建一张新画布,把每个条码按你要求的4cm×2cm尺寸摆进去,最后输出合并后的图片就行。下面是改造后的完整代码:

完整代码示例

import barcode
from barcode.writer import ImageWriter
from PIL import Image
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect
import io

# 先把厘米转成像素(按网页常用的96dpi计算:1cm≈37.8像素)
BARCODE_WIDTH = int(4 * 37.8)  # 对应4cm宽度,约151像素
BARCODE_HEIGHT = int(2 * 37.8) # 对应2cm高度,约76像素

@login_required(login_url='loginPage')
def printBarCode(request):
    # 这里可以换成从请求里获取用户需要的条码内容和数量,比如从POST/GET参数取
    # 示例:假设用户要生成4个条码
    barcode_contents = ['12345678910', '0987654321', '1122334455', '5544332211']
    num_barcodes = len(barcode_contents)
    
    # 第一步:生成每个条码的图片,调整到指定尺寸
    barcode_images = []
    for content in barcode_contents:
        # 生成Code128条码
        bar_code = barcode.get('Code128', content, writer=ImageWriter())
        # 把条码输出到内存字节流,避免存临时文件
        buffer = io.BytesIO()
        bar_code.write(buffer)
        buffer.seek(0)
        # 打开图片并调整尺寸
        img = Image.open(buffer)
        img_resized = img.resize((BARCODE_WIDTH, BARCODE_HEIGHT), Image.Resampling.LANCZOS)
        barcode_images.append(img_resized)
    
    # 第二步:创建合并后的画布,这里先按1行排列(如果要多行可以改)
    total_width = BARCODE_WIDTH * num_barcodes
    total_height = BARCODE_HEIGHT
    merged_image = Image.new('RGB', (total_width, total_height), color='white')
    
    # 第三步:把每个条码贴到画布上
    current_x = 0
    for img in barcode_images:
        merged_image.paste(img, (current_x, 0))
        current_x += BARCODE_WIDTH
    
    # 第四步:处理输出——可以保存到本地,也直接返回给用户
    # 方式1:保存到服务器本地
    merged_image.save('merged_barcodes.png')
    
    # 方式2:直接返回图片给前端(如果需要用户直接下载/查看,就用这个替代redirect)
    # buffer = io.BytesIO()
    # merged_image.save(buffer, format='PNG')
    # buffer.seek(0)
    # return HttpResponse(buffer, content_type='image/png')
    
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

几个关键细节说明

  • 尺寸转换:因为PIL用像素干活,所以把你要的厘米转成了像素,用96dpi是网页和普通屏幕常用的分辨率,要是你需要打印用更高dpi,比如300dpi,就把37.8换成118.1(1cm≈118.1像素)就行。
  • 布局调整:如果不想排成1行,比如4个条码要2行2列,只需要改一下画布尺寸和粘贴位置:
    rows = 2
    cols = 2
    total_width = BARCODE_WIDTH * cols
    total_height = BARCODE_HEIGHT * rows
    merged_image = Image.new('RGB', (total_width, total_height), color='white')
    
    for i, img in enumerate(barcode_images):
        x = (i % cols) * BARCODE_WIDTH
        y = (i // cols) * BARCODE_HEIGHT
        merged_image.paste(img, (x, y))
    
  • 动态获取参数:实际用的时候,你可以从request.POST或者request.GET里拿用户要的条码内容,比如barcode_contents = request.POST.getlist('barcode_numbers'),这样就能根据用户输入生成对应数量的条码了。

注意事项

  • 一定要确保你的Django环境装了Pillow,不然会报错哦。
  • 要是想让用户直接看到合并后的图片,就把保存文件的代码注释掉,启用返回HttpResponse的部分,这样用户访问这个视图就能直接拿到图片了。

内容的提问来源于stack exchange,提问作者Antu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:15:01