Коды step-by-step: читаем / кодируем PDF417

  • Tutorial

Вы ведь любите коды? Ну или не любите. В любом случае, иногда нужно знать, как правильно ими пользоваться. Можно пойти длинным путём, как это сделал я в прошлый раз, но когда времени нет, проще воспользоваться инструкцией.


Итак, давайте разберёмся со всем необходимым для чтения и / или записи PDF417. Ведь не всегда под рукой найдётся смартфон с программой для их чтения. А для записи — и подавно.


Внимание, под катом — 9 изображений общим размером в 2.79 МБ, 6 таблиц и немного формул.





Оглавление






01. История PDF417 и право использования


(Назад | Оглавление | Вперёд)


PDF417 придумали в компании Symbol Technologies Inc. в 1991 году, а 7 сентября 1993 года на него был выдан патент США под номером 5 243 655 (доступен, к примеру, здесь). На самом деле, патент описывает не просто метод кодирования, а комплексную систему для кодирования и декодирования информации ("System for encoding and decoding data in machine readable graphic form"). Кроме того, не все из рекомендаций в патенте используются на данный момент.


Сразу стоит отметить, что использовать PDF417 можно свободно, без лицензирования или правовых ограничений.


Единственный подводный камень: если вы хотите точно соответствовать стандарту ISO/IEC 15438:2015, описывающему PDF417, — доступ к нему стоит 198 CHF (швейцарских франков). Именно он описывает все необходимые словари и прочее, однако большую часть информации можно легко найти в интернете. Патент, упомянутый выше, этой информации не содержит.





02. Графическое представление и структура


(Назад | Оглавление | Вперёд)


Каждый символ (код) PDF417 (Рис. 1) — это набор строк информации, представленной в виде штрихового кода. Каждая строка состоит из стартового паттерна, набора ключевых слов (два из которых называются левым и правым индикаторами и помогают в автоматизированном декодировании) и стоп паттерна. Слова из разных строк формируют колонки (столбцы).


Как количество строк, так и количество столбцов может варьироваться. Символ PDF417 может состоять из минимум 3 и максимум 90 строк, а также от 3 до 30 столбцов включительно.




Рис. 1. Структура PDF417 символа


Каждое слово состоит из 17 модулей (минимальных элементов), которые образуют чередующуюся последовательность из 4 заполненных и 4 пустых групп. Одна группа может быть длиной от 1 до 6 модулей.


Каждое слово представляют в виде уникальной $x-$последовательности ($x_0, …, x_7$). Все возможные слова делятся на 3 взаимоисключающие группы (кластера), то есть в каждом кластере содержаться одни и те же "значения", представленные разными "словами". Кроме того, слова могут быть представлены в виде $t-$последовательности, где каждое значение $t_i = x_{i-1} + x_i$. Это также помогает избежать ошибок при сканировании кодов.


Каждая строка PDF417 символа использует только один из кластеров последовательно. Таким образом, если один из кластеров используется строками $0, 3, 6,…$, то второй — строками $1, 4, 7,…$, а третий — строками $2, 5, 8,…$. Это нужно для правильного определения строки при автоматическом сканировании (Рис. 2), поскольку соседние строки не могут содержать слова одной группы.


Номер кластера однозначно определяется из $x-$ или $t-$последовательности по одной из формул:


$C = (x_0 - x_2 + x_4 - x_6) mod 9$,
$C = (t_1 - t_2 + t_5 - t_6) mod 9$,


где $mod 9$ — остаток от деления на 9.


На самом деле, можно было бы использовать не 3 разных кластера, а все 9 возможных, но это увеличило бы вероятность дополнительных ошибок. Номер кластера можно определить также из номера строки: $C = (n_r mod 3) * 3$.


Всего PDF417 использует 929 слов (от 000 до 928).





03. Компоненты символа


(Назад | Оглавление | Вперёд)


Каждый символ состоит из (Рис. 2):


  • Первого слова, кодирующего длину полезных данных, вместе с самим этим словом ($N$);
  • $N-1$ слова, содержащего полезные данные;
  • $N_e$ слов для проверки ошибок;
  • По $N_r$ левых и правых индикаторов.



