スポンサーサイト

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

JAN13バーコード(書籍用)を作るスクリプト

去年より書籍用スリップ(通称:ボウズ)の形式が変更になり、バーコードを追加することになりました。このスクリプトはそのときに作ったものです。
OCRフォントはArial Rを使用していますが、各自お使いのフォント名に書き換えてご使用下さい。
//
// JAN13バーコードを作るスクリプト
//

var code = prompt("バーコードデータを入力して下さい(13桁)", 1234567890128);
if(code) {
var myDocument = app.documents.add();
JAN13(50, 50, 11.0, 0, 1.0, code);
}

//
// JAN13バーコード描画関数
//
// 引数: offsetX 描画開始位置X[mm]
// offsetY 描画開始位置Y[mm]
// Height バーコード高さ[mm]
// Angle 描画角度[°] [0, 90, 180, 270のいずれか]
// Devide バーコード描画倍率 [規格上では0.8-2.0] 横幅と線の太さに影響を与える
// JANCode JANコード(13桁)
//
// 戻り値: 正常時はtrue, 桁数不足、またはチェック数字の間違いを訂正を行わない場合はfalse
//
function JAN13(offsetX, offsetY, Height, Angle, Devide, JANCode) {

var TABCODE = String.fromCharCode(9);
var ocrNumFontName = "Arial";
var ocrNumFontStyle = "Regular";
// var ocrNumFontName = "OCR B Std";
// var ocrNumFontStyle = "Medium";

// JANCodeが数値ならば文字列に変換
if(isNaN(JANCode) == true)
JANCode = JANCode + "";

// 数字以外を削除
JANCode = JANCode.replace(/[^0-90-9]/g, "");

// 全角数字->半角数字変換
strTmp = "";
for(i = 0; i < JANCode.length; i++) {
if(JANCode.charCodeAt(i) >= 65296)
strTmp += (JANCode.charCodeAt(i) - 65296) + "";
else
strTmp += JANCode[i];
}
JANCode = strTmp;

// 桁数が足らない場合はfalseを返して終了
if(JANCode.length != 13) {
alert("桁数が足りません");
return false;
}

// チェック数字が計算と一致しない場合の処理
if(JANCode.charAt(12) != getParity(JANCode)) {
// ダイアログ表示
dlgObj = app.dialogs.add({name:"チェック数字エラー"});
clmDlgObj =dlgObj.dialogColumns.add();
clmDlgObj.staticTexts.add({staticLabel : "正しい数値に修正してよろしいですか?"});
res = dlgObj.show();

// OKならば正しい数値に設定、キャンセルならばfalseを返して終了
if(res == true)
JANCode = JANCode.slice(0, JANCode.length - 1) + (getParity(JANCode) + "");
else
return false;
}

const startCode = "101";
const centerCode = "01010";
const endCode = "101";

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 = 0.33 * Devide;

var barcodeBinaryData = new Array();

var posX1 = posY1 = posX2 = posY2 = 0.0;

FAC = new Array;
FAC = firstAdditionalCode[eval(JANCode[0])];

// JANコードをバイナリに変換
// 開始コード挿入
barcodeBinaryData += startCode;

// JANコードの2-6桁の番号を挿入
for(i = 1; i <= 6; i++) {
if(FAC[i - 1] == 0) {
for(j = 0; j < evenParityL[eval(JANCode[i])].length; j++)
barcodeBinaryData += evenParityL[eval(JANCode[i])][j];
}
else if(FAC[i - 1] == 1) {
for(j = 0; j < oddParityL[eval(JANCode[i])].length; j++)
barcodeBinaryData += oddParityL[eval(JANCode[i])][j];
}
}

// センターコードを挿入
barcodeBinaryData += centerCode;

// JANコードの7-13桁の番号を挿入
for(i = 7; i < 13; i++) {
for(j = 0; j < evenParityR[eval(JANCode[i])].length; j++)
barcodeBinaryData += evenParityR[eval(JANCode[i])][j];
}

// 終了コードを挿入
barcodeBinaryData += endCode;

//バーコード描画
myBarcodeColor = myDocument.colors.item("Black");

switch(Angle) {
case 0:
posX1 = offsetX + moduleWidth / 2;
posY1 = offsetY;
posX2 = offsetX + moduleWidth / 2;
posY2 = offsetY + Height;
break;
case 90:
posX1 = offsetX;
posY1 = offsetY - moduleWidth / 2;
posX2 = offsetX + Height;
posY2 = offsetY - moduleWidth / 2;
break;
case 180:
posX1 = offsetX - moduleWidth / 2;
posY1 = offsetY;
posX2 = offsetX - moduleWidth / 2;;
posY2 = offsetY - Height;
break;
case 270:
posX1 = offsetX;
posY1 = offsetY + moduleWidth / 2;
posX2 = offsetX - Height;
posY2 = offsetY + moduleWidth / 2;
break;
default:
posX1 = offsetX;
posY1 = offsetY;
posX2 = offsetX;
posY2 = offsetY + Height;
break;
}

for(i = 0; i < barcodeBinaryData.length; i++) {
if(barcodeBinaryData[i] == 1) {
myRectangle = app.activeDocument.rectangles.add();
myRectangle.strokeColor = myBarcodeColor;
myRectangle.strokeWeight = moduleWidth + "mm";
myRectangle.paths.item(0).entirePath = [[posX1 + "mm", posY1 + "mm"],[posX2 + "mm", posY2 + "mm"]];
}
switch(Angle) {
case 0:
posX1 += moduleWidth;
posX2 += moduleWidth;
break;
case 90:
posY1 -= moduleWidth;
posY2 -= moduleWidth;
break;
case 180:
posX1 -= moduleWidth;
posX2 -= moduleWidth;
break;
case 270:
posY1 += moduleWidth;
posY2 += moduleWidth;
break;
default:
posX1 += moduleWidth;
posX2 += moduleWidth;
break;
}
}

//OCR数字の付加
var ocrNumberSize = 13 * Devide; // unit = Q
var ocrNumberFrameSize = 31.35 * Devide; // unit = mm
const ocrNumberPosOffesetX = 0.00; // unit = mm
const ocrNumberPosOffesetY = 0.75; // unit = mm

myTextFrame = app.activeDocument.textFrames.add();
with(myTextFrame) {
texts[0].pointSize = ocrNumberSize + "Q";
contents = JANCode;

// CSでのフォント設定
// ※CSのapp.versionはNumber型の3、CS2はstring型でマイナーバージョンを含めた形でそれぞれ返ってくるので注意
if( !(isNaN(app.version) ) && (app.version < 4) ) {
paragraphs[0].appliedFont = app.fonts.item(ocrNumFontName);
paragraphs[0].fontStyle = ocrNumFontStyle;
} else
// CS2以降でのフォント設定
paragraphs[0].appliedFont = app.fonts.item(ocrNumFontName + TABCODE + ocrNumFontStyle);

paragraphs[0].justification = Justification.fullyJustified;
rotationAngle = Angle;
}

switch(Angle) {
case 0:
posX1 = offsetX - ((ocrNumberFrameSize - barcodeBinaryData.length * moduleWidth) / 2) + ocrNumberPosOffesetX;
posY1 = offsetY + Height + ocrNumberPosOffesetY;
posX2 = posX1 + ocrNumberFrameSize;
posY2 = offsetY + Height + ocrNumberPosOffesetY + q2mm(ocrNumberSize);
break;
case 90:
posX1 = offsetX + Height + ocrNumberPosOffesetY;
posY1 = offsetY + ((ocrNumberFrameSize - barcodeBinaryData.length * moduleWidth) / 2) + ocrNumberPosOffesetX;
posX2 = offsetX + Height + ocrNumberPosOffesetY + q2mm(ocrNumberSize);
posY2 = posY1 - ocrNumberFrameSize;
break;
case 180:
posX1 = offsetX - barcodeBinaryData.length * moduleWidth - ((ocrNumberFrameSize - barcodeBinaryData.length * moduleWidth) / 2) + ocrNumberPosOffesetX;
posY1 = offsetY - Height - q2mm(ocrNumberSize) - ocrNumberPosOffesetY;
posX2 = posX1 + ocrNumberFrameSize;
posY2 = offsetY - Height - ocrNumberPosOffesetY;
break;
case 270:
posX1 = offsetX - Height - q2mm(ocrNumberSize) - ocrNumberPosOffesetY;
posY1 = offsetY + barcodeBinaryData.length * moduleWidth + ((ocrNumberFrameSize - barcodeBinaryData.length * moduleWidth) / 2) + ocrNumberPosOffesetX;
posX2 = offsetX - Height - ocrNumberPosOffesetY;
posY2 = posY1 - ocrNumberFrameSize;
break;
default:
posX1 = offsetX - ((ocrNumberFrameSize - barcodeBinaryData.length * moduleWidth) / 2) + ocrNumberPosOffesetX;
posY1 = offsetY + Height + ocrNumberPosOffesetY;
posX2 = posX1 + ocrNumberFrameSize;
posY2 = offsetY + Height + ocrNumberPosOffesetY + q2mm(ocrNumberSize);
break;
}
myTextFrame.geometricBounds = [posY2 + "mm", posX2 + "mm", posY1 + "mm", posX1 + "mm"];

return true;
}

//
// JANコードのチェック数字(パリティーコード)を求める関数
//
// [チェック数字の求め方]
// チェック数字を除く12桁のJANコードを、左から数えて奇数桁の数字を合計した数字と
// 偶数桁の数字を合計して3倍した数字を加算し、その数字の一桁目のみを10から引いた
// 数をチェック数字とする。ただし結果が10の場合は0とする。
//
function getParity(arg) {

var odd = even = 0;

if( (arg.length < 12) || (arg.length > 13) ) return false;

for(i = 0; i < 12; i++) {
if(i % 2 == 0)
odd += Number(arg[i]);
else
even += Number(arg[i]);
}
even *= 3;
res = (10 - ( (odd + even) % 10) ) % 10;
return res;
}

function q2mm(arg) {
return arg / 4;
}
スポンサーサイト

COMMENTS

承認待ちコメント

このコメントは管理者の承認待ちです

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

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