在实际的业务场景中,我们常常需要从 PDF 文件中提取条码信息,例如快递面单 批次单 票据 物流标签等。手动逐个查看显然效率极低。为了解决这个痛点,我们可以通过 Go 语言开发一个 自动扫描目录内所有 PDF 并提取条码(二者均支持二维码与 Code128 条码) 的实用工具。
本文将结合一段完整的 Go 代码逐步解析其实现原理,为你构建类似工具提供参考。
一 整体功能设计
这个程序实现了以下功能
1 自动扫描当前目录及所有子目录中的 PDF 文件 2 利用 go fitz 将 PDF 渲染为图片 3 使用 gozxing 库识别条码 支持
- Code128 一维条码
- QR Code 二维码 4 将识别结果按文件保存到 CSV 5 运行结束后输出条码统计结果
输出文件示例
bash
文件名,条码数量,条码内容
./docs/label1.pdf,2,1234567890; https://example.com
二 核心库介绍
本工具主要用到三个库
1 go fitz(PDF 渲染库)
用于将 PDF 页面转换成 image.Image,以便进一步识别条码。
2 gozxing(ZXing Go 语言实现)
支持各种条码格式,包括 Code128 和 QRCode,是本程序的识别核心。
3 encoding/csv
将识别结果输出为 CSV 文件,方便统计分析。
三 条码识别核心 decodeSingle
下面是条码识别的关键函数,它接收一张图片并尝试读取两类条码。
go
func decodeSingle(img image.Image) ([]string, error) {
bitmap, err := gozxing.NewBinaryBitmapFromImage(img)
if err != nil {
return nil, err
}
var results []string
// Code128
reader := oned.NewCode128Reader()
res, err := reader.Decode(bitmap, nil)
if err == nil {
results = append(results, res.String())
}
// QRCode
qrReader := qrcode.NewQRCodeReader()
resQR, err := qrReader.Decode(bitmap, nil)
if err == nil {
results = append(results, resQR.String())
}
return results, nil
}
设计亮点
- 即使某一种条码识别失败,也不会影响其他类型条码的解析
- 返回一个字符串数组,可兼容多个条码同时存在
四 PDF 批量处理 extractFromPDF
Go fitz 会将 PDF 每一页转成图片,然后逐页识别。
go
for i := 0; i < doc.NumPage(); i++ {
img, err := doc.Image(i)
if err != nil {
continue
}
codes, _ := decodeSingle(img)
allCodes = append(allCodes, codes...)
}
设计亮点
- 支持多页 PDF
- 遇到无法渲染的页面会跳过而不影响整体运行
五 扫描目录下所有 PDF
程序通过 WalkDir 遍历当前目录及所有子目录,非常适合批量处理业务场景。
go
filepath.WalkDir(".", func(path string, d os.DirEntry, err error) error {
if !d.IsDir() && strings.HasSuffix(strings.ToLower(d.Name()), ".pdf") {
pdfFiles = append(pdfFiles, path)
}
return nil
})
六 结果写入 CSV
所有识别出的条码最终写入 CSV:
go
writer.Write([]string{
pdf,
fmt.Sprintf("%d", len(codes)),
strings.Join(codes, "; "),
})
优势
- Excel 可直接打开
- 可继续二次加工,例如进行去重、统计、匹配等需求
七 完整流程示例
工具的标准运行流程如下
1 放置 PDF 文件于任意子目录 2 运行程序 3 自动发现所有 PDF 4 自动解析每一页条码 5 结果写入 barcode_result.csv 6 通过控制台展示解析过程
最终输出:
完成 → barcode_result.csv
八 常见问题与优化思路
1 PDF 页面图片过大导致识别慢
可添加缩放处理提升识别速度
2 某些条码识别率不高
- 增加亮度增强滤波
- 多角度旋转尝试识别
3 部分 PDF 含多张图片
可将 fitz.Image 转换过程进一步优化,提取所有图层图片
4 支持更多条码格式
gozxing 还支持 Code39、EAN 等,可直接扩展
九 总结
本文介绍了一个完整的 Go 工具,实现了目录扫描 PDF 图片提取条码识别结果导出 CSV 的全自动流程。通过 go fitz 和 gozxing,我们可以快速构建企业级批量 PDF 条码识别工具。