Рис. 2. Компоненты символа PDF417


В случае, если количество слов с полезной информацией и проверочных слов недостаточно для формирования символа, между ними добавляются отступы (на практике в качестве отступа используется слово 900, об этом далее), которые занимают позиции $d_0, d_1,…$.





04. Режимы


(Назад | Оглавление | Вперёд)


Как уже было сказано, коды PDF417 содержат слова от 000 до 928 в виде трёх разных кластеров. Таким образом, в коде может встретиться всего 2 787 разных слов.


Слова от 000 до 899 включительно используются для записи полезной информации в одном из возможных режимов кодирования.


Слова 900 : 928 — сервисные и не кодируют информацию (Табл. 1). На сегодня нам потребуются лишь слова 900, 901, 902, 913 и 924, которые сообщают об использовании одного из стандартных режимов кодирования.



## Функция Описание
900 Текстовый режим (TC)
901 Байт-режим (BC)
902 Числовой режим (NC)
903: 912 Зарезервировано Используются для пользовательских надстроек
913 Байт-режим Только для следующего слова
914: 920 Зарезервировано Используются для пользовательских надстроек
921 Инициализация Слова далее будут интерпретированы
для инициализации или программирования сканера
922 PDF macro Конец блока
923 PDF macro Опциональное поле
924 Байт-режим Если количество байтов кратно 6
925 ECI / GLI Определяется пользователем
926 ECI / GLI Общие наборы символов
927 ECI / GLI Международные наборы символов
928 PDF macro Начало блока

Табл. 1. Сервисные слова PDF417. Выделены те, которые будут нам интересны


PDF macro позволяет разбить длинное сообщение на несколько PDF417 символов. При этом каждый символ содержит идентификатор сообщения, порядковый номер блока сообщения (для восстановления правильной последовательности) и другую информацию.


ECI / GLI — Extended Channel Interpretation / Global Label Identifier — система надстроек, которая позволяет кодировать нестандартные символы с помощью штриховых кодов. Так, возможно подключить один из международных наборов символов (к примеру, стандартным является GLI 0, именно эти таблицы приведены далее), наборов общего назначения либо ваших персональных наборов символов.





04.a) Текстовый режим (TC, Text Compaction Mode)


(Назад | Оглавление | Вперёд)


Этот режим стандартный для символов PDF417 (то есть именно с него начинается весь символ). У текстового режима есть 4 разных подгруппы:


  • Alpha (активируется при переходе в текстовый режим);
  • Lower case;
  • Mixed;
  • Punctuation.


