# PDF417

PDF417 es un formato de código de barras lineal apilado utilizado en una amplia variedad de aplicaciones, principalmente, de transporte, identificación y gestión de inventario. La sigla PDF del nombre significa Portable Data File (Archivo de datos portátil, en castellano) y el número 417 significa que cada patrón en el código consiste en 4 barras y espacios, y que cada patrón es de 17 unidades de largo. El código de barras PDF417 fue desarrollado y patentado por el inventor estadounidense Doctor Ynjiun P. Wang en la empresa Symbol Technologies en el año de 1991. Hoy en día, es una norma internacional bajo el código ISO/IEC 15438.

## Aplicaciones

Junto con Datamatrix, PDF417 es uno de los códigos de barras que se puede utilizar para imprimir el franqueo aceptado por el Servicio Postal de los Estados Unidos e igualmente es uno de los tres códigos admitidos en el estándar de Bar Coded Boarding Pass (Pase de a Bordo Codificado en Barras) de la industria aérea como el código de barras 2D para la emisión de tarjetas de embarque impresas. También fue seleccionado por el Departamento de Seguridad Nacional estadounidense como la tecnología de zona de lectura mecánica para las licencias de conductor compatibles con RealID y tarjetas de identificación emitidas por el estado. La empresa de transporte FedEx lo usa en las etiquetas de los paquetes que transporta. Fuera de Estados Unidos, es usado, entre otros organismos, por la Registraduría Nacional del Estado Civil de Colombia para la emisión de la Cédula de Ciudadanía, por la República Argentina era utilizado para la emisión del Documento Nacional de Identidad (antes de su emisión biométrica) y por el organismo de recaudación de impuestos del Estado Venezolano, SENIAT, junto con el código QR para la emisión del Registro Único de Información Fiscal.

## Características

Además de las características típicas de los códigos de barras bidimensionales, las capacidades de PDF417 incluyen:
* Enlace: Los símbolos PDF417 pueden vincularse a otros símbolos que se exploran en secuencia, permitiendo almacenar aún más datos.
* Dimensiones especificadas por el usuario: El usuario puede decidir la anchura de la barra vertical más estrecha, denominada dimensión X y la altura de las filas, llamada dimensión Y.
* Formato de dominio público: Cualquiera puede implementar sistemas que usen este formato sin licencia, tal como establece la introducción del estándar ISO/IEC 15438.

## Descripción del formato

El código de barras o símbolo PDF417 consta de 3 a 90 filas cada una de las cuales es un pequeño código de barras lineal. Cada fila contiene:
* Una zona tranquila. Esta es una cantidad mínima obligatoria de espacio en blanco antes de que comience el código de barras.
* Un Patrón de Inicio que identifica el formato como PDF417.
* Un Indicador de Fila Izquierda que contiene información sobre la fila (como el número de fila y el nivel de corrección de errores).
* 1 a 30 palabras de código que son grupos de barras y espacios que representan uno o más números, letras u otros símbolos.
* Una palabra de código de "fila derecha" con más información sobre la fila.
* Un patrón de parada.
* Otra zona tranquila.
Todas las filas son del mismo ancho y cada fila tiene idéntica cantidad de palabras de código.

### Palabras de código

PDF417 utiliza una codificación de base 929, es decir que cada palabra de código representa un número de 0 a 928. Las palabras de código están representadas por patrones de regiones oscuras (barra) y blancas (espacio). Cada uno de estos patrones contiene cuatro barras y cuatro espacios (de donde proviene el 4 del nombre). La anchura total es 17 veces la anchura de la barra vertical permitida más estrecha (la dimensión X) del código de barras. Cada patrón comienza con una barra y termina con un espacio. La altura de la fila (Y) debe ser de, al menos, de 3 veces el ancho mínimo (X).
Hay tres patrones de barra-espacio distintos usados para representar cada palabra de código. Estos patrones se organizan en tres grupos. Los grupos están etiquetados como 0, 3 y 6. No se utiliza patrón de espacio de barras en más de un grupo. Las filas del símbolo o código recorren el ciclo a través de los tres grupos, por lo que la fila 1 utiliza patrones del grupo 0, la fila 2 utiliza el grupo 3, la fila 3 utiliza el grupo 6 y la fila 4 utiliza de nuevo el grupo 0 y así sucesivamente.
El número de grupo puede ser determinado por la ecuación, escrita en módulo 9:
    $K=b_{1}-b_{2}+b_{3}-b_{4}+9\,\,{\pmod {9}}$
Donde:
* $K$: número del grupo.
* $b_{i}$: ancho de la i-ésima barra oscura en el símbolo (en unidades X).
Alternativamente se puede escribir:
    $K=E_{1}-E_{2}+E_{5}-E_{6}+9\,\,{\pmod {9}}$
