TCPDF - проблема с буквенно-цифровыми символами (неправильный размер) - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема с размером при использовании TCPDF для генерации QR-кода только с буквенно-цифровыми символами. Моя цель: создать самый длинный URL (со случайной частью), но сохранить минимальный размер QR-кода, то есть модули 21x21 (версия 1). Документация ( QRcode.com ) сообщает, что при использовании только набора буквенно-цифровых символов ( thonky.com ) URL-адрес может иметь длину 25 символов, а для ERC задано значение L.

Использование write2DBarCode с этим 25 буквенно-цифровым URL приводит к версии 1 (21x21mod) QR, как и ожидалось

$pdf->write2DBarcode('HTTP://SITE-COM/123456789', 'QRCODE,L', 20, 20, 40, 40, $style, 'N');

но при переходе на этот другой URL, также с 25 буквенно-цифровыми, я получаю QR-код версии 2 (25x25mod), тогда как можно сделать версию 1 ( Протестировано на Наюки )

$pdf->write2DBarcode('HTTP://TXT-CH/AYAWEQYAF4A', 'QRCODE,L', 20, 70, 40, 40, $style, 'N');

Я присоединяюсь к выходам TCPDF 2 QR-кодов, приведенных в качестве примеров Выходы TCPDF

Заранее благодарим за помощь в этой замечательной библиотеке TCPDF.

1 Ответ

0 голосов
/ 07 ноября 2018

Краткий ответ: используемое вами программное обеспечение TCPDF неоптимально. Он генерирует полный 4-битный терминатор, даже если достаточно более короткий. Пожалуйста, свяжитесь с авторами программного обеспечения, чтобы решить проблему. Вы можете связать их с этой темой.


Итак, я обрезал ваше изображение в два изображения QR-кода и отправил их в ZXing Decoder Online и KaarPoSoft QR Decode с выводом отладки .

ZXing, первый штрих-код:

Decode Succeeded
Raw text              HTTP://SITE-COM/123456789
Raw bytes             20 83 1a a6 5f 9f d5 b4 75 3e 8d 20 48 81 23 db 91 8a 80
Barcode format        QR_CODE
Parsed Result Type    URI
Parsed Result         HTTP://SITE-COM/123456789

ZXing, второй штрих-код:

Decode Succeeded
Raw text              HTTP://TXT-CH/AYAWEQYAF4A
Raw bytes             20 cb 1a a6 5f 9f d6 5e ae 82 ca 0f 21 e2 52 18 11 53 94 00 ec 11 ec 11 ec 11 ec 11 ec 11 ec 11 ec 11
Barcode format        QR_CODE
Parsed Result Type    URI
Parsed Result HTTP://TXT-CH/AYAWEQYAF4A

KaarPoSoft, первый штрих-код:

Debug output
skew_limit=7.21875
skew=0
left=31 right=427 top=27 bottom=423
size=397
matchVersion version=1 finder0=64 finder1=64 finder2=64
matchVersion version=1 timing0=1 timing1=1 alignment=1
matchVersion version=1 format_NW =14 0 format_NESW =14 1 format = 14 ecl = 1 mask = 6
matchVersion version=1 grades(F(V)TAF): 4444->4
findModuleSize matchVersion version=1 grade=4
findModuleSize version=1 grade=4 error_correction_level=1 mask=6
getCodewords mask=6 length=26
getCodewords = 32,131,26,166,95,159,213,180,117,62,141,32,72,129,35,219,145,138,128,62,191,105,157,147,176,164
setBlocks n_blocks_first=1 n_blocks_second=0 n_blocks=1 n_block_words_first=19 n_block_words_second=0 n_block_ec_words=7 total=26
setBlocks block 0 (26): 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
RS calculateSyndroms: No errors
correctErrors in = 32,131,26,166,95,159,213,180,117,62,141,32,72,129,35,219,145,138,128,62,191,105,157,147,176,164
correctErrors out = 32,131,26,166,95,159,213,180,117,62,141,32,72,129,35,219,145,138,128
error_grade=4
extractData bytes in (19) = 32,131,26,166,95,159,213,180,117,62,141,32,72,129,35,219,145,138,128
extractData mode = 2
extractAlphanum charcount = 16
extractData mode = 1
extractNumeric charcount = 9
extractData mode = 0
extractData data(25) = 72,84,84,80,58,47,47,83,73,84,69,45,67,79,77,47,49,50,51,52,53,54,55,56,57

KaarPoSoft, второй штрих-код:

