C# 代码 128 不打印出来

Posted

技术标签:

【中文标题】C# 代码 128 不打印出来【英文标题】:C# Code 128 does not print out 【发布时间】:2017-01-08 20:18:17 【问题描述】:

我最初提出的问题是 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 文件夹中字体的屏幕截图

字体的声明为as

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

strUserID 的内容是 ÌMachine8Î

【问题讨论】:

Code128 是条形码字体的名称。如果这不是您所说的,请更正问题并标记!还告诉我们您正在使用哪种字体,并显示变量strUserID128!的声明 您好 TaW 我已经更新了问题。请看一看。建议哪个标签也是错误的 啊,所以它您要打印的条形码?在这种情况下,标签是正确的! I have seen the issue (or soemthing quite similar )before 然后更改字体是最好的解决方案。@ 987654329@ 字符可能是问题所在;条形码字体实际上只是用于数字、大写字母和一些特殊代码。 您好,我相信 ÌMachine8Î 是正确的,因为如果我通过记事本打印,我可以从手持扫描仪上读取数据。删除 Î 字符使其不可读 嗯,Î 是功能 4 (​​FNC4),据说“没有得到广泛支持”。你实际上想要一个Start Code B 信号,这意味着其余的可以是 32-127 和一些额外的。您可以尝试将Ñ (0xCE ascii 206) 作为前缀,或者将停止代码Ó (0xD3 ascii 211) 作为后缀吗? 【参考方案1】:

查看关于 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。

使用常规 Start Code B 信号:Î (0xCC ascii 204) 作为前缀,常规 Stop Code Ó (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,例如说到打印空间。

另请注意,除了 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');

这是结果:

请注意,它相当简单,并且依赖于字符 all 位于相同的给定代码集中;如果不是这种情况,您将不得不扩展它以测试字符并在另一个代码集(可能是代码 A)中的字符之前插入一个合适的移位代码。..

【讨论】:

我已经更新并扩展了答案以包含一个简单的字符串编码函数。它针对一些简单的代码集 B 字符串进行了测试。我还删除了关于您使用错误起始码的评论。我一定是误读了您发布的字符,或者您已更正它们?-)

以上是关于C# 代码 128 不打印出来的主要内容,如果未能解决你的问题,请参考以下文章

ZPL 代码 128 与 mPDF 代码 128 输出不匹配

c# winform 打印groupbox内容打印预览显示不全

c# Winform 打印问题,请教高手

使用LODOP打印控件,选择128Auto格式,打印相同位数的条码。

C# winform做打印预览和打印功能怎么做?

C#中如何打印出整个PANEL的内容?