在實際的業務場景中,我們常常需要從 PDF 文件中提取條碼信息,例如快遞面單 批次單 票據 物流標籤等。手動逐個查看顯然效率極低。為了解決這個痛點,我們可以通過 Go 語言開發一個 自動掃描目錄內所有 PDF 並提取條碼(二者均支持二維碼與 Code128 條碼) 的實用工具。
本文將結合一段完整的 Go 代碼逐步解析其實現原理,為你構建類似工具提供參考。
一 整體功能設計
這個程序實現了以下功能
1 自動掃描當前目錄及所有子目錄中的 PDF 文件 2 利用 go fitz 將 PDF 渲染為圖片 3 使用 gozxing 庫識別條碼 支持
- Code128 一維條碼
- QR Code 二維碼 4 將識別結果按文件保存到 CSV 5 運行結束後輸出條碼統計結果
輸出文件示例
文件名,條碼數量,條碼內容
./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
下面是條碼識別的關鍵函數,它接收一張圖片並嘗試讀取兩類條碼。
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 每一頁轉成圖片,然後逐頁識別。
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 遍歷當前目錄及所有子目錄,非常適合批量處理業務場景。
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:
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 條碼識別工具。