Donde:
* $E_{i}$: distancia i-ésima entre bordes vecinos (sean izquierdos o derechos).
Un propósito de los tres grupos es determinar cual fila está en la palabra de código. Los grupos permiten que las porciones del símbolo sean leídas con una sola línea de exploración o barrido que puede ser sesgada desde la horizontal. Por ejemplo, el barrido podría comenzar al principio de la fila 6, pero terminar al final de la fila 10. Al principio de la exploración, el escáner ve el patrón de inicio constante y luego ve símbolos en el grupo 6. Cuando la exploración sesgada se extiende por las filas 6 y 7, entonces el escáner ve ruido. Cuando el barrido está en la fila 7, el escáner ve símbolos en el grupo 0. En consecuencia, el escáner conoce la dirección de la inclinación de la exploración. En el momento en que el escáner llega a la derecha del código, está en la fila 10, por lo que ve los patrones del grupo 0. El escáner también verá un patrón de parada constante.

### Codificación

De las 929 palabras de código disponibles, 900 se utilizan para datos y 29 para funciones especiales, tales como el cambio entre los modos principales. Los tres modos principales codifican diferentes tipos de datos de diferentes maneras, y se pueden mezclar según sea necesario dentro de un solo código de barras:
* Modo Byte: cada grupo de 5 palabras de código representa 6 bytes, debido a que 900$^5$>256$^6$. Los bytes adicionales están codificados de uno por palabra de código.
* Modo Numérico: n dígitos están codificados en (n/3+ 1) palabras de código, hasta un máximo de 44 dígitos en 15 palabras de código.
* Modo Texto: Cada palabra de código representa dos dígitos de base-30, que son usados por un sistema de cuatro submodos para representar los caracteres ASCII imprimibles (más retorno de carro, nueva línea y tabulador):
** Mayúsculas: A-Z, espacio, cambiar a minúsculas, cambiar a mixto e interpretar el siguiente dígito como puntuación.
** Minúsculas: a-z, espacio, interpretar el siguiente dígito como mayúsculas, cambiar a mixto, interpretar el siguiente dígito como puntuación
** Mixto: 0, &, retorno de carro, tabulador, coma,:, #, -, punto, $, /, +,%, *, =, ^, cambiar a puntuación, espacio, cambiar a minúsculas, cambiar a mayúsculas, interpretar el siguiente dígito como puntuación.
** Puntuación: ;, <, >, @, [, \, ], _, `, ~, !, retorno de carro, tabulador, coma, nueva línea, guion, punto, $, /, ", |, *, (, ),?, {,}, ', cambiar a mayúsculas.

### Corrección de errores

Cuando se crea un símbolo o código PDF417, se añaden de 2 a 512 palabras de código de detección y corrección de errores, usando la corrección de errores Reed-Solomon. Cuando se escanea el símbolo, el número máximo de correcciones que se pueden hacer es igual al número de palabras clave agregadas, pero la norma recomienda que se retengan dos palabras clave para garantizar la fiabilidad de la información corregida.

## Comparación con otros tipos de códigos

PDF417 es un código de barras apilado, a diferencia de otros que son matriciales, que se puede leer con un simple barrido lineal sobre el símbolo, el cual necesita las columnas izquierda y derecha del símbolo con las palabras de código de inicio y fin. Además, la exploración necesita saber qué fila está barriendo o explorando, por lo que cada fila del símbolo también debe codificar su número de fila. Además, la exploración de línea del lector no barrerá solamente una fila. Normalmente se iniciará el barrido de una fila, paro luego pasar a una línea vecina y, posiblemente, continuar cruzando sucesivas filas. Con el fin de minimizar el efecto de estos cruces, los módulos de los códigos PDF417 son altos y estrechos. La altura es típicamente tres veces la anchura. Además, cada palabra de código debe indicar a qué fila pertenece, de modo que se puedan detectar cruces, cuando se produzcan. Las palabras de código también están diseñadas para ser decodificadas en delta, por lo que algunas palabras de código son redundantes. Cada palabra de código de datos PDF417 representa alrededor de 10 bits de información (debido a que log$_2$ 900≈9.8), pero la palabra de código impresa (carácter) es de 17 módulos de ancho. Incluyendo una altura de 3 módulos, una palabra de código PDF417 toma 51 (17 x 3) módulos cuadrados para representar 10 bits. Esa área no cuenta otros gastos generales tales como el inicio, parada, fila, formato e información de nivel de código de corrección de error, conocido como ECC (Error Correction Code, en idioma inglés).
Otros códigos 2D, como DataMatrix y QR, se decodifican con sensores de imagen en lugar de exploraciones lineales no coordinadas. Esos códigos aun necesitan patrones de reconocimiento y alineación, pero no necesitan ser tan prominentes. Una palabra de código de 8 bits tomará 8 módulos cuadrados (ignorando el reconocimiento, la alineación, el formato y la información ECC). En la práctica, un símbolo PDF417 toma aproximadamente cuatro veces el área de un código Data Matrix o un código QR.