-1

我问的原始问题是在 C# 中将表单保存到图像而没有抗锯齿 ,我试图将 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 文件夹中字体的屏幕截图在此处输入图像描述

字体的声明如下

 Font font1DText = new Font("Code 128", 12);

strUserID 的内容是 ÌMachine8Î

4

1 回答 1

2

查看相当详尽的关于 Code 128 的Wikipedia文章,您可以看到其中实际上有三组字符,称为 Code 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

您想对混合大小写的字符串进行编码,因此您想使用 Code B。

使用常规起始码 B信号:Î(0xCC ascii 204) 作为前缀,常规停止码 Ó(0xCE ascii 206) 作为后缀:

char StartCodeB = (char)204;
char StopCode   = (char)206;

您可以将编码字符串构建为:

string stringToPrintAsBarCode = StartCodeB + "King Kong" + checkSum +  StopCode;

顺便说一句: 我发现一些条形码字体比其他字体更好用,例如在打印空间方面。

另请注意,除了Start&Stop代码之外,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)中的那些之前插入一个合适的移位代码。

于 2016-09-01T08:53:15.630 回答