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
Lo que no dibuja es la familia bidimensional. Aquí no hay QR, Data Matrix o PDF417. Esos codifican bytes en una cuadrícula con sus propias matemáticas de corrección de errores, y si un requisito nombra a uno de ellos, esta es la herramienta incorrecta y debe saberlo antes de construir en torno a ella en lugar de después. Para los códigos unidimensionales, la pregunta práctica es más estricta: qué simbología acepta los datos que usted realmente tiene, porque las codificaciones no son intercambiables
Las restricciones de datos son reales y causan problemas en el momento de la generación. Las variantes de Code 2 of 5 y MSI solo aceptan 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, debe usar Code 39 Extended o un subconjunto de Code 128. Code 128C agrupa dos dígitos en cada símbolo para mayor densidad, por lo que requiere una cadena numérica de longitud par y nada más. EAN-13 espera doce dígitos y calcula el decimotercero como comprobación (check digit); EAN-8 espera siete y calcula el octavo; UPC-A requiere doce. Entréguele a una simbología datos que no puede representar y no obtendrá una excepción útil, obtendrá un código de barras que codifica basura, lo cual es peor, porque se ve bien hasta que alguien lo 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 (module width in points), angle,
// data, UseCheckSum, bar color, background color.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symbology
72, 680, // X, Y in points from the bottom-left
60, // bar height
1, // MUnit: 1pt narrowest bar
0, // no rotation
'123456789012', // 12 digits; the 13th is the check
True, // append the modulo-10 check digit
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 en HotPDF, X e Y se miden desde la esquina inferior izquierda de la página en puntos, con Y creciendo hacia arriba, 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 y nada más. No reserva la zona de silencio por usted, lo que significa que la responsabilidad es suya y es fácil de olvidar. El modo de falla es sutil: coloca un código de barras a ras con el borde de una celda de tabla, o deja que el diseño de la página amontone un logotipo junto a él, 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 explícitamente. Antes de llamar a DrawBarcode, deje al menos diez anchos de módulo de espacio libre en ambos lados, y trate cualquier gráfico, regla o texto que se inmiscuya en esa banda como un defecto, no como una opció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