## Alpha
Символ (ASCII)
Lower case
Символ (ASCII)
Mixed
Символ (ASCII)
Punctuation
Символ (ASCII)
0 A (65) a (97) 0 (48) ; (59)
1 B (66) b (98) 1 (49) < (60)
2 C (67) c (99) 2 (50) > (62)
3 D (68) d (100) 3 (51) @ (64)
4 E (69) e (101) 4 (52) [ (91)
5 F (70) f (102) 5 (53) \ (92)
6 G (71) g (103) 6 (54) ] (93)
7 H (72) h (104) 7 (55) _ (95)
8 I (73) i (105) 8 (56) ` (96)
9 J (74) j (106) 9 (57) ~ (126)
10 K (75) k (107) & (38) ! (33)
11 L (76) l (108) CR (13) CR (13)
12 M (77) m (109) HT (9) HT (9)
13 N (78) n (110) , (44) , (44)
14 O (79) o (111) : (58) : (58)
15 P (80) p (112) # (35) LF (10)
16 Q (81) q (113) — (45) — (45)
17 R (82) r (114) . (46) . (46)
18 S (83) s (115) $ (36) $ (36)
19 T (84) t (116) / (47) / (47)
20 U (85) u (117) + (43) " (34)
21 V (86) v (118) % (37) | (124)
22 W (87) w (119) * (42) * (42)
23 X (88) x (120) = (61) ( (40)
24 Y (89) y (121) ^ (94) ) (41)
25 Z (90) z (122) pl ? (63)
26 SP (32) SP (32) SP (32) { (123)
27 ll as ll } (125)
28 ml ml al ' (39)
29 ps ps ps al

Табл. 2. Подгруппы текстового режима в стандартной интерпретации GLI 0


  • al, ll, ml и pl — переключения в режимы alpha, lower case, mixed и punctuation соответственно (l = latch);
  • as и ps — переключения в режимы alpha и punctuation (s = shift) только для следующего слова.

Одно слово в базисе 900 содержит 2 символа из таблицы выше по правилу:


$V = 30 * H + L$,


Где $V$ — значение в базисе 900, $H$ — первый символ, $L$ — второй. Иногда символы указывают как $X_1$ и $X_2$ соответственно.


Если данные заканчиваются словом, в которое нужно включить только один символ, то он является $H$-значением, а в качестве $L$-значения используется значение 29.


Использование ещё одного перехода после shift-перехода запрещено. Ограничений на использование переходов после latch-перехода нет.





04.b) Байт-режим (BC, Byte Compaction Mode)


(Назад | Оглавление | Вперёд)


Данный режим позволяет записывать последовательность байтов с помощью последовательности кодовых слов в базисе 900. Для этого нужно совершить переход от базиса 256. Этот режим включается двумя разными сервисными словами:


  • 901 (если количество байтов кратно 6);
  • 924 (если не кратно).

Во втором случае, каждые 6 байтов представляются в виде 5 слов с помощью прямого перехода от базиса 256 в базис 900. К примеру, в случае последовательности байтов 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, переход будет следующим (Рис. 3).




Рис. 3. Кодирование, байт-режим


Тогда код должен содержать следующую последовательность слов:


924, 001, 620, 089, 074, 846.


Если же количество байтов не кратно 6, то все группы по 6 записываются в виде групп из 5 слов, а оставшиеся — в начальном виде. Таким образом, последовательность 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 будет записана следующим образом:


901, 001, 620, 089, 074, 846, 007, 008, 009.


Кроме того, байт-режим кодирования можно включить лишь для следующего слова с помощью сервисного слова 913.





04.c) Числовой режим (NC, Numeric Compaction Mode)


(Назад | Оглавление | Вперёд)


Числовой режим позволяет записать данные с помощью перехода из базиса с основой 10 в базис с основой 900. Соответственно, такой режим поддерживает запись цифр от 0 до 9. В результате, каждые 44 цифры можно записать в виде 15 слов.


Данный режим активируется сервисным словом 902. Хотя таким образом можно записать число произвольной длины, рекомендуется использовать его для всех чисел начиная от 13 знаков. Такой метод, позволяющий записать 3 цифры (на самом деле, 2.93) одним словом, является более компактным, чем текстовый режим (2 символа на слово).


Для перехода в базис 900 нужно дописать 1 к числу слева, а дальше выполнить переход как показано на Рис. 4. Обратный переход вполне очевидный, остаётся лишь убрать лишнюю 1 слева.




Рис. 4. Кодирование и декодирование, числовой режим





05. Коррекция ошибок


(Назад | Оглавление | Вперёд)


Давайте начнём с самого простого. В любом символе PDF417 присутствует как минимум 2 слова в области ответственной за коррекцию ошибок. Кроме того, коды характеризуются уровнем коррекции ошибок, для которых нужно разное количество дополнительных символов (Табл. 3).



Уровень Количество дополнительных слов
как это указывается (как это описано в патенте)
0 2 (0)
1 4 (2)
2 8 (6)
3 16 (14)
4 32 (30)
5 64 (62)
6 128 (126)
7 256 (254)
8 512 (510)

Табл. 3. Уровни коррекции ошибок в PDF417


Различают два вида ошибок:


  • Известна позиция ошибки, но не известно правильное значение (erasures), назовём "систематической ошибкой";
  • Ошибки, присутствующие в коде, положение которых не известно (errors), назовём "случайной ошибкой".

Введём следующие параметры:


$e - $количество систематических ошибок;
$k - $количество случайных ошибок;
$s - $уровень коррекции;
$N_e = 2^{s+1} - $количество слов для коррекции ошибок.


Тогда выполняется следующее условие:


$e + 2k \leq d - 2$


2 слова, которые присутствуют в символе в любом случае, используются для проверки, не возникла ли случайная ошибка при распознавании.


Вводится также понятие Error Correction Capacity, которое показывает, сколько же ошибок обоих видов мы можем исправить. Очевидно, что если все дополнительные слова используются для исправления систематических ошибок, то шанс случайной возрастает. Потому для всех уровней, кроме $s = 0$, считается, что:


$e + 2k \leq d - 3$.


Именно потому в патенте количество слов для коррекции ошибок на 2 меньше, чем его часто указывают сейчас. Эти 2 слова правильно называть контрольной суммой.


К примеру, с уровнем коррекции $s = 3$, можно исправить 13 систематических ошибок, либо 7 случайных, либо их комбинацию, которая всё ещё соответствует неравенству (9 систематических И 2 случайных и т.д.).


Для коррекции ошибок используются коды Рида-Соломона в поле Галуа $GF(929)$. На данный момент я не буду на них останавливаться.


Существуют также рекомендации относительно минимального уровня коррекции ошибок (Табл. 4).



Количество слов-данных Уровень коррекции ошибок
0: 40 2
41: 160 3
161: 320 4
321: 863 5

Табл. 4. Минимальный рекомендуемый уровень коррекции ошибок





06. Обязательные неинформационные слова


(Назад | Оглавление | Вперёд)


Как упоминалось раньше (Раздел 03), первое слово каждого кода означает длину полезных данных в символе PDF417.


Кроме того, каждый код содержит левые и правые индикаторы, которые помогают в распознавании символа. Как и обычные слова, они используют разные кластеры словаря, а кроме того, циклически содержат информацию о количестве строк в коде, количестве столбцов, а также уровне коррекции ошибок (Рис. 5).




Рис. 5. Правила записи левых и правых индикаторов





07. Словари


(Назад | Оглавление | Вперёд)


Словарь в виде x-последовательностей, 17-битных представлений на GitHub


Как упоминалось ранее (Раздел 02), словарь PDF417 состоит из 3 кластеров (0, 3 и 6) по 929 слов. Периодически их представляют в виде 17-битного числа, но я считаю такой вариант неудобным в сравнении с x-последовательностью. В любом случае, вы вольны решать, как вам удобнее, а потому выше приведены ссылки на оба варианта записи, а начало словарей приведено в Табл. 5.



## Кластер 0 Кластер 3 Кластер 6
0 31111136 51111125 21111155
1 41111144 61111133 31111163
2 51111152 41111216 11111246
3 31111235 51111224 21111254
4 41111243 61111232 31111262
5 51111251 41111315 11111345
6 21111326 51111323 21111353
7 31111334 61111331 31111361
8 21111425 41111414 11111444
9 11111516 51111422 21111452
10 21111524 41111513 11111543
11 11111615 51111521 61112114
12 21112136 41111612 11112155
13 31112144 41112125 21112163
14 41112152 51112133 61112213
15 21112235 61112141 11112254
16 31112243 31112216 21112262
17 41112251 41112224 61112312
18 11112326 51112232 11112353
19 21112334 31112315 21112361
20

Табл. 5. Первые 20 слов словаря в виде x-последовательностей





08. Стандартная 8-битная таблица символов


(Назад | Оглавление | Вперёд)


GLI 0


В качестве стандартной таблицы символов используется ASCII таблица для символов 0:127. Символы 128:255 представлены расширенным набором PC 437.



## Символ ## Символ ## Символ ## Символ ## Символ ## Символ ## Символ ## Символ
0 NUL 32 SP 64 @ 96 ` 128 Ç 160 á 192 224 α
1 SOH 33 ! 65 A 97 a 129 ü 161 í 193 225 ß
2 STX 34 " 66 B 98 b 130 é 162 ó 194 226 Γ
3 ETX 35 # 67 C 99 c 131 â 163 ú 195 227 π
4 EOT 36 $ 68 D 100 d 132 ä 164 ñ 196 228 Σ
5 ENQ 37 % 69 E 101 e 133 à 165 Ñ 197 229 σ
6 ACK 38 & 70 F 102 f 134 å 166 ª 198 230 µ
7 BEL 39 ' 71 G 103 g 135 ç 167 º 199 231 τ
8 BS 40 ( 72 H 104 h 136 ê 168 ¿ 200 232 Φ
9 HT 41 ) 73 I 105 i 137 ë 169 201 233 Θ
10 LF 42 * 74 J 106 j 138 è 170 ¬ 202 234 Ω
11 VT 43 + 75 K 107 k 139 ï 171 ½ 203 235 δ
12 FF 44 , 76 L 108 l 140 î 172 ¼ 204 236
13 CR 45 - 77 M 109 m 141 ì 173 ¡ 205 237 φ
14 SO 46 . 78 N 110 n 142 Ä 174 « 206 238 ε
15 SI 47 / 79 O 111 o 143 Å 175 » 207 239
16 DLE 48 0 80 P 112 p 144 É 176 208 240
17 DC1 49 1 81 Q 113 q 145 æ 177 209 241 ±
18 DC2 50 2 82 R 114 r 146 Æ 178 210 242
19 DC3 51 3 83 S 115 s 147 ô 179 211 243
20 DC4 52 4 84 T 116 t 148 ö 180 212 244
21 NAK 53 5 85 U 117 u 149 ò 181 213 245
22 SYN 54 6 86 V 118 v 150 û 182 214 246 ÷
23 ETB 55 7 87 W 119 w 151 ù 183 215 247
24 CAN 56 8 88 X 120 x 152 ÿ 184 216 248 °
25 EM 57 9 89 Y 121 y 153 Ö 185 217 249
26 SUB 58 : 90 Z 122 z 154 Ü 186 218 250 ·
27 ESC 59 ; 91 [ 123 { 155 ¢ 187 219 251
28 FS 60 < 92 \ 124 | 156 £ 188 220 252
29 GS 61 = 93 ] 125 } 157 ¥ 189 221 253 ²
30 RS 62 > 94 ^ 126 ~ 158 190 222 254
31 US 63 ? 95 _ 127 DEL 159 ƒ 191 223 255 NBSP

