-1

私が尋ねた元の質問は、 Code128をプリンターに印刷しようとしているアンチエイリアシングなしでフォームを画像に保存するC#でした。スクリーン キャプチャは印刷の品質を低下させるため、代わりに印刷用のコードを直接記述することにしました。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 に関するかなり網羅的なウィキペディアの記事を見ると、Code A、B、および C と呼ばれる 3 つの文字セットが含まれていることがわかります。

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 (1 つのコード ポイントで 2 桁をエンコード) および FNC1

大文字と小文字が混在する文字列をエンコードするため、コード 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 でエンコードされた文字列にはチェックサム文字も含まれている必要があることに注意してください。これら 3 つの文字のいずれかまたはすべてを省略すると、印刷されたバーコードをスキャンできません。

あなたの例では、「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 に答える