在實際的業務場景中,我們常常需要從 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 條碼識別工具。