Табл. 6. Таблица GLI 0, которая используется кодами PDF417


GLI 1


Следующий набор символов соответствует стандарту ISO 8859-1 (Википедия).





09. Определяем код как PDF417, выравниваем и находим минимальный элемент


(Назад | Оглавление | Вперёд)


Пришло время прочитать наш первый PDF417 символ.


Хотя этот шаг кажется совсем необязательным, стоит помнить, что PDF417 характеризуется уникальными старт- и стоп-паттернами, которые представлены x-последовательностями 81111113 и 711311121 (18 модулей) соответственно.


Кроме того, поскольку эти паттерны одинаковы в каждой строке их легко использовать для выравнивания PDF417 символа (Рис. 6). Хотя это и более актуальная задача при автоматическом сканировании, читать код необходимо перпендикулярно к старт- и стоп-паттернам.




Рис. 6. Шаг 0 при чтении PDF417





10. Считаем и сопоставляем со словарями


(Назад | Оглавление | Вперёд)


На необходимо определить количество информационных слов. Оно содержится в первом слове кода (строка 0, слово 0). К примеру, в нашем случае это значение равно 19 (Рис. 7). Кроме того, стоит проверить уровень коррекции ошибок, который можно узнать с помощью левых или правый индикаторов (не забываем, нужно выбрать правильную строку, Раздел 06). В результате, у нас должно быть 1 слово-длина, 18 слов-данных и 8 проверочных слов, то есть 27, что соответствует действительности.


