public override Rectangle PlaceBarcode(PdfContentByte cb, Color barColor, Color textColor) {
Rectangle rect = this.BarcodeSize;
float barStartX = 0;
float barStartY = 0;
float textStartY = 0;
if (font != null) {
if (baseline <= 0)
textStartY = barHeight - baseline;
else {
textStartY = -font.GetFontDescriptor(BaseFont.DESCENT, size);
barStartY = textStartY + baseline;
}
}
switch (codeType) {
case EAN13:
case UPCA:
case UPCE:
if (font != null)
barStartX += font.GetWidthPoint(code[0], size);
break;
}
byte[] bars = null;
int[] guard = GUARD_EMPTY;
switch (codeType) {
case EAN13:
bars = GetBarsEAN13(code);
guard = GUARD_EAN13;
break;
case EAN8:
bars = GetBarsEAN8(code);
guard = GUARD_EAN8;
break;
case UPCA:
bars = GetBarsEAN13("0" + code);
guard = GUARD_UPCA;
break;
case UPCE:
bars = GetBarsUPCE(code);
guard = GUARD_UPCE;
break;
case SUPP2:
bars = GetBarsSupplemental2(code);
break;
case SUPP5:
bars = GetBarsSupplemental5(code);
break;
}
float keepBarX = barStartX;
bool print = true;
float gd = 0;
if (font != null && baseline > 0 && guardBars) {
gd = baseline / 2;
}
if (barColor != null)
cb.SetColorFill(barColor);
for (int k = 0; k < bars.Length; ++k) {
float w = bars[k] * x;
if (print) {
if (Array.BinarySearch(guard, k) >= 0)
cb.Rectangle(barStartX, barStartY - gd, w - inkSpreading, barHeight + gd);
else
cb.Rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
}
print = !print;
barStartX += w;
}
cb.Fill();
if (font != null) {
if (textColor != null)
cb.SetColorFill(textColor);
cb.BeginText();
cb.SetFontAndSize(font, size);
switch (codeType) {
case EAN13:
cb.SetTextMatrix(0, textStartY);
cb.ShowText(code.Substring(0, 1));
for (int k = 1; k < 13; ++k) {
string c = code.Substring(k, 1);
float len = font.GetWidthPoint(c, size);
float pX = keepBarX + TEXTPOS_EAN13[k - 1] * x - len / 2;
cb.SetTextMatrix(pX, textStartY);
cb.ShowText(c);
}
break;
case EAN8:
for (int k = 0; k < 8; ++k) {
string c = code.Substring(k, 1);
float len = font.GetWidthPoint(c, size);
float pX = TEXTPOS_EAN8[k] * x - len / 2;
cb.SetTextMatrix(pX, textStartY);
cb.ShowText(c);
}
break;
case UPCA:
cb.SetTextMatrix(0, textStartY);
cb.ShowText(code.Substring(0, 1));
for (int k = 1; k < 11; ++k) {
string c = code.Substring(k, 1);
float len = font.GetWidthPoint(c, size);
float pX = keepBarX + TEXTPOS_EAN13[k] * x - len / 2;
cb.SetTextMatrix(pX, textStartY);
cb.ShowText(c);
}
cb.SetTextMatrix(keepBarX + x * (11 + 12 * 7), textStartY);
cb.ShowText(code.Substring(11, 1));
break;
case UPCE:
cb.SetTextMatrix(0, textStartY);
cb.ShowText(code.Substring(0, 1));
for (int k = 1; k < 7; ++k) {
string c = code.Substring(k, 1);
float len = font.GetWidthPoint(c, size);
float pX = keepBarX + TEXTPOS_EAN13[k - 1] * x - len / 2;
cb.SetTextMatrix(pX, textStartY);
cb.ShowText(c);
}
cb.SetTextMatrix(keepBarX + x * (9 + 6 * 7), textStartY);
cb.ShowText(code.Substring(7, 1));
break;
case SUPP2:
case SUPP5:
for (int k = 0; k < code.Length; ++k) {
string c = code.Substring(k, 1);
float len = font.GetWidthPoint(c, size);
float pX = (7.5f + (9 * k)) * x - len / 2;
cb.SetTextMatrix(pX, textStartY);
cb.ShowText(c);
}
break;
}
cb.EndText();
}
return rect;
}