Un código de barras no es una imagen con la que decora un documento. Es una medida, y el escáner es el instrumento que lo lee. Ese replanteamiento decide casi todo sobre cómo debe dibujar uno en un PDF. Las barras no contienen información por su grado de color negro; la información reside en la proporción del ancho de las barras con respecto al ancho de los espacios, y un lector la recupera midiendo el tiempo de las transiciones a medida que un láser o sensor realiza el barrido. Comprima esa geometría, póngala borrosa o amontone sus márgenes, y producirá algo que se ve exactamente como un código de barras y se escanea como una mancha. HotPDF le brinda dos formas de colocar uno en una página, y la diferencia entre ellas es precisamente la diferencia entre controlar esa geometría y rendirse a ella

Lo que HotPDF puede codificar
HotPDF dibuja simbologías lineales (unidimensionales), y el conjunto es más amplio de lo que necesitan la mayoría de los proyectos. La enumeración THPDFBarcodeType cubre la familia Code 2 of 5 en sus formas intercaladas, industriales y de matriz; Code 39 y su variante extendida; los tres subconjuntos Code 128 A, B y C; Code 93 simple y extendido; MSI; PostNet; Codabar; el grupo minorista UPC y EAN, a saber, EAN-8, EAN-13, UPC-A, los comprimidos UPC-E0 y UPC-E1, y los complementos adicionales de 2 y 5 dígitos de UPC; y los subconjuntos GS1-128 (EAN-128). Eso es suficiente para cubrir etiquetas de cadenas de suministro, puntos de venta minoristas y los códigos industriales más antiguos que aún se usan en almacenes
La familia es lineal por diseño. Las simbologías bidimensionales como QR, Data Matrix y PDF417 codifican bytes en una cuadrícula con su propia matemática de corrección de errores y quedan fuera de esta API, así que decida qué familia nombra el requisito antes de construir sobre esta base. Para los códigos unidimensionales la pregunta práctica es más reducida: qué simbología acepta los datos que usted realmente tiene, porque las codificaciones no son intercambiables
Las restricciones de datos son reales y se cobran su precio al momento de generar. Las variantes de Code 2 of 5 y MSI aceptan solo dígitos. Code 39 transporta letras mayúsculas, dígitos y un puñado de signos de puntuación; si necesita minúsculas o el rango ASCII completo, se trata de Code 39 Extended o de un subconjunto de Code 128. Code 128C empaqueta dos dígitos en cada símbolo para ganar densidad, de modo que quiere una cadena numérica de longitud par y nada más. EAN-13 espera doce dígitos y calcula el decimotercero como verificación; EAN-8 espera siete y calcula el octavo; UPC-A toma doce. Valide los datos contra estas reglas antes de llamar a DrawBarcode, porque las barras construidas a partir de datos que una simbología no puede representar se ven bien en pantalla y solo fallan cuando alguien las escanea en una caja registradora
Dos rutas de dibujo, dos niveles de control
El método al que debe recurrir en producción es DrawBarcode, en el objeto de la página. Toma la simbología, una posición, una altura y un parámetro que importa más que el resto: MUnit, el ancho del módulo. El módulo es el ancho de la barra más estrecha, el átomo del cual cualquier otra medida en el código es múltiplo, y se expresa aquí en puntos. Todo lo relacionado con si el resultado impreso se escanea se remonta a ese único número entero
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (ancho de módulo en puntos), ángulo,
// data, UseCheckSum, bar color, background color.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symbology
72, 72, // X, Y de la esquina superior izquierda, en puntos
60, // bar height
1, // MUnit: 1pt narrowest bar
0, // no rotation
'123456789012', // 12 digits; the 13th is the check
True, // agrega el dígito verificador módulo 10
clBlack, clWhite); // bars black, background white
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Dos argumentos merecen una mirada más cercana. UseCheckSum agrega el dígito de control de módulo 10 que espera la simbología, y para los códigos minoristas casi siempre lo deseará en True; apáguelo solo cuando sus datos ya contengan una verificación precalculada, o de lo contrario obtendrá un dígito duplicado. Los colores de la barra y del fondo son los dos últimos parámetros, y la tentación de ser creativo allí es una trampa que se analiza a continuación. Tenga en cuenta también el origen de las coordenadas: al igual que todas las demás llamadas de dibujo de página en HotPDF, X e Y se miden desde la esquina superior izquierda de la página en puntos, con Y creciendo hacia abajo, y ubican la esquina superior izquierda de las barras, la misma convención que muestra el ejemplo Hello World
La segunda ruta es DirectDrawBarcode, que toma los datos y un cuadro delimitador (bounding box), X, Y, Width, Height, y escala el patrón de barras para que llene ese ancho. Es conveniente para diseñar códigos en una cuadrícula porque usted nombra el espacio y el método ajusta las barras en él. Esa comodidad también es su peligro. Cuando le da un ancho, ya no está estableciendo el tamaño del módulo; el método divide el espacio que usted permita entre la cantidad de barras que necesiten los datos, y la barra más estrecha se convierte en el resultado de esa división. Solicite una cadena Code 128 densa dentro de un cuadro demasiado estrecho y los módulos se encogerán por debajo de lo que cualquier escáner puede resolver, silenciosamente. Para todo aquello que se deba escanear de manera confiable, prefiera DrawBarcode y establezca MUnit deliberadamente. Reserve DirectDrawBarcode para vistas previas y para disposiciones en las que haya medido que las barras resultantes sigan siendo legibles
El ancho del módulo es una decisión de resolución
Esta es la aritmética que determina si su etiqueta funciona. Un escáner láser y una cámara tienen una característica más pequeña que pueden distinguir, y la barra estrecha debe quedar cómodamente por encima de ella después de la impresión. El límite mínimo (floor) ampliamente citado para códigos lineales de propósito general es una barra estrecha de 13 milésimas de pulgada, aproximadamente 0,33 mm, y muchas guías minoristas e industriales lo tratan como un mínimo en lugar de como un objetivo. Traslade eso a unidades de PDF: un punto es 1/72 de pulgada, aproximadamente 0,353 mm, por lo que un solo punto de ancho de módulo se encuentra justo en ese límite. Es por eso que MUnit := 1 es el valor más pequeño en el que debe confiar para un código destinado a un escáner real, y por qué duplicarlo a 2 compra un margen que no cuesta casi nada en una etiqueta con espacio de sobra
Ahora conecte eso a la resolución de salida, porque el módulo también debe sobrevivir a la impresora. En una impresora láser de 300 ppp (DPI), un punto de dispositivo (dot) es 1/300 de pulgada, por lo que un módulo de un punto tiene aproximadamente cuatro puntos de dispositivo de ancho. Cuatro puntos apenas alcanzan para renderizar un borde nítido; la dispersión del tóner y el ligero error de registro se comen ese borde, y la barra que medía un punto en su PDF se imprime más gruesa o más delgada de lo que permite la especificación. Aumente el módulo a 2 puntos y tendrá ocho puntos de dispositivo para trabajar, lo que absorbe ese ruido. La regla que vale la pena internalizar: el ancho del módulo que establezca en puntos debe mapearse a un número cómodo y entero de puntos de dispositivo en su resolución de impresión real, no a la resolución que desearía tener. Un código que se escanea sin problemas en la pantalla y falla en la impresora del almacén, casi siempre falló en esta comprobación
La zona de silencio es parte del símbolo
La razón más común por la que un código de barras correctamente codificado no se escaneará es la zona de silencio (quiet zone), el margen en blanco a cada lado de las barras. Los escáneres usan ese espacio vacío para encontrar dónde comienza y termina el código; sin ella, el lector no puede distinguir la primera barra de lo que sea que se encuentre al lado en la página. Los estándares son específicos. La mayoría de las simbologías lineales quieren una zona de silencio de al menos diez veces el ancho del módulo en cada lado, y los códigos minoristas UPC y EAN requieren nueve módulos a la izquierda y siete a la derecha. Con un módulo de un punto, eso son aproximadamente diez puntos, aproximadamente la séptima parte de una pulgada, de espacio en blanco garantizado flanqueando las barras
HotPDF dibuja las barras exactamente donde usted las coloca, y la zona de silencio que las rodea es parte de la disposición de su página, lo que hace que sea fácil olvidarla. El modo de falla es sutil: coloca un código de barras pegado al borde de una celda de tabla, o deja que la disposición amontone un logo a su lado, y el código que pasó todas las pruebas en una página en blanco deja de escanearse en el momento en que se envía dentro de un documento real. Presupueste el margen de forma explícita. Antes de llamar a DrawBarcode, deje al menos diez anchos de módulo de espacio despejado a ambos lados, y trate cualquier gráfico, línea o texto que invada esa banda como un defecto, no como una elección estética
Color, contraste y la línea legible por humanos
Los colores de las barras y del fondo existen para que pueda coincidir con la paleta de una marca, y son la forma más rápida de dañar un código que funciona. Los escáneres leen el contraste, clásicamente con luz roja, y esperan barras oscuras sobre un campo claro. Negro sobre blanco es la única combinación que debe utilizar sin tener que realizar pruebas. Azul oscuro o verde oscuro sobre blanco puede aprobarse; cualquier cosa con bajo contraste de luminancia, y en particular las barras rojas, que un escáner de luz roja ve como fondo, no lo hará. Si un diseñador solicita códigos de barras en color, la respuesta sincera es que las barras permanecen negras y el color va en otra parte de la etiqueta
La ruta DrawBarcode también puede renderizar el texto legible por humanos debajo de las barras, los dígitos que un empleado ingresa cuando falla un escaneo. Ese texto es una medida de seguridad (fallback), no una decoración, así que cuando coloque su propia leyenda (caption), manténgala lejos de la zona de silencio; una etiqueta de la simbología apretujada en el margen lateral destruye el mismo espacio en blanco del que depende el escáner. Los campos en el ejemplo aquí, incluido TextOut para cualquier leyenda circundante, son las mismas llamadas de dibujo que se tratan en la guía de salida de reportes, que es a donde se debe acudir cuando el código de barras es un elemento en una página compuesta de mayor tamaño
Un breve hábito de verificación
Las barras vectoriales son una ventaja que vale la pena mencionar. Debido a que DrawBarcode escribe el código como operadores de dibujo en PDF en lugar de una imagen rasterizada, las barras se mantienen nítidas con cualquier zoom y el archivo no conlleva ninguna resolución propia; la única resolución que importa es la de la impresora. Eso no le excusa de realizar pruebas, solo significa que la prueba debe realizarse en papel. Genere una muestra, imprímala en el dispositivo de resolución más baja que realmente encontrarán sus códigos, y escanéela con la misma clase de lector que tienen sus usuarios, no con el generador de imágenes de gama alta de su escritorio. Verifique las zonas de silencio con una regla en la impresión, confirme que el ancho del módulo sobrevivió al viaje de puntos (points) a puntos de dispositivo (dots), y verifique que el valor decodificado coincida con lo que usted codificó, incluido el dígito de comprobación. Dedicar cinco minutos con un escáner real detecta todas las fallas descritas anteriormente, y las detecta antes de que lo haga un palé de existencias mal etiquetadas
Los métodos DrawBarcode y DirectDrawBarcode que se muestran aquí forman parte del Componente HotPDF para Delphi y C++Builder