如何在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
相关产品推荐
相关产品推荐

