Che cos'è il codice 39 Barcode? usare, Struttura & Guida Generazione

Che cos'è il codice 39 Barcode? usare, Struttura & Guida Generazione

I codici bar 39 rimangono uno dei simboli di codice bar lineare più ampiamente utilizzati in varie industrie oggi.Questa guida completa copre tutto quello che devi sapere su Codice 39, dalla loro struttura e codifica alla pratica di implementazione e risoluzione dei problemi.

Che cos’è il codice 39?

Il codice 39, noto anche come Codice 3 di 9 o USD-3, è una simbologia alfanumerica di lunghezza variabile che può codificare le lettere superiori (A-Z), i numeri (0-9), e diversi caratteri speciali, tra cui spazio, ifeno (-), periodo (.), segno del dollaro ($), slash avanti (/), plus signo (+) e percentuale (%).

A differenza di alcuni altri formati di codice bar, il Codice 39 è auto-checking e non richiede un numero di controllo obbligatorio, rendendolo relativamente semplice da implementare e decodificare. Ogni carattere nel Code 39 viene rappresentato da nove elementi: cinque barre e quattro spazi, con tre di questi elementi sono brevi e sei stretti.

Storia e sfondo

Il codice 39 è stato sviluppato nel 1974 da David Allais e Ray Stevens presso l’Intermec Corporation. È stato progettato per essere un sistema di codici a barre robusto e facile da applicare che può gestire sia i dati numerici che alfabetici. La simbologia è stata rapidamente adottata a causa della sua semplicità e affidabilità, diventando uno standard industriale all’inizio degli anni ‘80.

Il formato è stato standardizzato come ANSI MH10.8M-1983 e successivamente come ISO/IEC 16388.La sua ampia adozione è stata ulteriormente accelerata quando il Dipartimento della Difesa degli Stati Uniti l’ha adottata come formato standard di codice bar negli anni ‘80, portando al suo uso nella logistica militare e nella gestione della catena di approvvigionamento.

Codice 39 vs. codice 128

Mentre sia Code 39 che Code 128 sono popolari formati di codice bar lineare, hanno caratteristiche distinte che li rendono adatti per diverse applicazioni:

Codice 39 Vantaggi:

  • Schema di codifica più semplice
  • Autocontrollo senza numeri di controllo obbligatori
  • Facile da applicare e scaricare
  • Più tollerante per errori con imperfezioni di stampa
  • Supporta i caratteri alfanumerici in modo nativo

Codice 128 Vantaggi:

  • maggiore densità dei dati (più compatto)
  • Supporta il set di caratteri ASCII completo
  • Migliore compressione dei dati
  • Controllo obbligatorio per una maggiore precisione
  • Più efficiente per i dati numerici

Quando scegliere il codice 39:

  • Compatibilità del sistema di eredità richiesto
  • Codifica dei dati alphanumerici
  • Ambiente con potenziali problemi di qualità della stampa
  • Applicazioni che richiedono una semplice verifica manuale

Quando scegliere il codice 128:

  • Restrizioni spaziali (need compact barcodes)
  • Applicazioni di scansione ad alto volume
  • Necessità di codificare caratteri speciali o lettere inferiori
  • L’integrità dei dati è fondamentale

L’uso comune del codice 39

La versatilità e la affidabilità del codice 39 lo hanno reso una scelta standard in numerose industrie e applicazioni.

Inventory e Asset Tracking

Il codice 39 è ampiamente utilizzato nei sistemi di gestione dell’inventario a causa della sua capacità di codificare sia i numeri che le lettere, rendendolo ideale per numerazioni parziali, SKU e etichette di attività.

  • Tracking Work-in-process: Seguire i prodotti attraverso le linee di assemblaggio
  • Identificazione del materiale crudo: etichettatura dei componenti e degli approvvigionamenti in arrivo
  • Inventario di prodotti finiti: gestione dei livelli di magazzino
  • Equipment asset tags: strumenti di tracciamento, macchinari e attrezzature per ufficio
  • Identificazione della posizione: segnalazione delle banconote di magazzino, dei pavimenti e delle aree di stoccaggio

