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은 공급망, 의료 및 소매 분야에서 선택되는 2차원 운반체로, 하나의 심볼에 제품 식별자, 배치 번호, 유통 기한 및 일련 번호를 하나의 구조화된 페이로드에 담아야 합니다. GS1 애플리케이션 식별자 구문이 이를 가능하게 하지만, 길이가 고정되지 않은 필드를 구분하기 위해 그룹 구분자에 의존합니다.
배치 번호에 대한 AI (10)와 일련 번호에 대한 AI (21)를 결합한 페이로드를 고려하십시오. 두 AI 모두 가변 길이이므로 스캐너는 두 사이에 명시적인 구분자가 필요합니다. 올바르게 인코딩된 구분자가 없으면 다운스트림 시스템이 두 필드 대신 하나의 연결된 문자열을 읽게 됩니다. 바코드는 성공적으로 스캔되지만 여전히 잘못된 데이터를 전달하는데, 이는 스캔 이벤트에 문제를 알리는 신호가 전혀 없기 때문에 발생하는 최악의 실패 유형입니다.
바이트 모드 인코딩은 이를 근원에서 해결합니다. 인코더는 구분자를 구조적 마커로 해석하는 것을 중단하고 데이터를 그대로 데이터 세그먼트에 기록합니다. 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 아래에 있습니다.
참조 자료는 제품 페이지, 문서 사이트, 및 API 참조에서 확인할 수 있습니다.
라이선스 파일이 있는 경우, 애플리케이션 시작 시 한 번 적용하고, 모든 생성 또는 인식 호출 전에 사용하십시오:
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를 기록하여 정확한 모듈 패턴을 보존합니다. 이는 1D보다 2D 심볼에 더 중요합니다. QR 디코더는 그리드를 샘플링하고 흐릿한 모듈 경계에 관대하지 않기 때문입니다.read_bar_codes()는BarCodeResult객체의 반복 가능한 컬렉션을 반환하고,result.code_text는 제어 문자까지 포함한 디코딩된 페이로드를 보유합니다. 콘솔에서는 구분자가 전혀 표시되지 않으므로 다음 섹션에서 출력 결과를 신뢰하지 않고 코드 포인트를 검사하는 이유가 바로 그것입니다.
생성된 바코드 읽기 및 검증
디코딩된 문자열을 출력하면 해당 기호가 읽을 수 있다는 것을 증명할 수 있지만, 올바른지 여부는 증명되지 않습니다. 그룹 구분자는 출력할 수 없기 때문에 구분자가 누락된 페이로드와 올바른 구분자를 가진 페이로드가 터미널에서 동일하게 보입니다. 검증은 코드 포인트 수준에서 이루어져야 하며, 이는 테스트 스위트에서 단언하기 쉽게 만듭니다.
단계
- 저장된 PNG를
BarCodeReader와DecodeType.GS1QR를 사용하여 로드합니다. - 디코딩된 결과를 반복합니다.
- 각 문자들의 유니코드 코드 포인트를 검사하여
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(...)로 결과를 물리화하면 빈 경우가 명시적으로 드러납니다. 인식 실패는 예외를 발생시키는 대신 빈 iterable을 반환하므로, 실패한 읽기에 대해 보호되지 않은for루프가 조용히 종료되고 성공으로 보고됩니다. - 코드 포인트 루프가 실제 단언입니다. 출력에
U+001D가 표시되면 바이트 모드가 정상적으로 작동했음을 확인할 수 있으며, 이 값이 없으면 구분자가 삭제되었거나 변형된 것이며, 출력된 페이로드가 얼마나 깔끔해 보여도 관계없습니다. \x1d로 분할하면 개별 AI 필드를 재구성하여 CI 파이프라인에서 원본 데이터와 비교할 수 있는 값을 제공합니다.
무료 라이선스 받기
Aspose는 평가 워터마크를 제거하고 테스트를 위한 전체 기능을 잠금 해제하는 임시 무료 라이선스를 제공합니다. Aspose 임시 라이선스 페이지에서 요청하십시오.
무료 추가 리소스
결론
The encode_gs1_separator_in_byte_mode 옵션은 수동 바이트 처리를 하나의 부울로 대체합니다. QR 매개변수에 설정하면 GS1 그룹 구분자와 % 문자도 사양에서 요구하는 대로 심볼에 정확히 기록됩니다.
이 튜토리얼에서는 설치, 바이트 모드 구분자를 사용한 GS1QR 심볼 생성, 그리고 콘솔 출력에 의존하지 않고 코드 포인트 수준에서 결과를 검증하는 방법을 다루었습니다. 그 검증 단계가 가장 유지할 가치가 있는 부분입니다. GS1 워크플로우에서는 스캔되는 바코드가 올바른 바코드와 동일하지 않으며, 테스트 스위트에 포함된 코드 포인트 단언이 라벨이 생산에 들어가기 전에 두 가지를 구분해 줍니다.
FAQs
encode_gs1_separator_in_byte_mode 옵션은 무엇을 합니까? QR 인코더에게 GS1 그룹 구분자(ASCII 29)와
%문자를 구조적 마커로 처리하지 않고 원시 바이트 데이터로 출력하도록 지시하여 바코드 페이로드에 그대로 보존되도록 합니다.GS1QR 기능을 사용하려면 특별한 라이선스가 필요합니까? GS1QR은 표준 Aspose.BarCode 라이브러리의 일부입니다. 라이선스 없이 평가할 수 있으며, 평가 워터마크를 제거하려면 Aspose 웹사이트에서 무료 임시 라이선스를 요청할 수 있습니다.
이 기능을 다른 QR 코드 유형과 함께 사용할 수 있나요? 아니요. 이 플래그는 GS1QR 인코드 유형에 적용됩니다. 표준 QR 및 마이크로 QR 인코더는 이를 무시합니다. 이는 GS1 애플리케이션 식별자 파싱이 해당 유형에 적용되지 않기 때문입니다.
생성된 바코드 이미지가 무손실인가요? 기본값인 PNG로 저장하면 정확한 모듈 패턴을 보존하는 무손실 이미지가 생성됩니다. 바코드에는 JPEG를 피하십시오. JPEG의 압축 아티팩트가 모듈 가장자리를 흐리게 하여 판독률을 낮춥니다.
구분 기호가 올바르게 인코딩되었는지 어떻게 확인합니까? 이미지를
BarCodeReader와DecodeType.GS1QR를 사용하여 다시 읽고, 디코딩된 문자열의 코드 포인트를 검사합니다. 페이로드에 있는U+001D는 그룹 구분 기호가 바이트 모드로 인코딩되었음을 확인합니다.바이트 모드를 활성화하면 바코드 크기에 영향을 줍니까? 바이트 모드는 알파벳-숫자 모드보다 더 많은 데이터 비트를 필요로 할 수 있어, 심볼이 더 큰 QR 버전으로 이동할 수 있습니다. 라이브러리는 자동으로 맞는 가장 작은 버전을 선택하므로, 증가폭은 보통 한 단계 정도에 불과합니다.
어떤 버전의 Aspose.BarCode에서 이 옵션이 도입되었나요?
encode_gs1_separator_in_byte_mode속성은 Aspose.BarCode for Python via .NET 26.6에 추가되었습니다. 이전 버전에서는 그룹 구분자를 삽입하려면 수동으로 바이트를 조작해야 합니다.
