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