## Introduction

This article is based on Neil Van Eps' series of articles that show how to draw barcodes. In this article, the code will draw the 1D barcode of `Postnet`

.

## Postnet Basics

`PostNet `

was developed by the United States Postal Service (USPS) to allow faster sorting and routing of mail. `Postnet `

is the familiar, funny-looking barcode often printed on envelopes and business return mail.

### Encode Table

This table indicates how to encode each digit of a `PostNet`

barcode. Note that the encoding is expressed as "0" (half bar) or "1" (full bar).

ASCII CHARACTER | BARCODE ENCODING |

0 | 11000 |

1 | 00011 |

2 | 00101 |

3 | 00110 |

4 | 01001 |

5 | 01010 |

6 | 01100 |

7 | 10001 |

8 | 10010 |

9 | 10100 |

### Structure of Postnet Barcode

A `PostNet `

barcode has the following structure:

- Frame bar, encoded as a single 1
- 5, 9, or 11 data characters properly encoded (see encoding table below)
- Check digit, encoded using encoding table below
- Final frame bar, encoded as a single 1

### Computing the Checksum Digit

`PostNet `

barcodes always include a modulo 10 check digit.

Before a `PostNet `

symbol may be encoded, a checksum digit must be calculated to be subsequently appended to the end of the barcode. The checksum digit is a simple modulo 10 calculation of the sum of all the digits that are being coded.

The steps for calculating the check digit are as follows:

- Sum the total of all individual digits being encoded. For example, 80122-1905 would be calculated as 8 + 0 + 1 + 2 + 2 + 1 + 9 + 0 + 5 = 28.
- Determine the value that, when added to the sum, produces a value evenly divisible by 10. For example, 28 + 2 = 30, so the value is 2.
- The check digit is the value calculated in step 2. In this case the check digit is 2.

## CEAN13 Class

My `CEAN13`

is based on the `CBarcode`

class, that has been introduced in Neil Van Eps' series of articles.

Here is the `CPostnet`

class declaration. It's implemented to draw a `Postnetbarcode`

.

class CRationalCodabar : public CBarcode
{
public:
void DrawBitmap();
void BitmapToClipboard();
CRationalCodabar();
virtual ~CRationalCodabar();
private:
CString RetrievePattern(char c);
void DrawPattern(CString csPattern);
};

## CPostnet::DrawBitmap() Details

void CPostnet::DrawPattern( CString csPattern )
{
int i,nXPixel,nYPixel;
CDC oDC;
oDC.Attach(m_hDC);
nXPixel = m_nStartingXPixel;
for (i=0;i<csPattern.GetLength();i++)
{
for (nXPixel=m_nStartingXPixel;nXPixel<m_nStartingXPixel+m_nNarrowBarPixelWidth;
nXPixel++)
{
if (csPattern.GetAt(i)=='b')
{
for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight;nYPixel++)
{
oDC.SetPixelV(nXPixel,nYPixel,COLORBLACK);
}
}
else
{
for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight/2;nYPixel++)
{
oDC.SetPixelV(nXPixel,nYPixel,COLORBLACK);
}
}
for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight;nYPixel++)
{
oDC.SetPixelV(nXPixel+m_nNarrowBarPixelWidth,nYPixel,COLORWHITE);
}
}
m_nStartingXPixel+= 2*m_nNarrowBarPixelWidth;
}
oDC.Detach();
return;
}

## Other Resources

Here are some resources about barcodes:

## History

- 9th February, 2006: Initial post