Debug output
skew_limit=7.015625
skew=1
left=21 right=417 top=30 bottom=425
size=396.5
findModuleSize matchVersion version=1 grade=0
matchVersion version=2 finder0=64 finder1=64 finder2=64
matchVersion version=2 timing0=1 timing1=1 alignment=1
matchVersion version=2 format_NW =14 0 format_NESW =14 1 format = 14 ecl = 1 mask = 6
matchVersion version=2 grades(F(V)TAF): 4444->4
findModuleSize matchVersion version=2 grade=4
findModuleSize version=2 grade=4 error_correction_level=1 mask=6
getCodewords mask=6 length=44
getCodewords = 32,203,26,166,95,159,214,94,174,130,202,15,33,226,82,24,17,83,148,0,236,17,236,17,236,17,236,17,236,17,236,17,236,17,87,194,99,197,7,184,131,204,163,52
setBlocks n_blocks_first=1 n_blocks_second=0 n_blocks=1 n_block_words_first=34 n_block_words_second=0 n_block_ec_words=10 total=44
setBlocks block 0 (44): 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43
RS calculateSyndroms: No errors
correctErrors in = 32,203,26,166,95,159,214,94,174,130,202,15,33,226,82,24,17,83,148,0,236,17,236,17,236,17,236,17,236,17,236,17,236,17,87,194,99,197,7,184,131,204,163,52
correctErrors out = 32,203,26,166,95,159,214,94,174,130,202,15,33,226,82,24,17,83,148,0,236,17,236,17,236,17,236,17,236,17,236,17,236,17
error_grade=4
extractData bytes in (34) = 32,203,26,166,95,159,214,94,174,130,202,15,33,226,82,24,17,83,148,0,236,17,236,17,236,17,236,17,236,17,236,17,236,17
extractData mode = 2
extractAlphanum charcount = 25
extractData mode = 0
extractData data(25) = 72,84,84,80,58,47,47,84,88,84,45,67,72,47,65,89,65,87,69,81,89,65,70,52,65

Похоже, что оба QR-кода не имеют проблем с исправлением ошибок или нарушениями формата.


Из вывода KaarPoSoft мы видим сегменты в QR-кодах.

Первый штрих-код состоит из двух сегментов:

  1. Буквенно-цифровой режим, число = 16, текст = "HTTP://SITE -COM /". Длина сегмента в битах = 4 (режим) + 9 (количество) + 88 (данные) = 101 бит.
  2. Числовой режим, число = 9, текст = "123456789". Длина сегмента в битах = 4 (режим) + 10 (количество) + 30 (данные) = 44 бита.

Второй штрих-код имеет один сегмент:

  1. Буквенно-цифровой режим, число = 25, текст = "HTTP://TXT -CH / AYAWEQYAF4A". Длина сегмента в битах = 4 (режим) + 9 (количество) + 138 (данные) = 151 бит.

Теперь QR-код версии 1 с низким уровнем исправления ошибок способен вместить 19 байтов кодового слова данных или 152 бита. Первый штрих-код использует 101 + 44 = 145 бит = 19 байт (округлено), поэтому он подходит. Второй штрих-код использует 151 бит = 19 байт (округлено), поэтому он подходит. Таким образом, теоретически оба списка сегментов текстовых данных должны соответствовать версии 1 с низким ECC.

Согласно спецификации QR, после окончания списка сегментов добавляются следующие биты:

  1. (TERM) До четырех бит «0» (но меньше при достижении емкости данных) для псевдо-режима терминатора.
  2. (BITPAD) От нуля до семи битов «0» для заполнения последнего частичного байта.
  3. (BYTEPAD) Чередование байтов 0xEC и 0x11 до тех пор, пока не будет достигнута емкость данных.

Давайте рассмотрим, что на самом деле произошло. Преобразовать вывод шестнадцатеричных байтов ZXing в двоичный файл и аннотировать поля.

Первый штрих-код:

20 83 1a a6 5f 9f d5 b4 75 3e 8d 20 48 81 23 db 91 8a 80
0010  000010000 [88 bits]  0001  0000001001 [30 bits] 0000  000  (Total length = 152 bits)
^Mode ^Count    ^Data      ^Mode ^Count     ^Data     ^TERM ^BITPAD

Второй штрих-код:

20 cb 1a a6 5f 9f d6 5e ae 82 ca 0f 21 e2 52 18 11 53 94 00 ec 11 ec 11 ec 11 ec 11 ec 11 ec 11 ec 11
0010  000011001 [138 bits] | 0000  00000   11101100 00010001 [...]  (Total length = 272 bits)
^Mode ^Count    ^Data      | ^TERM ^BITPAD ^BYTEPAD

Обратите внимание, что во втором штрих-коде, в позиции | непосредственно перед TERMinator, слева находится 151 бит. Терминатор обычно имеет четыре "0" бита, но его можно сократить, если достигнута емкость (152 бита). Таким образом, оптимальным ограничителем является один бит «0», и тогда не должно быть ни битового дополнения, ни байтового дополнения.

...