Теперь разобьём код на строки. Это поможет ускорить чтение, поскольку необходимо использовать разные кластеры словаря.




Рис. 7. Узнаём длину данных, характеристики кода





11. Переводим PDF417 в текстовый вид и проверяем режимы кодирования


(Назад | Оглавление | Вперёд)


Итак, каждому слову необходимо сопоставить одно из значений от 000 до 928 (Рис. 8). В результате, получаем последовательность чисел, с которой далее будет удобно работать.




Рис. 8. Переводим символ в текстовое представление


Следующий шаг — проверить наличие сервисных слов 900 : 928. Как видно на Рис. 8, в данном коде таких нет. Соответственно, вся информация закодирована с использованием текстового режима (TC, Раздел 04.a).





12. Переводим в привычный нам вид


(Назад | Оглавление | Вперёд)


Поскольку мы знаем, что используется только текстовый режим, каждое слово можно расшифровать как 2 символа по формуле:


$V = 30 * H + L$


То есть чтобы определить $H$ необходимо выполнить целочисленное деление на 30, а для $L$ — взять остаток от деления на 30.


Тогда всё сообщение можно записать как:


(27)(07) (19)(19) (15)(18) (28)(14) (19)(19) (28)(07) (27)(00) (01)(17) (29)(17) (02)(14) (12)(29) (19)(15) (14)(18) (19)(28) (19)(05) (00)(00) (09)(06) (02)(29)