Gli ambienti al dettaglio beneficiano della leggibilità e della tolleranza degli errori del Codice 39, specialmente in situazioni in cui le etichette di codice bar potrebbero sperimentare perdite o danni parziali.

Servizio sanitario e carte d’identità

L’industria sanitaria ha adottato il codice 39 per vari scopi di identificazione e tracciamento:

  • Identificazione del paziente: Wristbands e registri medici
  • Tracking dei farmaci: inventario farmaceutico e gestione delle prescrizioni
  • I campioni di laboratorio: identificazione del campione e catena di custodia
  • Equipaggiamenti medici: tracciamento di dispositivi e strumenti portatili
  • Identificazione del personale: segni dei dipendenti e carte di accesso

La capacità di codificare i dati alfanumerici del codice 39 lo rende particolarmente utile per i numeri di identificazione del paziente, i codici dei dipendenti e il numero di lotti farmaceutici che combinano lettere e cifre.

Codice 39 Struttura e codifica

Comprendere la struttura del Codice 39 è essenziale per la corretta attuazione e risoluzione dei problemi. Il codice a barre è costituito da caratteri di avvio e di sospensione, personaggi di dati e numeri di controllo opzionali.

Struttura di base

Ogni codice bar 39 segue questo modello:

  • Carattere di partenza (asterico “”)
  • I caratteri dei dati (le informazioni effettive codificate)
  • Carattere di controllo opzionale (modulo 43 calcolo)
  • Il carattere di stop (asterico “*”)

Ogni carattere è rappresentato da un modello unico di nove elementi (bar e spazi), dove tre elementi sono brevi e sei sono stretti. Il rapporto tra elementi ampi e sottili varia tipicamente da 2:1 a 3:1, con 3:1 essere il più comune per la lettura ottimale.

Personaggi supportati

Il codice 39 supporta un totale di 44 caratteri nella sua implementazione standard:

Digiti: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9Lettere di riferimento: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, ZCaratteri speciali: Spazio, -, ., $, /, +, %Personaggi di controllo: * (start/stop)

Il codice esteso 39 può codificare il carattere ASCII completo impostato utilizzando combinazioni di personaggi standard, ma questo richiede logica specializzata di codifica e decodifica.

Modello di codifica dei personaggi

Ogni carattere ha un modello unico di nove elementi. ad esempio:

  • 0: NNNWWNWNN (N = stretto, W = ampio)
  • A: WNNWNNNW
  • 1: WNNNWNNW
  • *****: NWNNNWN (Start / Stop)

Il modello si alternano tra barre (nero) e spazi (bianco), a partire da una barra.

Modulo 43 Controlla il carattere

Mentre il codice 39 non richiede un numero di controllo, implementare uno migliora significativamente l’integrità dei dati.

  • Assegnare ogni carattere un valore numerico (0-42)
  • Raccogliere tutti i valori di carattere nei dati
  • Calcolare il rimanente quando diviso per 43
  • Convertire il rimanente in codice corrispondente 39 caratteri

Questo carattere di verifica opzionale è posizionato tra i dati e il personaggio di stop, fornendo un ulteriore strato di rilevamento di errori durante la scansione.

Come generare il codice 39

La generazione di codici a barre 39 può essere realizzata attraverso vari metodi, da strumenti online all’implementazione programmatica.

Generatori online

Diverse piattaforme online offrono gratuitamente Codice 39 generazione di codice bar:

  • Vantaggi: nessuna installazione di software richiesto, veloce per la generazione un-off
  • Limitations: Non adatto per la lavorazione di batch, opzioni di personalizzazione limitate
  • I casi di utilizzo: prototyping, progetti di piccole dimensioni, scopi educativi

Quando si utilizzano i generatori online, assicurarsi che supportino le specifiche corrette di Codice 39, compresi i caratteri di avvio/stop corretti e il calcolo opzionale dei numeri di controllo.

Implementazione in .NET con Aspose.BarCode

Per le applicazioni professionali che richiedono la generazione di codice a barre programmatica, Aspose.BarCode per .NET fornisce un supporto completo di Codice 39 con ampie opzioni di personalizzazione.

Codice di base 39 Generazione

