إن إنشاء رمز شريطي 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) لرقم السلسلة. كلاهما بطول متغير، لذا يحتاج الماسح إلى حد واضح بينهما. بدون فاصل مشفر بشكل صحيح، يقرأ النظام المتلقي سلسلة موحدة بدلاً من حقلين. ينجح مسح الباركود ولكنه لا يزال يقدم بيانات خاطئة، وهو أسوأ نوع من الفشل، لأن لا شيء في حدث المسح يشير إلى المشكلة.

يحل ترميز وضع البايت هذه المشكلة من المصدر. يتوقف المشفر عن تفسير الفاصل كعلامة هيكلية ويكتبها حرفيًا في جزء البيانات. الفوائد العملية لمطوري بايثون مباشرة:

  • الامتثال. الرمز المُصدَر يتطابق مع مواصفات GS1 العامة بدلاً من تقريبها.
  • كود أبسط. لا تجميع يدوي للبايتات، لا فئة مشفر مخصصة، لا تمريرة معالجة لاحقة.
  • قابلية الاختبار. يمكن التحقق من الجولة الكاملة في اختبار وحدة عن طريق التأكيد على نقاط الشيفرة المفكوكة.

إنشاء رموز GS1QR باستخدام Aspose.BarCode for Python

Aspose.BarCode for Python via .NET يوفر واجهة برمجة تطبيقات عالية المستوى لكل من إنشاء الباركود والتعرف عليه. قم بتثبيته من 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 باستخدام فاصل وضع البايت

  1. استيراد الأنواع المطلوبة - BarcodeGenerator و EncodeTypes للتوليد، BarCodeReader و DecodeType للتحقق.
  2. إنشاء مثيل BarcodeGenerator باستخدام EncodeTypes.GS1QR وسلسلة حمولة GS1. الأقواس تُشير إلى أقسام AI، كما في (10)ASPOSE2001(21)ASPOSE2026.
  3. تمكين ترميز الفاصل في وضع البايت عن طريق ضبط gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True.
  4. تعيين دقة الإخراج بحيث يكون الرمز المرسوم قابلًا للاستخدام في الطباعة وكذلك على الشاشة.
  5. حفظ الصورة بتنسيق غير مضغوط، ثم قراءتها مرة أخرى لتأكيد الترميز.

المثال التالي يوضح سير العمل الكامل:

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 يحتوي على الحمولة المفكوكة بما في ذلك أي أحرف تحكم. في وحدة التحكم، يُظهر الفاصل كأنه لا شيء على الإطلاق، وهذا هو السبب في أن القسم التالي يفحص نقاط الشيفرة بدلاً من الاعتماد على المخرجات المطبوعة.

قراءة والتحقق من الباركود المُنشأ

طباعة السلسلة المفكوكة تثبت أن الرمز قابل للقراءة، وليس أنه صحيح. نظرًا لأن فاصل المجموعة غير قابل للطباعة، فإن حزمة البيانات التي تفتقد الفاصل وتلك التي تحتوي على فاصل صحيح تبدو متطابقة في الطرفية. يجب أن يتم التحقق على مستوى نقطة الشيفرة، مما يجعل من السهل أيضًا التأكيد على ذلك في مجموعة الاختبارات.

الخطوات

  1. تحميل ملف PNG المحفوظ باستخدام BarCodeReader و DecodeType.GS1QR.
  2. التكرار على النتائج المفككة.
  3. فحص نقطة رمز Unicode لكل حرف، والبحث عن U+001D.
  4. تقسيم الحمولة على الفاصل ومقارنة الحقول مع الإدخال الأصلي.
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، الباركود الذي يتم مسحه ليس هو نفسه الباركود الصحيح، وتأكيد نقطة الشيفرة في مجموعة الاختبارات الخاصة بك هو ما يميز بينهما قبل أن تصل الملصقات إلى الإنتاج.

FAQs

  1. ما الذي يفعله خيار encode_gs1_separator_in_byte_mode؟ إنه يوجه مُشفّر QR لإصدار فاصل مجموعة GS1 (ASCII 29) والحرف % كبيانات بايت خام بدلاً من معالجتهما كعلامات هيكلية، بحيث يبقيان سليمين في حمولة الباركود.

  2. هل أحتاج إلى ترخيص خاص لاستخدام ميزات GS1QR؟ GS1QR هو جزء من مكتبة Aspose.BarCode القياسية. يمكنك تقييمه بدون ترخيص، وطلب ترخيص مؤقت مجاني من موقع Aspose لإزالة علامات التقييم.

  3. هل يمكنني استخدام هذه الميزة مع أنواع رموز QR الأخرى؟ لا. العلامة تنطبق على نوع الترميز GS1QR. يتجاهل مشفرات QR القياسية وMicro QR ذلك، لأن تحليل معرف التطبيق GS1 لا ينطبق عليها.

  4. هل صورة الباركود المُولدة خالية من الفقدان؟ الحفظ بصيغة PNG، وهو الإعداد الافتراضي، ينتج صورة خالية من الفقدان تحافظ على نمط الوحدات بدقة. تجنّب استخدام JPEG للباركود، حيث إنّ عيوب الضغط فيه تشوش حواف الوحدات وتقلل من معدلات القراءة.

  5. كيف يمكنني التحقق من أن الفاصل تم ترميزه بشكل صحيح؟ قم بقراءة الصورة مرة أخرى باستخدام BarCodeReader مع DecodeType.GS1QR وتفقد نقاط الشيفرة للسلسلة المفكوكة. وجود U+001D في الحمولة يؤكد أن فاصل المجموعة تم ترميزه في وضع البايت.

  6. هل يؤثر تمكين وضع البايت على حجم الباركود؟ قد يتطلب وضع البايت عددًا أكبر من بتات البيانات مقارنةً بوضع الحروف الأبجدية الرقمية، مما قد يدفع الرمز إلى نسخة QR أكبر. تقوم المكتبة تلقائيًا باختيار أصغر نسخة تناسب البيانات، لذا عادةً ما تكون الزيادة خطوة نسخة واحدة كحد أقصى.

  7. أي إصدار من Aspose.BarCode قدم هذا الخيار؟ تم إضافة الخاصية encode_gs1_separator_in_byte_mode في Aspose.BarCode for Python via .NET 26.6. الإصدارات السابقة تتطلب تعديل البايت يدويًا لإدراج فواصل المجموعة.

اقرأ المزيد