Или же (используя Табл. 2):


(ll)https(ml)://(al)H(ll)abr(ps).com(ps)/post(ml)/500962(ps)


Подробнее о переключателях (ll), (ml), (al) и (ps) было в Разделе 04.a.


Что в стандартном виде будет выглядеть как:


https://Habr.com/post/500962


Итак, код скрывает ссылку на данную публикацию. С помощью дополнительных 8 символов можно проверить наличие ошибок в результатах (Раздел 05).





13. Особенности автоматизированного чтения


(Назад | Оглавление | Вперёд)


Автоматическое сканирование часто производится дважды — слева направо и наоборот. Это позволяет минимизировать количество ошибок.


Как и в случае ручного чтения, при автоматическом нужно выполнить поиск и выравнивание символа. Поскольку в жизни редко можно выровнять код и сканер идеально, необходимо чтобы линия сканирования не проходила через более чем 3 разные строки. В таком случае всегда можно будет определить, какие слова принадлежат какой строке (поскольку они находятся в разных кластерах).


Ещё один пункт, важный для неидеальных условий — чтение не $x-$последовательности, а $t-$последовательности (Раздел 02). Поскольку PDF417 рассчитаны в том числе на печать на физических носителях, возможно размытие чернил (и т.д.), которое может привести к тому, что заполненные группы модулей станут шире, а пустые — уже. Проводя сканирование от края до такого же края, такие ошибки можно минимизировать.


Следующим шагом является определение уровня коррекции ошибок и построение матрицы слов. Кроме того, строится ещё одна матрица, которая состоит из весов (уровня доверия каждому значению). Слова с низким уровнем доверия в последствии проверяются на ошибки первыми.





14. Минимизация кода


(Назад | Оглавление | Вперёд)


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


Схема

1. Пусть P - текущая точка кодирования
2. Считаем, что мы используем текстовый режим (900)
3. Пусть N - количество цифр, которые нужно закодировать, попавшие в точку P

    4. Если N ≥ 13
        5. Переходим в числовой режим (902)
        6. Кодируем в числовом режиме
        7. Уточняем P
        8. Переходим к шагу 3

    9. Если N < 13
        10. Пусть T - количество символов в последовательности, кодируемой в
            текстовом режиме. Последовательность прерывается при переходе в 
            другой режим (901, 902, 913, 924) или при появлении 
            последовательности в 13 цифр.

        11. Если T ≥ 5
            12. Переходим в текстовый режим (900)
            13. Кодируем символы
            14. Уточняем P
            15. Переходим к 3

        16. T < 5
            17. Пусть B - длина бинарной кодируемой последовательности, 
                начиная от P. Последовательность прерывается при условиях 11
                или 4.

            18. B == 1 & текущий режим - текстовый
                19. Переходим в байтовый режим на 1 слово (913)
                20. Кодируем один байт
                21. Уточняем P
                22. Переходим к шагу 3

            23. Иначе
                24. Переходим в байтовый режим (901 или 924 в зависимости от
                    количества байтов, Раздел 04.b)
                25. Кодируем
                26. Уточняем P
                27. Переходим к шагу 3





15. Размеры, пропорции и чистые зоны


(Назад | Оглавление | Вперёд)


Несмотря на то, что строгих ограничений на размер символа PDF417 нет, есть рекомендации касательно пропорций одного модуля. Так, желательно сохранять соотношение высоты к ширине примитивного элемента не менее $3:1$ (если вы соблюдаете минимальный рекомендуемый уровень коррекции ошибок, Табл. 4). Если рекомендации не соблюдаются, соотношение должно быть не менее $4:1$.