using Aspose.BarCode;
using Aspose.BarCode.Generation;

// Create a BarcodeGenerator instance for Code 39
BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Code39Standard, "HELLO123");

// Set barcode image properties
generator.Parameters.Barcode.XDimension.Millimeters = 0.5f;
generator.Parameters.Barcode.BarHeight.Millimeters = 15;

// Generate and save the barcode
generator.Save("code39_basic.png", BarCodeImageFormat.Png);

Codice avanzato 39 Configurazione

using Aspose.BarCode;
using Aspose.BarCode.Generation;

// Create generator with specific encoding
BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Code39Standard, "PRODUCT-001");

// Configure Code 39 specific parameters
generator.Parameters.Barcode.Code39.ChecksumMode = Code39ChecksumMode.Mod43;
generator.Parameters.Barcode.Code39.IsCheckSumEnabled = true;

// Set dimensions and appearance
generator.Parameters.Barcode.XDimension.Millimeters = 0.4f;
generator.Parameters.Barcode.BarHeight.Millimeters = 12;
generator.Parameters.Resolution = 300; // DPI for high-quality printing

// Configure text display
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.Size.Point = 10;

// Set margins for better integration
generator.Parameters.CaptionAbove.Text = "Product Code";
generator.Parameters.CaptionAbove.Visible = true;

// Generate high-resolution barcode
generator.Save("code39_advanced.png", BarCodeImageFormat.Png);

Batch Generation con il trattamento degli errori

using Aspose.BarCode;
using Aspose.BarCode.Generation;
using System;
using System.Collections.Generic;

public class Code39BatchGenerator
{
    public void GenerateBarcodes(List<string> productCodes, string outputPath)
    {
        foreach (string code in productCodes)
        {
            try
            {
                // Validate input data
                if (string.IsNullOrEmpty(code) || !IsValidCode39Data(code))
                {
                    Console.WriteLine($"Skipping invalid code: {code}");
                    continue;
                }

                // Create generator
                BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Code39Standard, code);
                
                // Configure for production use
                generator.Parameters.Barcode.Code39.IsCheckSumEnabled = true;
                generator.Parameters.Barcode.XDimension.Millimeters = 0.33f;
                generator.Parameters.Barcode.BarHeight.Millimeters = 10;
                generator.Parameters.Resolution = 300;

                // Save with descriptive filename
                string filename = $"{outputPath}/barcode_{code.Replace(" ", "_")}.png";
                generator.Save(filename, BarCodeImageFormat.Png);
                
                Console.WriteLine($"Generated barcode for: {code}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error generating barcode for {code}: {ex.Message}");
            }
        }
    }

    private bool IsValidCode39Data(string data)
    {
        // Check for valid Code 39 characters
        string validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";
        return data.ToUpper().All(c => validChars.Contains(c));
    }
}

Codice 39 Implementazione

using Aspose.BarCode;
using Aspose.BarCode.Generation;

// Generate Extended Code 39 for full ASCII support
BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Code39Extended, "Hello World!");

// Extended Code 39 automatically handles lowercase and special characters
generator.Parameters.Barcode.XDimension.Millimeters = 0.5f;
generator.Parameters.Barcode.BarHeight.Millimeters = 15;

generator.Save("code39_extended.png", BarCodeImageFormat.Png);

Come scansionare il codice 39

Scansione Codice 39 codici a barre richiedono adeguate soluzioni hardware e software che possono decodificare accuratamente la simbologia.

Scanner compatibili

Codice 39 è supportato da quasi tutti gli scanner di codice bar commerciale a causa della sua diffusa adozione:

Scanner laser a mano:

  • Il più affidabile per i codici a barre danneggiati o di bassa qualità
  • Lavorare bene in diverse condizioni di illuminazione
  • Adatto per gli ambienti di magazzino e retail

Scanner CCD e LED:

  • Efficiente costo per la scansione a stretto raggio
  • Bene per le applicazioni POS
  • Richiede la vicinanza alla superficie di barcode

Immagini in 2D:

  • Può leggere sia i barcodi 1D che 2D
  • Migliori prestazioni con barcodi danneggiati
  • Supporto per la cattura e il trattamento dell’immagine

