生成 GS1QR 條碼很簡單,除非資料負載中包含群組分隔符。這個單一的不可列印字元(ASCII 29)告訴掃描器變長的應用程式識別碼欄位何時結束。開發人員透過手動位元組組裝、自訂編碼器或資料負載分割來繞過此問題,而每種繞過方式都可能產生雖能掃描卻無法解析的符號。
Aspose.BarCode for Python via .NET 26.6 透過單一旗標解決了此問題。encode_gs1_separator_in_byte_mode 屬性強制 QR 編碼器以原始位元組寫入 GS1 群組分隔符和 % 字元,保留精確的 GS1 結構。本教學涵蓋了在 python-net 中完整的條碼生成與辨識工作流程:安裝 SDK、產生符合規範的 GS1QR 符號,以及在碼點層級驗證分隔符在往返過程中仍然存在。
為什麼位元組模式 GS1 分隔符對 GS1QR 條碼很重要
GS1QR 是供應鏈、醫療保健和零售領域首選的二維載體,在此情境下,單一符號必須在一個結構化的有效負載中同時容納產品識別碼、批號、有效日期和序列號。GS1 應用標識符語法使此成為可能,但它依賴群組分隔符來分隔長度不固定的欄位。
考慮一個將 AI (10) 用於批號、AI (21) 用於序號的有效負載。兩者都是可變長度的,因此掃描器需要在它們之間設置明確的分界。若沒有正確編碼的分隔符,下游系統會將其讀取為一個連接的字串,而不是兩個欄位。條碼雖然成功掃描,但仍傳回錯誤的資料,這是最糟糕的失敗類型,因為掃描事件中沒有任何訊號指出問題。
位元組模式編碼在源頭解決此問題。編碼器停止將分隔符解讀為結構標記,並將其原樣寫入資料段。對於 Python 開發人員而言,實際好處是直接的:
- 合規性。 發出的符號符合 GS1 通用規範,而不是對其進行近似。
- 更簡潔的代碼。 無需手動位元組組裝,無需自訂編碼器子類別,無需後處理階段。
- 可測試性。 往返過程可在單元測試中通過斷言解碼的代碼點來驗證。
使用 Aspose.BarCode for Python 生成 GS1QR 條碼
Aspose.BarCode for Python via .NET 提供高階 API,支援條碼生成與識別。從 PyPI 安裝它:
pip install aspose-barcode-for-python-via-net
兩個類別承擔了大部分工作。BarcodeGenerator,來自 aspose.barcode.generation,負責建立和呈現符號。BarCodeReader,來自 aspose.barcode.barcoderecognition,對它們進行解碼。生成設定可透過生成器實例上的參數樹取得,特定符號的選項(例如 QR 設定)位於 parameters.barcode.qr 下。
如果您有授權檔案,請在應用程式啟動時一次性套用,於任何產生或辨識呼叫之前:
from aspose.barcode import License
license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")
生成帶有字節模式分隔符的 GS1QR 條碼
- 匯入所需的類型 -
BarcodeGenerator和EncodeTypes用於生成,BarCodeReader和DecodeType用於驗證。 - 實例化
BarcodeGenerator使用EncodeTypes.GS1QR並提供 GS1 負載字串。括號表示 AI 區段,例如(10)ASPOSE2001(21)ASPOSE2026。 - 啟用位元模式分隔符編碼,方法是設定
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True。 - 設定輸出解析度,使渲染的符號在列印和螢幕上皆可使用。
- 儲存影像 為無損格式,然後讀回以確認編碼。
以下示例演示了完整的工作流程:
from aspose.barcode.barcoderecognition import BarCodeReader, DecodeType
from aspose.barcode.generation import BarcodeGenerator, EncodeTypes
# 1. Create a GS1QR Barcode with Sample AI Data
# (10) = Batch or Lot Number, (21) = Serial Number
gen = BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026")
# 2. Turn on Byte-Mode Encoding for GS1 Group Separators
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True
# 3. Set a Print-Ready Resolution
gen.parameters.resolution = 300
# 4. Save the Barcode to a PNG File
gen.save("gs1qr_test.png")
# 5. Verify by Reading the Barcode Back
reader = BarCodeReader("gs1qr_test.png", DecodeType.GS1QR)
for result in reader.read_bar_codes():
print("BarCode CodeText: " + result.code_text)
它的工作原理
BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026")建立一個針對 GS1QR 符號的產生器。此載荷使用 GS1 語法,其中(10)為批次或批號 AI,(21)為序號 AI。函式庫會解析帶括號的形式,並插入規範要求的分隔符。gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True啟用 26.6 版中引入的選項。啟用後,編碼器會將組分隔符與%以原始位元組寫入資料段,而不是對其進行解釋。gen.parameters.resolution = 300以 300 DPI 進行渲染。僅在螢幕上顯示的符號在預設下即可,但若要用於標籤印表機或包裝圖稿,應以列印解析度產生,而不是之後再放大。gen.save("gs1qr_test.png")會寫入無損 PNG,保留精確的模組圖樣。這對 2D 符號比 1D 符號更為重要,因為 QR 解碼器會取樣格線,對模糊的模組邊界非常挑剔。read_bar_codes()回傳一個可迭代的BarCodeResult物件集合,result.code_text包含已解碼的載荷以及任何控制字元。在主控台中,分隔符會顯示為空白,這正是下一節檢查碼點而非相信列印輸出的原因。
讀取並驗證生成的條碼
列印已解碼的字串證明該符號是可讀的,而不是說它是正確的。由於群組分隔符是不可列印的,缺少分隔符的有效負載與具有正確分隔符的有效負載在終端機中看起來相同。驗證必須在碼點層級上進行,這也使得在測試套件中斷言變得簡單直接。
步驟
- 使用
BarCodeReader和DecodeType.GS1QR加載已保存的 PNG。 - 遍歷解碼結果。
- 檢查每個字符的 Unicode 代碼點,尋找
U+001D。 - 在分隔符處拆分有效負載,並將字段與原始輸入進行比較。
from aspose.barcode.barcoderecognition import BarCodeReader, DecodeType
GROUP_SEPARATOR = "\x1d"
# Load the Barcode Image Generated Earlier
reader = BarCodeReader("gs1qr_test.png", DecodeType.GS1QR)
results = list(reader.read_bar_codes())
if not results:
raise ValueError("No GS1QR barcode was detected in the image.")
for result in results:
decoded = result.code_text
print("Decoded GS1QR payload:", decoded)
# Inspect the Code Point of Every Character
for index, char in enumerate(decoded):
label = repr(char) if char.isprintable() else "<non-printable>"
print(f"Char {index}: {label} (U+{ord(char):04X})")
# Confirm the Separator Survived the Round Trip
if GROUP_SEPARATOR in decoded:
fields = decoded.split(GROUP_SEPARATOR)
print(f"Separator found. Payload splits into {len(fields)} field(s):")
for field in fields:
print(" -", field)
else:
print("Warning: no group separator present in the decoded payload.")
它是如何運作的
- 使用
DecodeType.GS1QR配置讀取器會限制識別僅針對該符號,這比掃描所有類型更快且更安全,因為它可防止將畸形符號解碼為普通 QR 並悄悄通過。 - 在檢查之前使用
list(...)具體化結果,使空情況明確。識別失敗會返回空的可迭代物件而不是拋出異常,因此對失敗讀取的未加保護的for迴圈會靜默完成並報告成功。 - 代碼點迴圈才是實際的斷言。在輸出中看到
U+001D表明位元組模式已生效;若缺少則表示分隔符被丟棄或轉換,無論列印的有效負載看起來多麼乾淨。 - 在
\x1d上進行分割可重建各個 AI 欄位,讓您得到的值可以在 CI 流程中與來源資料進行比對。
取得免費授權
Aspose 提供一個臨時免費授權,可移除評估水印並解鎖完整功能以供測試。請從 Aspose 臨時授權頁面 申請。
免費的額外資源
結論
The encode_gs1_separator_in_byte_mode 選項以單一布林值取代了一類手動位元處理。將其設定於 QR 參數上,GS1 群組分隔符號以及 % 字元將會依規範的要求精確寫入符號中。
本教程涵蓋了安裝、使用位元模式分隔符生成 GS1QR 符號,以及在代碼點層面驗證結果,而不是僅僅信任控制台輸出。這個驗證步驟是最值得保留的部分。在 GS1 工作流程中,能夠掃描的條碼並不等同於正確的條碼,而測試套件中的代碼點斷言則能在標籤投入生產之前區分兩者。
常見問題
encode_gs1_separator_in_byte_mode 選項的作用是什麼? 它指示 QR 編碼器將 GS1 群組分隔符(ASCII 29)和
%字元作為原始位元組資料輸出,而不是將它們視為結構標記,從而使它們在條碼負載中保持完整。我需要特殊授權才能使用 GS1QR 功能嗎?
GS1QR 是標準 Aspose.BarCode 庫的一部分。您可以在無授權的情況下評估它,並可從 Aspose 網站申請免費的臨時授權以移除評估水印。我可以將此功能與其他 QR 代碼類型一起使用嗎? 不。此標誌僅適用於 GS1QR 編碼類型。標準 QR 和 Micro QR 編碼器會忽略它,因為 GS1 應用標識符解析不適用於它們。
生成的條碼圖像是無損的嗎? 保存為 PNG(預設)會產生無損圖像,保留精確的模組圖案。避免使用 JPEG 於條碼,因為其壓縮雜訊會模糊模組邊緣並降低讀取率。
如何驗證分隔符已正確編碼? 使用
BarCodeReader並以DecodeType.GS1QR讀取圖像,檢查解碼字串的代碼點。有效負載中的U+001D證實組分隔符已以位元組模式編碼。啟用位元組模式會影響條碼大小嗎? 位元組模式可能需要比字母數字模式更多的資料位元,這可能會將符號推至較大的 QR 版本。庫會自動選擇最小的適合版本,因此增加通常最多只會是一個版本階段。
哪個版本的 Aspose.BarCode 引入了此選項?
encode_gs1_separator_in_byte_mode屬性是在 Aspose.BarCode for Python via .NET 26.6 中新增的。較早的版本需要手動位元組操作以嵌入組分隔符。