Кроме того, вокруг PDF417 необходимо оставлять "чистую зону", размером не менее 2 ширин модуля.


Посчитать размер символа можно с помощью следующих формул:


$H = N_rY + 2Q$
$W = (17N_c + 69)X + 2Q$


где
$H$ — высота;
$W$ — ширина;
$N_r$ — количество строк;
$N_c$ — количество столбцов;
$Y$ — высота модуля (строки);
$X$ — ширина модуля;
$Q$ — размер чистой зоны (минимум $2X$).





16. Компактный (усечённый) PDF417


(Назад | Оглавление | Вперёд)


В случае использования PDF417 в "чистой" среде (символ не может быть случайно повреждён и чистые зоны вокруг символа достаточно велики), можно использовать усечённый режим PDF417 (Truncated PDF417, Рис. 9).


Он работает следующим образом:


  • Правые индикаторы упускаются (вся информация в любом случае дублируется в левых индикаторах, Раздел 06);
  • Стоп-паттерн сокращается до 1 модуля.

В результате ширина символа сокращается на 34 модуля и формула из Раздела 15 может быть переписана:


$W = (17N_c + 35)X + 2Q$




Рис. 9. Усечённый PDF417 (содержит ту же информацию, что и рассмотренный ранее код)


Стоит помнить, что у такого метода кодирования есть и недостатки:


  • Скорость распознавания символа падает, поскольку без правых индикаторов сложнее выровнять линию сканирования;
  • Вероятность возникновения ошибок декодирования из-за деградации кода возрастает.




17. Полезные ссылки


(Назад | Оглавление | Вперёд)


Описание PDF417



Упоминалось


  • ASCII (Wikipedia)
  • PC 437 (Wikipedia)
  • Стандарт ISO 8859-1 (платный доступ, ISO) — один из возможных 8-битных наборов символов для кодирования в виде PDF417. Описание (Wikipedia)

Кроме того






18. Послесловие


(Назад | Оглавление | Вперёд)


Итак, мы рассмотрели принципы кодирования и чтения информации в виде символов PDF417. Эти коды достаточно удобны для записи длинных сообщений в разных форматах (текстовый, числовой, байтовый) и их комбинациях, а также позволяют использовать коррекцию ошибок.


Возможно, вам будут также интересны другие статьи цикла Коды step by step:



Также, могу предложить прочитать что же делать, когда инструкции к коду нет, а прочесть его интересно (на примере PDF417).


Не забывайте, всегда лучше знать, как что-то работает. Вдруг, оно работает неправильно.


Спасибо за внимание!




P.S. Если вы нашли опечатки или ошибки в тексте, пожалуйста, сообщите мне. Это можно сделать выделив часть текста и нажав "Ctrl / ⌘ + Enter", если у вас есть Ctrl / ⌘, либо через личные сообщения. Если же оба варианта недоступны, напишите об ошибках в комментариях. Спасибо!

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 9

    +4

    Вот, человек с нуля всё написал.
    А ГНИВЦ уже 4 года не могут родить 64-битную версию модуля «Печать НД с PDF417»

      +2
      Вспомнился этот пост, а точнее, первый комментарий к нему :)
        +1
        А про DataMatrix напишете так же детально? На днях вот приходилось разбираться.
          0

          Сначала нужно будет самому разобраться (: Добавил в список возможных будущих публикаций

            +1
            Вот вам в помощь: habr.com/ru/post/241887
              0

              Если публикация с описанием уже есть на Хабре, стоит ли плодить сущности? Если, конечно, там нет каких-то принципиальных ошибок?

                +1
                Там частный случай кодирования, а не детальное описание формата, и, что более важно, раскодирования.
                  0

                  Тогда не вижу причин не написать свою публикацию (:

                    +1
                    Кстати, вот ещё полезная ссылка, которая мне помогла: ru.qwe.wiki/wiki/Data_Matrix. Можно опять возразить, что всё уже описано, но это же не статья на Хабре. И текст местами похож на гугл перевод.

        Only users with full accounts can post comments. Log in, please.