FAQ TBarCode DLL / TBarCode Library
Comment créer un QR Code à concaténation structurée (Structured Append)
Comment créer un QR Code à concaténation structurée (Structured Append)
Exemple : si vous disposez d'une chaîne base64 que vous souhaitez encoder avec plusieurs QR-Codes liés entre eux, suivez ces étapes :
- Divisez la chaîne base64 en sous-chaînes gérables. La limite supérieure pour la taille d'une sous-chaîne est d'environ 2 000 caractères, mais cela dépend de facteurs comme les capacités du scanner, l'espace disponible et la résolution d'impression. Générez un QR Code distinct pour chaque sous-chaîne.
- Définissez l'en-tête Structured-Append dans chaque QR Code, en spécifiant le nombre total de codes concaténés, l'index actuel et l'octet de parité. Calculez l'octet de parité sur l'ensemble de la chaîne, pas par code individuel. L'en-tête Structured-Append aide le scanner à déterminer combien de QR Codes doivent être lus et si les données sont correctes.
Voici un exemple de fonction C++ pour enregistrer un QR Code avec un en-tête Append :
ERRCODE SaveStructAppendQRCode(LPCSTR path, LPCSTR dataStr, int dataLen, int count, int index, BYTE parity)
{
ERRCODE eCode = ErrOk;
t_BarCode* pBarCode = NULL; // barcode handle
double const dpi = 300;
RECT rect = { 0,0,255,255 };
if (eCode == ErrOk)
eCode = BCAlloc(&pBarCode);
if (eCode == ErrOk)
eCode = BCSetBCType(pBarCode, eBC_QRCode);
if (eCode == ErrOk)
eCode = BCSet_QR_Append(pBarCode, count, index, parity);
if (eCode == ErrOk)
eCode = BCSetTextA(pBarCode, dataStr, dataLen);
if (eCode == ErrOk)
eCode = BCCreate(pBarCode);
if (eCode == ErrOk)
eCode = BCSetDPI(pBarCode, dpi, dpi);
if (eCode == ErrOk)
eCode = BCSetIgnoreDpiFromDC(pBarCode, TRUE);
if (eCode == ErrOk)
eCode = BCSetSizeMode(pBarCode, e_SizeMode::eSizeMode_FitToBoundingRect);
if (eCode == ErrOk)
eCode = BCGetOptimalBitmapSize(pBarCode, &rect, 3, 3);
if (eCode == ErrOk)
eCode = BCSaveImageA(pBarCode, path, eIMBmp, rect.right, rect.bottom, dpi, dpi);
// use BCSaveImageEx for color bitmap
if(pBarCode)
BCFree(pBarCode);
return eCode;
}
Ensuite, vous créez des QR Codes individuels avec des en-têtes Structured Append comme indiqué ci-dessous :
ERRCODE eCode = ErrOk;
const char* base64Str = "Your base64 string goes here...";
int base64Len = strlen(base64Str);
if (base64Len > 400)
{
BYTE parity = BCCalcStructApp_ParityA(base64Str, base64Len);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-1.bmp", &base64Str[0], 200, 3, 1, parity);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-2.bmp", &base64Str[200], 200, 3, 2, parity);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-3.bmp", &base64Str[400], base64Len - 400, 3, 3, parity);
}
if (eCode != ErrOk)
{
char szErr[255];
BCGetErrorText(eCode, szErr, 255);
printf(szErr);
}
Dans le code fourni, une boucle destinée à calculer dynamiquement le nombre de symboles et à parcourir la chaîne base64 a été omise par souci de simplicité. Le code utilise à la place des sous-chaînes fixes de 200 caractères chacune, avec un total de 3 symboles dans la chaîne. Veillez à adapter ceci selon vos besoins.
- Ajustez la taille du code-barres ou la taille d'un point matriciel à l'aide des paramètres ScaleX et ScaleY de la fonction BCGetOptimalBitmapSize(..).
- BCSaveImage(..) génère un BMP monochrome. Pour un BMP couleur, utilisez BCSaveImageEx(..) ou la fonction BitmapToFile(..).
Notez que tester des QR Codes Structured Append peut nécessiter un scanner capable de les décoder correctement. Certaines applications ou certains scanners matériels peuvent ne pas prendre en charge Structured Append.