Configurazione Scanner

La maggior parte dei moderni scanner automaticamente rileva i codici a barre 39 ma la configurazione manuale può essere necessaria per:

  • Controllare la verifica digitale
  • Codice esteso 39 supporto
  • Lunghezza minima/maximale del codice bar
  • Inizio/Stop trasmissione di carattere

Soluzioni mobile e desktop

Scansione mobile con Aspose.BarCode

using Aspose.BarCode.BarCodeRecognition;
using System;

public class Code39Scanner
{
    public string ScanCode39Barcode(string imagePath)
    {
        try
        {
            // Create BarCodeReader for Code 39
            using (BarCodeReader reader = new BarCodeReader(imagePath, DecodeType.Code39Standard))
            {
                // Configure recognition settings
                reader.QualitySettings = QualitySettings.HighPerformance;
                
                // Scan for barcodes
                foreach (BarCodeResult result in reader.ReadBarCodes())
                {
                    Console.WriteLine($"Code 39 Detected: {result.CodeText}");
                    Console.WriteLine($"Code Type: {result.CodeType}");
                    return result.CodeText;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error scanning barcode: {ex.Message}");
        }
        
        return null;
    }
}

Riconoscimento avanzato con molti formati

using Aspose.BarCode.BarCodeRecognition;
using System;
using System.Drawing;

public class MultiFormatScanner
{
    public void ScanMultipleCode39Types(string imagePath)
    {
        // Support both standard and extended Code 39
        DecodeType[] code39Types = { DecodeType.Code39Standard, DecodeType.Code39Extended };
        
        using (BarCodeReader reader = new BarCodeReader(imagePath, code39Types))
        {
            // Configure for better accuracy
            reader.QualitySettings.AllowMedianSmoothing = true;
            reader.QualitySettings.MedianSmoothingWindowSize = 5;
            
            foreach (BarCodeResult result in reader.ReadBarCodes())
            {
                Console.WriteLine($"Barcode Text: {result.CodeText}");
                Console.WriteLine($"Format: {result.CodeType}");
                Console.WriteLine($"Region: {result.Region}");
                
                // Verify check digit if present
                if (result.Extended.Code39 != null)
                {
                    Console.WriteLine($"Check Sum: {result.Extended.Code39.CheckSum}");
                }
            }
        }
    }
}

Risoluzione dei problemi e migliori pratiche

La successiva attuazione del codice 39 richiede attenzione alla qualità della stampa, alle condizioni di scansione e alla validazione dei dati.

La qualità e la dimensione della stampa

Requisiti di dimensioni minime:

  • Dimensione X (spessore di bar stretto): 0.191mm minimo, 0.33mm raccomandato
  • Altezza del bar: minimo 5 mm o 15% della lunghezza del codice bar, qualunque sia maggiore
  • Zone silenziose: 10X minimo su entrambi i lati (X = larghezza di bar stretta)

Fattori di qualità della stampa:

  • Utilizzare stampanti ad alta risoluzione (300 DPI minimo per la produzione)
  • Mantenere una definizione coerente di bar edge
  • Assicurare un contrasto adeguato tra bar e sfondo
  • Evitare materiali riflettivi o brillanti che possono interferire con la scansione

Lista di controllo della qualità:

using Aspose.BarCode.Generation;

public class BarcodeQualityChecker
{
    public bool ValidateBarcodeQuality(BarcodeGenerator generator)
    {
        // Check X-dimension
        if (generator.Parameters.Barcode.XDimension.Millimeters < 0.191f)
        {
            Console.WriteLine("Warning: X-dimension below minimum specification");
            return false;
        }

        // Verify bar height
        float minHeight = Math.Max(5.0f, generator.Parameters.Barcode.XDimension.Millimeters * 15);
        if (generator.Parameters.Barcode.BarHeight.Millimeters < minHeight)
        {
            Console.WriteLine("Warning: Bar height insufficient");
            return false;
        }

        // Check resolution for print quality
        if (generator.Parameters.Resolution < 300)
        {
            Console.WriteLine("Warning: Resolution may be insufficient for professional printing");
        }

        return true;
    }
}

Minimizzare gli errori

Validazione dei dati:

  • Verificare la compatibilità dei personaggi prima di codificare
  • Implementazione del calcolo dei numeri di controllo per applicazioni critiche
  • Validare la lunghezza e il formato del contenuto di barcode

• Consideri ambientali:

  • Assicurare un’illuminazione adeguata per la scansione
  • Proteggere i barcodi da danni fisici
  • Utilizzare i materiali di etichetta adeguati per l’ambiente di applicazione

Ottimizzazione dello scanner:

  • Calibrazione e manutenzione dei scanner regolari
  • Formazione corretta sulle tecniche di scansione
  • Implementazione di errori di gestione e logica di ritorno

Prevenzione degli errori comuni:

public class Code39ErrorPrevention
{
    public bool ValidateAndEncode(string data)
    {
        // Remove invalid characters
        string cleanData = CleanCode39Data(data);
        
        // Check length limits
        if (cleanData.Length > 50) // Practical limit for most applications
        {
            Console.WriteLine("Warning: Data length may cause scanning issues");
        }

        // Generate with error checking
        try
        {
            BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Code39Standard, cleanData);
            generator.Parameters.Barcode.Code39.IsCheckSumEnabled = true;
            
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Encoding error: {ex.Message}");
            return false;
        }
    }

    private string CleanCode39Data(string input)
    {
        // Convert to uppercase and remove invalid characters
        string validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";
        return new string(input.ToUpper().Where(c => validChars.Contains(c)).ToArray());
    }
}

Ottimizzazione delle Prestazioni

Per la generazione di codici a barre ad alto volume e le applicazioni di scansione, l’ottimizzazione delle prestazioni diventa fondamentale.

Generazione di ottimizzazione

using Aspose.BarCode.Generation;
using System.Collections.Generic;
using System.Threading.Tasks;

public class OptimizedBarcodeGeneration
{
    public async Task GenerateBarcodesParallel(IEnumerable<string> codes, string outputPath)
    {
        var tasks = codes.Select(async code =>
        {
            await Task.Run(() =>
            {
                var generator = new BarcodeGenerator(EncodeTypes.Code39Standard, code);
                generator.Parameters.Barcode.XDimension.Millimeters = 0.33f;
                generator.Parameters.Barcode.BarHeight.Millimeters = 10;
                generator.Save($"{outputPath}/{code}.png", BarCodeImageFormat.Png);
            });
        });

        await Task.WhenAll(tasks);
    }
}

Ottimizzazione di riconoscimento

using Aspose.BarCode.BarCodeRecognition;

public class OptimizedScanning
{
    public string FastScanCode39(string imagePath)
    {
        using (var reader = new BarCodeReader(imagePath, DecodeType.Code39Standard))
        {
            // Optimize for speed over accuracy if appropriate
            reader.QualitySettings = QualitySettings.HighPerformance;
            reader.QualitySettings.AllowOneDFastBarcodesDetector = true;
            
            // Read first barcode only for better performance
            if (reader.ReadBarCodes().Any())
            {
                return reader.ReadBarCodes().First().CodeText;
            }
        }
        return null;
    }
}

Considerazioni di integrazione

Quando si integrano i codici a barre di codice 39 in sistemi esistenti, considerare questi aspetti architettonici:

Design di database

public class BarcodeIntegration
{
    // Store both original data and generated barcode metadata
    public class BarcodeRecord
    {
        public string OriginalData { get; set; }
        public string BarcodeText { get; set; }  // May include check digit
        public DateTime GeneratedDate { get; set; }
        public string ChecksumUsed { get; set; }
        public byte[] BarcodeImage { get; set; }
    }

