TCPDF — проблема с буквенно-цифровыми символами (неправильный размер)

У меня проблема с размером при использовании 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 двух QR-кодов, приведенных в качестве примеров выходам TCPDF

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


person Marc Benington    schedule 05.09.2018    source источник
comment
Пожалуйста, покажите вывод обоих QR-кодов из TCPDF. Возможно, он содержит дополнительные метаданные, такие как сегмент ECI.   -  person Nayuki    schedule 05.11.2018
comment
@Наюки Спасибо за ответ. Пожалуйста, найдите здесь выше результаты обоих QR-кодов в начальном сообщении, которое я написал. С Уважением.   -  person Marc Benington    schedule 07.11.2018


Ответы (1)


Краткий ответ: используемое вами программное обеспечение 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 low ECC.

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

  1. (TERM) До четырех нулевых битов (но меньше, если достигнута емкость данных) для псевдорежима терминатора.
  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 бит. Терминатор обычно состоит из четырех нулевых битов, но его можно укоротить, если достигнута емкость (152 бита). Таким образом, оптимальным ограничителем является один бит «0», и тогда не должно быть ни битового, ни байтового заполнения.

person Nayuki    schedule 07.11.2018
comment
Большое спасибо @Nayuki за этот чудесно подробный ответ. - person Marc Benington; 07.11.2018
comment
@Nicola Asuni, есть ли возможность обновить библиотеку TCPDF на этом этапе? - person Marc Benington; 07.11.2018
comment
Если вы считаете, что мой ответ удовлетворителен, пожалуйста, установите флажок, чтобы отметить его как принятый. - person Nayuki; 07.11.2018