我问过的原始问题是 C# Saving a form to image without anti aliasing 我试图打印Code128到打印机。由于屏幕捕获降低了打印质量,我决定直接编写代码进行打印。 除Code128
外,所有图像和文字都可以正确打印出来以下是我打印Code128的代码。内容已经正确生成。
SizeF sizeLoginID128 = e.Graphics.MeasureString(this.strUserID128, font1DText);
e.Graphics.DrawString(this.strUserID128, font1DText, Brushes.Black, fInfoStartX + TEXT_LEFT_MARGIN_OFFSET, fInfoStartY + TEXT_TOP_MARGIN_OFFSET);
该字体可以在FONTS目录中找到,它是真正的字体。在GUI设计阶段,字体也正确显示。但是,当打印出来时,打印中缺少code128。
有没有人知道为什么或我没有再做正确的事情
修改
中字体的屏幕截图字体声明为
Font font1DText = new Font("Code 128", 12);
strUserID的内容是ÌMachine8Î
答案 0 :(得分:1)
查看关于Code 128的相当详尽的Wikipedia文章,您可以看到其中有三组字符,称为代码A,B和C.
128A(代码集A) - ASCII 00-95(0-9,A-Z和控制代码),特殊字符和FNC 1-4
128B(代码集B) - ASCII 32-127(0-9,A-Z,a-z),特殊字符和FNC 1-4
128C(代码集C) - 00-99(用单个代码点编码两位数字)和FNC1
您希望对混合大小写字符串进行编码,以便使用代码B.
使用常规开始代码B 信号:Î
(0xCC ascii 204)作为前缀和常规停止代码 Ó
(0xCE ascii 206)作为后缀:
char StartCodeB = (char)204;
char StopCode = (char)206;
您可以将编码的字符串构建为:
string stringToPrintAsBarCode = StartCodeB + "King Kong" + checkSum + StopCode;
顺便说一下:I found some bar code fonts to work better than others,例如当谈到印刷空间时。
另请注意,除开始和停止代码外,code128编码的字符串还必须包含校验和字符 ..如果您忽略这三个中的任何一个或全部打印的条形码不能扫描!
在你的例子中,' 8'是校验和字符。
这是计算给定文本和给定起始代码的校验和的例程:
static char checkSum128(string data, int startcode)
{
int sum = startcode;
for (int i = 0; i < data.Length; i++)
{
sum += (i + 1) * ((byte)(data[i]) - 32);
}
return (char)((sum % 103)+32);
}
这是一个工作例程,它将使用给定的起始码字符编码给定的文本:
string EncodeToCode128(string text, char CodeABC)
{
char Stop = (char)206;
char StartCode = CodeABC == 'A' ? (char)203 :
CodeABC == 'C' ? (char)205 : (char)204;
char check = checkSum128(text, (byte)StartCode - 100);
return StartCode + text + (char)check + Stop;
}
像这样使用:
label_barCodeFont.Text = EncodeToCode128("Hello 2017", 'B');
结果如下:
请注意,它非常简单,并且依赖于所有字符在同一代码集中;如果不是这种情况,你必须扩展它以测试字符并在另一个代码集(可能是代码A)之前插入一个合适的移位代码。