    public void StoreBarcodeWithMetadata(string data)
    {
        var generator = new BarcodeGenerator(EncodeTypes.Code39Standard, data);
        generator.Parameters.Barcode.Code39.IsCheckSumEnabled = true;
        
        var record = new BarcodeRecord
        {
            OriginalData = data,
            BarcodeText = generator.CodeText, // Includes check digit
            GeneratedDate = DateTime.Now,
            ChecksumUsed = "Mod43"
        };
        
        // Store in database
        SaveBarcodeRecord(record);
    }
}

FAQ per il codice 39

**Q: Quale è la lunghezza massima per il codice a barre 39?**A: Mentre il codice 39 non ha un limite di lunghezza teorica, considerazioni pratiche limitano la maggior parte delle implementazioni a 20-50 caratteri.

**Q: Il codice 39 può codificare le lettere della casella inferiore?**A: Il codice standard 39 supporta solo le lettere superiori.Il Codice esteso 39 può codificare lettere inferiori e personaggi ASCII aggiuntivi utilizzando combinazioni di caratteri.

**Q: è richiesto un numero di controllo per il codice 39?**A: No, il codice 39 è autochecking e non richiede un numero di controllo. tuttavia, aggiungere un modulo 43 carattere di verifica migliora significativamente l’integrità dei dati e è raccomandato per le applicazioni critiche.

**Q: Perché alcuni codici a barre di codice 39 includono asterici (*) nel testo che può essere letto dall’uomo?**A: Gli asterici sono i caratteri start/stop richiesti dalla specifica Codice 39. Alcune implementazioni li includono nel testo visualizzato, mentre altri li sopprimono per la lettura.

**Q: È possibile stampare codice a bar 39 su sfondo colorato?**A: Il codice 39 richiede un elevato contrasto tra bar e sfondo.Mentre i background colorati sono possibili, devono fornire abbastanza contrast per una scansione affidabile.

**Q: Come risolvo i problemi di scansione con il codice a barre 39?**A: Le soluzioni comuni includono il controllo della risoluzione della stampa, la verifica delle zone silenziose adeguate, l’assicurazione delle dimensioni di codice bar corrette, il pulimento della lente dello scanner e la validazione che lo scaner sia configurato per leggere il Codice 39.

**Q: Qual è la differenza tra il codice 39 e il Codice 93?**A: Il codice 93 è un’evoluzione ad alta densità del Codice 39 che può codificare lo stesso carattere impostato in meno spazio.

**Q: I codici a barre 39 possono essere letti dalle telecamere smartphone?**A: Sì, molte applicazioni di scansione di codice bar mobile supportano Codice 39. tuttavia, lo scansionamento basato sulla fotocamera può essere meno affidabile rispetto agli scanner dedicati, specialmente con piccoli o a basso livello di codici bar.

**Q: Come faccio a calcolare la dimensione fisica necessaria per un codice bar 39?**A: Calcolare: (Numero di caratteri × 12 + 25) × X-dimensione + 2 zone silenziose. ad esempio, un codice a barre di 10 personaggi con 0.33mm X dimensione ha bisogno di una larghezza di circa 53mm e più zone tranquille.

**Q: Il codice 39 è adatto per il monitoraggio degli inventari in ambienti difficili?**A: La tolleranza degli errori del codice 39 lo rende adatto per molti ambienti industriali. Tuttavia, considerare i materiali di etichettatura protettiva e i regolari orari di sostituzione dei codici a barre in condizioni estremamente difficili.

conclusione

Il codice 39 rimane una simbologia di barcode versatile e affidabile per le applicazioni che richiedono codifica alfanumerica con solida tolleranza degli errori. La sua semplicità, ampio supporto per lo scanner e il track record dimostrato lo rendono un’ottima scelta per la gestione degli inventari, il tracciamento degli attivi e i sistemi di identificazione.

Al momento dell’implementazione di codice bar 39 si concentra sulla qualità della stampa, la corretta dimensione e l’utilizzo appropriato dei numeri di controllo per garantire una scansione affidabile. Con una corretto attuazione utilizzando strumenti come Aspose.BarCode per .NET, il Codice 39 può fornire anni di servizio dipendente in varie applicazioni industriali e commerciali.

La chiave per il successo della implementazione del codice 39 si trova nella comprensione delle sue forze e limitazioni, nell’implementazione di adeguati controlli di qualità, e nel mantenimento della coerenza nei processi di generazione e scansione. Che si sta sviluppando un nuovo sistema di inventario o aggiornando l’infrastruttura di codici a barre esistenti, il codico 39 offre la affidabilità e la compatibilità necessarie per le applicazioni di missione-critica.

 Italiano