スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

イラストレータでJAN/EAN-13バーコードを生成するスクリプト

Indesignで作ったスクリプトを応用して、イラストレータでJAN/EAN-13バーコードを生成するスクリプトを作ってみました。こっちは書籍用ではなく、一般の製品についているようなOCR文字がバーコードにめり込むような形式です。
現状ではOpenTypeフォント「OCR B std」が必須ですが、フォント名を適宜書き換えてご使用下さい。
//
// JAN/EAN-13バーコード生成スクリプト Ver.1.01
//
// Adobe Illustator CS & CS2
//
// 2007.2.14 いっちゃん
//
//
// バーコード作成で参考にしたURL
// http://www5d.biglobe.ne.jp/~bar/spec/barspec.html
//
// JavaScriptに関して参考にしたURL
// http://www.openspc2.org/
//
// Ver.1.00->1.01
// バーコード描画部の動作を変更。
// チェックデジットが0の時の誤判定を修正。
// 数字の描画位置がバーコードの中央になるように修正。
//

//ドキュメントが開いていなければ新規ドキュメントを作成する。
if(documents.length == 0)
{
app.documents.add();
}

var myDocument = app.activeDocument;

// システムにインストールされているOCRBフォントを検索します。
// もし直接指定したい場合は↓のコードで指定し、「//OCRフォントの検索」の
// For~文をコメントアウトください。

//var myNumFont = app.textFonts.getByName("ここにフォント名を入れて下さい");

//OCRフォント検索
var myNumFont;
for(i = 0; i < app.textFonts.length; i++)
{
if(!app.textFonts[i].name.search(/OCRB+/))
{
myNumFont = app.textFonts.getByName(app.textFonts[i].name);
break;
}
}

//OCRBがなければArialを使用する
if(i >= app.textFonts.length)
{
myNumFont = app.textFonts.getByName("ArialMT");
alert("OCRBフォントがないのでArialを使用します");
}

var codeNum = "";
var result;

//キャンセルが押された時の処理
for(; ;)
{
//入力プロンプトの表示
codeNum = prompt("バーコード番号を13桁で入力して下さい", codeNum);

if(codeNum == null) break; //キャンセルが押された時の処理

result = inputCheck(codeNum) //入力チェック
if(result == 0)
{
jan13(50, 50, 11.0, codeNum);
break;
}
else if(result == 10) alert("桁数が足りないか、半角数字以外の文字が含まれています");
else if(result == 11) alert("数字の入力が間違っています(チェックデジット不一致)");
}

//バーコード番号チェック
function inputCheck(codeNum)
{
var even, odd, result;
even = odd = 0;

if(codeNum.search(/\d{13}/)) return 10; //半角数字13桁が正しく入力されなかった場合は10を返す

//チェックデジット検算
for(i = 11; i >= 1; i -=2 ) even += eval(codeNum[i]);
for(i = 10; i >= 0; i -= 2) odd += eval(codeNum[i]);
result = 10 - (even * 3 + odd) % 10;
if(result == 10) result = 0;
if(eval(codeNum[12]) == result) return 0; //検算OK
else return 11; //検算NG
}

