יצירת ברקוד 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 במצב Byte חשובים עבור ברקוד GS1QR
GS1QR הוא נושא דו‑ממדי מועדף בשרשרת האספקה, בתחום הבריאות והקמעונאות, שבו סמל יחיד צריך להכיל מזהה מוצר, מספר אצווה, תאריך תפוגה ומספר סידורי במטען מובנה אחד. תחביר GS1 Application Identifier מאפשר זאת, אך הוא תלוי ב‑Group Separator כדי להפריד שדות שאורכם אינו קבוע.
חשבו על מטען המשלב AI (10) למספר אצווה ו‑AI (21) למספר סידורי. שניהם באורך משתנה, ולכן הסורק צריך גבול מפורש ביניהם. ללא מפריד מקודד כראוי, מערכת במטה קוראת מחרוזת מאוחדת אחת במקום שני שדות. הברקוד נסרק בהצלחה ועדיין מספק נתונים שגויים, הסוג הגרוע ביותר של כשל, מכיוון שאין דבר באירוע הסריקה שמסמן את הבעיה.
קידוד במצב בתים פותר זאת במקור. המקודד מפסיק לפרש את המפריד כסמן מבני וכותב אותו במילה המדויקת למקטע הנתונים. היתרונות המעשיים למפתחי פייתון הם ישירים:
- עמידה. הסמל המופק תואם למפרט הכללי של GS1 במקום לקירוב שלו.
- קוד פשוט יותר. אין הרכבת בתים ידנית, אין תת‑מחלקת מקודד מותאמת, אין שלב עיבוד לאחרי.
- יכולת בדיקה. המעבר הלולאה ניתן לאימות בבדיקה יחידתית על‑ידי אימות נקודות קוד מפוענחות.
יצירת קודי GS1QR באמצעות Aspose.BarCode for Python
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.
חומרי ההפניה זמינים בדף המוצר, באתר התיעוד, ובהפניה ל‑API.
אם יש לך קובץ רישיון, יש להחיל אותו פעם אחת בעת הפעלת היישום, לפני כל קריאת יצירה או זיהוי:
from aspose.barcode import License
license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")
צור ברקוד GS1QR עם מפריד במצב Byte
- ייבא את הסוגים הדרושים -
BarcodeGeneratorandEncodeTypesfor generation,BarCodeReaderandDecodeTypefor verification. - צור מופע של
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 ללא אובדן, משמר את תבנית המודול המדויקת. זה חשוב יותר לסמלים דו‑ממדיים מאשר לאחד‑ממדיים, מכיוון שמפענח QR דוגם רשת ואינו סובל מגבולות מודול מטושטשים.read_bar_codes()מחזיר איטרביל של אובייקטיBarCodeResult, ו‑result.code_textמכיל את המידע המפוענח כולל כל תווי הבקרה. בקונסול, המפריד מוצג כ‑כלום, ולכן החלק הבא בודק נקודות קוד במקום לסמוך על הפלט המודפס.
קרא ואמת את הברקוד שנוצר
הדפסת המחרוזת המפוענחת מוכיחה שהסמל קריא, ולא שהוא נכון. מכיוון שהמפריד הקבוצתי אינו ניתן להדפסה, מטען עם מפריד חסר ואחד עם מפריד נכון נראים זהים במסוף. האימות צריך להתבצע ברמת נקודת הקוד, מה שמקל גם על ההוכחה במערכת בדיקות.
שלבים
- טען את קובץ PNG השמור עם
BarCodeReaderו-DecodeType.GS1QR. - עבור על תוצאות הפענוח.
- בדוק את נקודת הקוד 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.
משאבים נוספים בחינם
סיכום
האפשרות 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. גרסאות קודמות דורשות מניפולציה ידנית של בתים כדי לשלב מפרידי קבוצה.
