2

TCPDF ライブラリを使用して、製品ラベルの正しい EAN-128 コードを生成しようとしていますが、バーコード スキャナーが生成されたバーコードを読み取らないとクライアントから言われました。元の (古い) バーコードと文字列:

ここに画像の説明を入力

コード文字列は次のとおりです。

$codeString = "(01)08437013308045(3013)2675(15)161201(10)150518"

次のように、文字列を直接 TCPDF 関数に渡すと:

$label->write1DBarcode($codeString, 'C128A', $x, $y, $w, $h);

正しい出力が得られますが (スキャナは読み取れません)、バーは元のバーコードよりも密度が高く、短くて密度が低いように見えます (彼らはそれが EAN-128 だと言っています): ここに画像の説明を入力

ここ ( FNC1 を使用した EAN-128 )chr(241)の前に$codeString追加すると役立つことがわかりましたが、追加すると、結果の画像は人間が読めるコードのすべてから取り除かれます。

ここに画像の説明を入力

バーコードリーダーを所有していないため、エラーを自分で確認することはできません。

ここで何が欠けていますか?TCPDF バージョン 6.2.12 を使用しています。

4

1 に答える 1

8

ここにはいくつかの問題があります。

(3103)2775まず、正味重量を表す固定長のアプリケーション識別子 (AI) フィールドを含む元のバーコードのテキストを読み間違えています。

(3013)2675無効なコードを含むコードを記述しました。AI (3013) はありません。残念ながら、これは、可変長フィールドであるアイテム カウントを表す正当な AI (30) とのプレフィックス マッチになります。したがって、後続のフィールド ターミネータ文字 (FNC1) がないため、デコーダはコードの最後まで残りのデータを AI (30) に読み取り続けます。これは多くの項目です。実際には 8 桁以上の価値があるため、リーダーが障害を指摘する可能性があります。

この回答の「抽出」部分は、有効な GS1-128 シンボルを生成するために GS1 データが Code 128 バーコード内でエンコードされる方法の背景を提供します。

GS1 データをエンコードするつもりだったと仮定しましょう(01)08437013308045(3103)2675(15)161201(10)150518

Code 128 でエンコードする必要がある生データは{FNC1}0108437013308045310326751516120110150518.

これは次のように導き出されました。

  • データは FNC1 フラグ文字 (GS1 形式のデータの存在を示す) で始まります。
  • AI を囲む括弧は省略されています。
  • データは固定長の AI のみで構成されているため、可変長フィールドを FNC1 区切り文字[*]で終了する必要がある場合はありません。

[*] GS1 一般仕様§3.2「数字順の GS1 アプリケーション識別子」で提供される AI のリストは、追加データが続く場合に FNC1 文字による終了を必要とするかどうかを示していることに注意してください。

この知識は、TCPDF のコードにどのように変換されますか? 申し訳ありませんが、これは役立つかもしれません:

変数$codeStringは次のように定義する必要があります。

$codeString = chr(241).'0108437013308045310326751516120110150518';

これは、TCPDF が ASCII 序数 241 を使用して FNC1 文字を示すことを示す、サポート フォーラムの回答へのリンクが正しいことを前提としています。(これが当てはまるかどうかは疑問です。)それが機能する場合、これはライブラリ固有の選択であり、値 241 を選択したという事実をあまり読まないでください。非データ文字のエンコードの詳細については、こちらを参照してください。 FNC1など。

また、シンボルをモード A (数字、大文字、および制御文字) に制限するC128Aパラメーターtypeに渡すことにも気付きました。 write1DBarcode) 物流アプリケーションに使用されるほとんどの標準的な機器でスキャンできます。

Code 128 は、数字の倍密度圧縮を提供するモード C をサポートしているため、これを使用する必要があります。おそらく、TCPDF の自動エンコードが適切であり、今後作成するシンボルには文字を含める必要があると仮定して、(auto) を渡すtype=C128Cか、 (auto) によって使用する必要があります。type=C128

$label->write1DBarcode($codeString, 'C128', $x, $y, $w, $h);

バーコードの下の人間が読めるテキストに関する限り、これが適切にエンコードされたデータに対して正しく表示されない場合は、TCPDF に対してバグ レポートまたは機能リクエストを提出する必要がある場合があります。

于 2015-12-02T15:07:00.203 に答える