//
// JAN/EAN-13バーコード生成関数
//
// offsetX:描画位置X座標[mm], offsetY:描画位置Y座標[mm]
// Height:バーコード高さ[mm], codeNum:バーコード番号
//
function jan13(offsetX, offsetY, Height, codeNum)
{
const startCode = "101";
const centerCode = "01010";
const endCode = "101";

offsetX = mm2point(offsetX);
offsetY = mm2point(offsetY);
Height = mm2point(Height);

firstAdditionalCode = new Array(10);
firstAdditionalCode[0] = [1, 1, 1, 1, 1, 1];
firstAdditionalCode[1] = [1, 1, 0, 1, 0, 0];
firstAdditionalCode[2] = [1, 1, 0, 0, 1, 0];
firstAdditionalCode[3] = [1, 1, 0, 0, 0, 1];
firstAdditionalCode[4] = [1, 0, 1, 1, 0, 0];
firstAdditionalCode[5] = [1, 0, 0, 1, 1, 0];
firstAdditionalCode[6] = [1, 0, 0, 0, 1, 1];
firstAdditionalCode[7] = [1, 0, 1, 0, 1, 0];
firstAdditionalCode[8] = [1, 0, 1, 0, 0, 1];
firstAdditionalCode[9] = [1, 0, 0, 1, 0, 1];

oddParityL = new Array(10);
oddParityL[0] = [0, 0, 0, 1, 1, 0, 1];
oddParityL[1] = [0, 0, 1, 1, 0, 0, 1];
oddParityL[2] = [0, 0, 1, 0, 0, 1, 1];
oddParityL[3] = [0, 1, 1, 1, 1, 0, 1];
oddParityL[4] = [0, 1, 0, 0, 0, 1, 1];
oddParityL[5] = [0, 1, 1, 0, 0, 0, 1];
oddParityL[6] = [0, 1, 0, 1, 1, 1, 1];
oddParityL[7] = [0, 1, 1, 1, 0, 1, 1];
oddParityL[8] = [0, 1, 1, 0, 1, 1, 1];
oddParityL[9] = [0, 0, 0, 1, 0, 1, 1];

evenParityL = new Array(10);
evenParityL[0] = [0, 1, 0, 0, 1, 1, 1];
evenParityL[1] = [0, 1, 1, 0, 0, 1, 1];
evenParityL[2] = [0, 0, 1, 1, 0, 1, 1];
evenParityL[3] = [0, 1, 0, 0, 0, 0, 1];
evenParityL[4] = [0, 0, 1, 1, 1, 0, 1];
evenParityL[5] = [0, 1, 1, 1, 0, 0, 1];
evenParityL[6] = [0, 0, 0, 0, 1, 0, 1];
evenParityL[7] = [0, 0, 1, 0, 0, 0, 1];
evenParityL[8] = [0, 0, 0, 1, 0, 0, 1];
evenParityL[9] = [0, 0, 1, 0, 1, 1, 1];

evenParityR = new Array(10);
evenParityR[0] = [1, 1, 1, 0, 0, 1, 0];
evenParityR[1] = [1, 1, 0, 0, 1, 1, 0];
evenParityR[2] = [1, 1, 0, 1, 1, 0, 0];
evenParityR[3] = [1, 0, 0, 0, 0, 1, 0];
evenParityR[4] = [1, 0, 1, 1, 1, 0, 0];
evenParityR[5] = [1, 0, 0, 1, 1, 1, 0];
evenParityR[6] = [1, 0, 1, 0, 0, 0, 0];
evenParityR[7] = [1, 0, 0, 0, 1, 0, 0];
evenParityR[8] = [1, 0, 0, 1, 0, 0, 0];
evenParityR[9] = [1, 1, 1, 0, 1, 0, 0];

const moduleWidth = mm2point(0.33);

var posX = posY1 = posY2 = 0.0;
var barcodeBinaryData = new Array();
var FAC = new Array();

// バーコード番号を2進数に変換
codeNum = codeNum + "";
FAC = firstAdditionalCode[eval(codeNum[0])];

barcodeBinaryData += startCode; // 開始コード挿入
for(i = 1; i <= 6; i++) { // バーコード番号の2-6桁の番号を挿入
if(FAC[i - 1] == 0) {
for(j = 0; j < evenParityL[eval(codeNum[i])].length; j++)
barcodeBinaryData += evenParityL[eval(codeNum[i])][j];
}
else if(FAC[i - 1] == 1) {
for(j = 0; j < oddParityL[eval(codeNum[i])].length; j++)
barcodeBinaryData += oddParityL[eval(codeNum[i])][j];
}
}
barcodeBinaryData += centerCode; // センターコードを挿入
for(i = 7; i < 13; i++) { // バーコード番号の7-13桁の番号を挿入
for(j = 0; j < evenParityR[eval(codeNum[i])].length; j++)
barcodeBinaryData += evenParityR[eval(codeNum[i])][j];
}
barcodeBinaryData += endCode; // 終了コードを挿入

//バーコード描画色:スミ1色
var myBarcodeColor = new CMYKColor();
with(myBarcodeColor) {cyan = 0; magenta = 0; yellow = 0; black = 100;}

posX = offsetX - moduleWidth / 2; //バーの太さの半分だけ左方向に移動
posY1 = offsetY;
posY2 = posY1 + Height;
var barCount = 0;
var mypathItem;

//バーコード描画
for(i = 0; i < barcodeBinaryData.length; i++) {
if(barcodeBinaryData[i] != 0) //バーの処理
{
barCount++;
if((barcodeBinaryData[i + 1] == 0) || (i == barcodeBinaryData.length - 1))
{
mypathItem = myDocument.pathItems.add(); //バーを描画
with(mypathItem) //バーの属性指定
{
filled = false; //塗り:無し
stroked = true; //線:有り
strokeColor = myBarcodeColor; //線の塗り色を指定
strokeWidth = moduleWidth * barCount; //バーの太さを指定
//スタートコード、センターコード、エンドコードのバーを1.75mm伸ばす
if(i == 0 || i == 2 || i == 46 || i == 48 || i == 92 || i == 94)
posY1 = offsetY - mm2point(1.75);
else
posY1 = offsetY;
posX += strokeWidth / 2; //バーの太さの半分だけ右方向に移動
setEntirePath([[posX, posY1], [posX, posY2]]); //バーの描画位置指定
posX += strokeWidth / 2; //バーの太さの半分だけ右方向に移動
barCount = 0;
}
}
}
else
{
posX += moduleWidth; //スペースの処理
}
}
var posXMax = posX - moduleWidth / 2; //バーコードの一番右側の位置を記憶

//先頭の付加数字を描画
var myTextFrame = myDocument.textFrames.add();
with(myTextFrame)
{
contents = codeNum[0];
with(textRange.characters[0].characterAttributes)
{
textFont = myNumFont; //フォントの設定
size = 10; //サイズの設定
fillColor = myBarcodeColor; //色の設定
}
translate(offsetX - mm2point(4), offsetY - mm2point(3.2)); //描画位置指定
}
//残りの数字を描画
myTextFrame = myDocument.textFrames.add();
with(myTextFrame)
{
for(i = 1; i <= 6; i++) contents += codeNum[i];
contents += " ";
for(i = 7; i <= 12; i++) contents += codeNum[i];

for(i = 0; i < contents.length; i++)
{
with(textRange.characters[i].characterAttributes)
{
textFont = myNumFont; //フォントの設定
size = 10; //サイズの設定
fillColor = myBarcodeColor; //色の設定
if(myNumFont == app.textFonts.getByName("ArialMT"))
if(i == contents.length - 1) tracking = 0 //Arialの時はトラッキング=100
else tracking = 100; //但し最後のキャラクタだけ0
else
if(i == contents.length - 1) tracking = 0 //それ以外は-100
else tracking = -100; //但し最後のキャラクタだけ0
}
}

var posXCenter = (posXMax - offsetX) / 2 + offsetX; //バーコードX方向の中心を求める
translate(posXCenter - myTextFrame.width / 2, offsetY - mm2point(3.2)); //描画位置指定
}
}

//ポイントサイズ->ミリメートル変換
function point2mm(arg) {
if (arg == 0)
return 0;
else
return(arg * 25.4 / 72);
}

//ミリメートル->ポイントサイズ変換
function mm2point(arg) {
if (arg == 0)
return 0;
else
return(arg / 25.4 * 72);
}
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。