vue3.0项目生成标签条形码(插件:jsbarcode)并打印(插件:Print.js)支持pda扫码枪扫描
一、背景与问题
在工业自动化场景中,标签条形码打印是常见的业务需求。传统开发中,开发者需要手动处理图像生成、打印机通信、扫码枪兼容性等问题,导致开发周期长且容易出错。本文将以Vue3.0项目为载体,结合jsbarcode和Print.js两个插件,构建一套完整的标签打印系统,重点分析其技术原理和工程实现。
二、基本原理
1. 条形码生成原理
条形码通过特定编码规则将文本信息转换为黑白条纹图案。jsbarcode库基于Code128编码标准,其核心流程包括:
- 文本校验(去除空格、特殊字符)
- 编码转换(将文本转换为编码字串)
- 条形码图案生成(通过计算条纹宽度和间距)
- 图像渲染(将条形码数据转换为Canvas图像)
2. 打印原理
Print.js插件通过浏览器内置的打印功能实现打印。其核心机制包括:
- 生成PDF文档(通过
window.print()触发打印流程) - 处理打印机配置(支持不同打印机型号的参数设置)
- 优化打印质量(通过CSS样式控制打印输出的格式)
3. PDA扫码枪兼容性
扫码枪通过串口或USB与设备连接,其工作原理与普通打印机类似,但需要特别注意:
- 打印分辨率需达到300dpi以上
- 条形码尺寸需符合ISO/IEC 128标准(建议宽度2.5cm以上)
- 需要设置正确的终止符(如
^Z)
三、环境准备
1. 项目依赖
npm install jsbarcode print-js2. 开发环境配置
{
"vue": "3.0.0",
"jsbarcode": "^3.11.0",
"print-js": "^1.6.1"
}四、核心实现
1. 条形码生成组件(BarcodeGenerator.vue)
<template>
<div>
<input v-model="inputText" placeholder="输入标签内容" />
<button @click="generateBarcode">生成条形码</button>
<div ref="barcodeCanvas" style="width: 300px; height: 100px; border: 1px solid #ccc"></div>
</div>
</template>
<script>
import jsBarcode from 'jsbarcode';
export default {
data() {
return {
inputText: '',
barcodeCanvas: null
};
},
methods: {
generateBarcode() {
// 1. 文本校验
const sanitizedText = this.inputText.replace(/\s+/g, '');
if (!sanitizedText) {
alert('请输入有效内容');
return;
}
// 2. 生成条形码
const canvas = this.$refs.barcodeCanvas;
jsBarcode(canvas, sanitizedText, {
width: 2,
height: 100,
displayValue: true,
format: 'code128',
fontSize: 12
});
// 3. 预览打印
this.printBarcode();
},
printBarcode() {
const printWindow = window.open('', '_blank');
printWindow.document.write(`
<html>
<head>
<style>
body { font-family: sans-serif; margin: 0; padding: 0; }
canvas { display: block; margin: 20px auto; }
</style>
</head>
<body>
<canvas id="barcodeCanvas"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/print-js/1.6.1/print.min.js"></script>
<script>
const canvas = document.getElementById('barcodeCanvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(canvas, 0, 0);
printJS({
printable: 'barcodeCanvas',
type: 'html',
css: 'body { font-family: sans-serif; }',
target: 'barcodeCanvas'
});
</script>
</body>
</html>
`);
printWindow.document.close();
}
}
};
</script>关键代码解释:
- 文本校验:去除所有空格和特殊字符,确保扫码枪能正确识别
条形码参数配置:
width设置条纹宽度(建议2-3px)height设置条形码高度(建议80-120px)displayValue显示文本内容format设置编码类型(code128支持最广泛的扫码枪)
- 打印流程:通过
window.open创建新窗口,使用Print.js插件进行打印
2. 打印配置优化(printConfig.js)
export const printConfig = {
format: 'code128', // 编码类型
width: 2, // 条纹宽度
height: 100, // 条形码高度
fontSize: 12, // 文字大小
resolution: 300, // 打印分辨率
padding: 20, // 内边距
margin: 10, // 外边距
includeText: true, // 是否包含文本
includeQR: false, // 是否包含二维码
printer: 'epson_t60', // 打印机型号(可选)
duplex: 'simplex', // 双面打印模式
orientation: 'portrait' // 页面方向
};3. 扫码枪兼容性处理(scannerHandler.js)
export function handleScannerInput(data) {
// 1. 去除换行符和特殊字符
const cleanedData = data.replace(/[\n\r]/g, '').trim();
// 2. 验证数据格式
if (!/^[A-Za-z0-9]{8,20}$/.test(cleanedData)) {
console.error('无效扫码数据:', cleanedData);
return;
}
// 3. 生成对应条形码
const barcodeData = {
text: cleanedData,
type: 'code128',
size: 'medium',
color: 'black',
background: 'white'
};
// 4. 调用打印服务
printBarcode(barcodeData);
}五、完整案例
1. 标签打印系统完整实现(LabelSystem.vue)
<template>
<div class="label-system">
<h2>标签打印系统</h2>
<div class="input-section">
<input v-model="inputText" placeholder="输入标签内容" />
<button @click="generateBarcode">生成条形码</button>
</div>
<div class="preview-section" v-if="barcodeData">
<h3>预览</h3>
<div class="barcode-preview">
<canvas ref="barcodeCanvas" style="width: 300px; height: 100px; border: 1px solid #ccc"></canvas>
<p>{{ barcodeData.text }}</p>
</div>
</div>
<div class="print-section">
<button @click="printBarcode">打印标签</button>
</div>
</div>
</template>
<script>
import jsBarcode from 'jsbarcode';
import { printConfig } from './printConfig';
export default {
data() {
return {
inputText: '',
barcodeData: null
};
},
methods: {
generateBarcode() {
const sanitizedText = this.inputText.replace(/\s+/g, '');
if (!sanitizedText) {
alert('请输入有效内容');
return;
}
this.barcodeData = {
text: sanitizedText,
format: printConfig.format,
width: printConfig.width,
height: printConfig.height,
fontSize: printConfig.fontSize
};
const canvas = this.$refs.barcodeCanvas;
jsBarcode(canvas, sanitizedText, {
width: printConfig.width,
height: printConfig.height,
displayValue: true,
format: printConfig.format,
fontSize: printConfig.fontSize
});
},
printBarcode() {
const printWindow = window.open('', '_blank');
printWindow.document.write(`
<html>
<head>
<style>
body { font-family: sans-serif; margin: 0; padding: 0; }
canvas { display: block; margin: 20px auto; }
</style>
</head>
<body>
<canvas id="barcodeCanvas"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/print-js/1.6.1/print.min.js"></script>
<script>
const canvas = document.getElementById('barcodeCanvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(canvas, 0, 0);
printJS({
printable: 'barcodeCanvas',
type: 'html',
css: 'body { font-family: sans-serif; }',
target: 'barcodeCanvas'
});
</script>
</body>
</html>
`);
printWindow.document.close();
}
}
};
</script>
<style>
.label-system {
padding: 20px;
background: #f5f5f5;
}
.input-section {
margin-bottom: 20px;
}
.preview-section {
margin-bottom: 20px;
}
.print-section {
margin-top: 20px;
}
.barcode-preview {
text-align: center;
}
</style>六、源码解析
1. 条形码生成核心逻辑
jsBarcode(canvas, text, {
width: 2,
height: 100,
displayValue: true,
format: 'code128',
fontSize: 12
});width控制条纹宽度,影响扫码枪识别率height设置条形码高度,建议80-120pxdisplayValue显示文本内容,方便人工核对format选择编码类型,code128支持最广泛的扫码枪型号
2. 打印配置优化
printJS({
printable: 'barcodeCanvas',
type: 'html',
css: 'body { font-family: sans-serif; }',
target: 'barcodeCanvas'
});printable指定打印内容的DOM元素type指定打印类型(html、text、pdf等)css设置打印样式,确保打印效果target指定具体打印区域
3. 扫码枪兼容性处理
const cleanedData = data.replace(/[\n\r]/g, '').trim();- 去除换行符和回车符,避免扫码错误
- 使用正则表达式确保输入数据有效性
- 建议设置最大长度限制(如20个字符)
七、进阶使用
1. 多类型标签支持
function generateBarcode(data, type = 'code128') {
const canvas = document.getElementById('barcodeCanvas');
jsBarcode(canvas, data, {
width: 2,
height: 100,
displayValue: true,
format: type,
fontSize: 12
});
}- 支持code128、code39、ean13等格式
- 可通过参数动态切换编码类型
- 需要确保扫码枪支持对应编码类型
2. 打印配置扩展
function configurePrinter(printerType = 'epson_t60') {
return {
format: 'code128',
width: 2,
height: 100,
resolution: 300,
printer: printerType,
duplex: 'simplex'
};
}- 支持不同型号打印机的配置
- 可设置双面打印模式
- 可调整打印分辨率(300dpi以上)
3. 扫码枪事件监听
function initScanner() {
const scanner = new (require('node-barcode-scanner'))();
scanner.on('data', (data) => {
handleScannerInput(data);
});
}- 需要安装node-barcode-scanner库
- 监听扫码枪输入事件
- 实际项目中需要处理串口通信
八、性能与工程实践
1. 性能优化方案
| 优化点 | 方法 | 效果 |
|---|---|---|
| 图像缓存 | 使用Canvas缓存 | 减少重复生成 |
| 打印预处理 | 预生成PDF | 减少打印时间 |
| 资源管理 | 懒加载 | 降低内存占用 |
2. 异常处理机制
try {
jsBarcode(canvas, text, config);
} catch (err) {
console.error('生成条形码失败:', err);
alert('无法生成条形码,请检查输入内容');
}3. 安全防护措施
const sanitizedText = this.inputText.replace(/[^a-zA-Z0-9]/g, '');- 过滤特殊字符防止注入攻击
- 限制输入长度(建议不超过20字符)
- 验证输入格式(如日期、编号等)
九、常见问题与踩坑
1. 扫码枪无法识别
常见原因:
- 条形码尺寸过小(建议宽2.5cm以上)
- 分辨率不足(需300dpi以上)
- 编码类型不匹配(扫码枪不支持code128)
解决方法:
- 调整
height和width参数 - 增加
resolution配置 - 更换为code39编码
2. 打印后内容缺失
常见原因:
- 打印机设置错误(如纸张尺寸不匹配)
- CSS样式影响打印效果
- 打印机驱动未正确安装
解决方法:
- 检查打印设置中的纸张尺寸
- 添加
@media print样式 - 更新打印机驱动
3. 打印内容错位
常见原因:
- 使用
position: absolute导致定位错误 - 没有设置
page-break-inside: avoid - 缺少
@page规则
解决方法:
@media print {
.barcode-preview {
page-break-inside: avoid;
}
@page {
size: A4;
margin: 1cm;
}
}十、最佳实践
- 编码类型选择:优先使用code128,兼容性最好
- 尺寸配置:建议高度80-120px,宽度2-3px
- 打印配置:使用PDF格式打印,确保兼容性
- 安全校验:严格过滤输入内容,防止注入攻击
- 错误处理:添加全面的异常捕获机制
- 性能优化:使用Canvas缓存,避免重复生成
十一、总结
本文深入探讨了在Vue3.0项目中实现标签条形码打印的完整解决方案,重点分析了jsbarcode和Print.js插件的使用原理,以及PDA扫码枪的兼容性处理。通过三个代码示例和一个完整案例,展示了从条形码生成到打印的完整流程。
本方案适用于工业自动化、物流仓储等场景,但需要注意以下限制:
- 不适合需要动态更新的场景
- 高并发时需要增加缓存机制
- 需要配合专用打印机使用
建议在实际项目中结合具体需求进行调整,比如增加PDF导出功能、支持多格式打印等。通过合理配置和异常处理,可以构建一个稳定可靠的标签打印系统。