スポンサーサイト

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

PDFデータを8ページ折りで面付するスクリプト

PDFデータを8ページ折り(8ページ掛け)で面付するスクリプトです。
今の所、背丁の位置が決め打ちのため、紙を横置きに設定すると背丁が飛び出てしまいます。

//
// PDFデータを8ページ折りで面付するスクリプト
//
var BLEED = 3; // ドブ[mm]
var tachikeiWeight = 0.1; // 裁ち罫太さ[mm]
var tachikeiLength = 10 // 裁ち罫長さ[mm]

const A4W = 210, A4H = 297, B5W = 182, B5H = 257;
var foldingCount; // 折数
var pdfPageOffset; // 貼付開始ページ
var bookTitle; // 背丁タイトル
var fileRef; // PDFファイルの絶対パス
var FILENUM = new Array;
FILENUM = [[8, 1, 4, 5], [2, 7, 6, 3]];
var FILENUM2 = new Array;
FILENUM2 = [[4, 5, 8, 1], [6, 3, 2, 7]];
var bindingStyle;

// デフォルトフォントの設定
app.textDefaults.appliedFont = app.fonts.item("ヒラギノ明朝 Pro W3");

myDisplayDialog();

function myDisplayDialog() {
myDialog = app.dialogs.add( {name:"PDF8ページ本掛スクリプト"} );

var myDDpageStyle = new Array("A4", "B5");
with(myDialog.dialogColumns.add() ){
with(borderPanels.add()){
staticTexts.add({staticLabel:"用紙"});
// 用紙サイズのドロップダウンメニュー作成
var myDropDown2 = dropdowns.add({stringList:myDDpageStyle, selectedIndex:0});
// 用紙縦・横選択ラジオボタン作成
with(myRadioBotton = radiobuttonGroups.add()) {
radiobuttonControls.add({staticLabel:"縦 ", checkedState:true});
radiobuttonControls.add({staticLabel:"横"});
// 裁ち落とし有無のチェックボックス作成
myCheckBox = checkboxControls.add({staticLabel:"塗り足し有", checkedState:false});
}
}
with(borderPanels.add()){
staticTexts.add({staticLabel:"綴じ方"});
with(myRadioBotton2 = radiobuttonGroups.add()) {
radiobuttonControls.add({staticLabel:"左綴じ天袋", checkedState:true});
radiobuttonControls.add({staticLabel:"右綴じ地袋"});
}
}
with(borderPanels.add()){
staticTexts.add({staticLabel:"開始折数"});
myIntEBox2 = integerEditboxes.add({editValue:1, minimumValue:1, maximumValue:99});
staticTexts.add({staticLabel:"終了折数"});
myIntEBox3 = integerEditboxes.add({editValue:99, minimumValue:1, maximumValue:99});
}
with(borderPanels.add()){
staticTexts.add({staticLabel:"品名(背丁に表示されます)"});
myTxtEBox = textEditboxes.add({editContents:"品名", minWidth:155});
}
with(borderPanels.add()){
staticTexts.add({staticLabel:"PDFの貼付開始ページ"});
myIntEBox = integerEditboxes.add({editValue:1, minimumValue:1, maximumValue:999});
}
}
// Dialogメニュー表示後のアクション
var myReturn = myDialog.show();
// OKを押された時
if (myReturn == true) {
myDocumentSize = myDropDown2.selectedIndex; // 用紙の大きさ
myDocumentDirection = myRadioBotton.selectedButton; // 用紙の方向
// A4縦
if ( (myDocumentSize == 0) && (myDocumentDirection == 0) ) {
DocumentWidth = A4W;
DocumentHeight = A4H;
// A4横
} else if ( (myDocumentSize == 0) && (myDocumentDirection == 1) ) {
DocumentWidth = A4H;
DocumentHeight = A4W;
// B5縦
} else if ( (myDocumentSize == 1) && (myDocumentDirection == 0) ) {
DocumentWidth = B5W;
DocumentHeight = B5H;
// B5横
} else if ( (myDocumentSize == 1) && (myDocumentDirection == 1) ) {
DocumentWidth = B5H;
DocumentHeight = B5W;
}
bleedStatus = myCheckBox.checkedState;
pdfPageOffset = eval(myIntEBox.editContents);
foldingCount = eval(myIntEBox2.editContents);
bookTitle = myTxtEBox.editContents;
if(eval(myIntEBox2.editContents) >= eval(myIntEBox3.editContents) ) {
alert("折数を正しく設定してください");
exit();
}
totalPage = (eval(myIntEBox3.editContents) - eval(myIntEBox2.editContents) + 1) * 2;
bindingStyle = eval(myRadioBotton2.selectedButton);
myDialog.destroy();
// PDFファイル選択ダイアログを表示
fileRef = File.openDialog("面付するPDFファイルを選択してください", "PDFファイル:*.pdf" );
if(fileRef != null) {
impositionMain();
}
} else {
// ダイアログ破棄
myDialog.destroy();
}
}

function impositionMain() {
// デフォルトフォントの指定
var myDefaultFont = app.fonts.item("小塚明朝 Std");

// 新規ドキュメントの作成
var myDocument = app.documents.add();

// 背丁の色設定
var setColorWhite = [0, 0, 0, 0];
var setColorBlack = [0, 0, 0, 100];
var colorWhite = myDocument.colors.add({model:ColorModel.process,space:ColorSpace.cmyk,colorValue:setColorWhite});
var colorBlack = myDocument.colors.add({model:ColorModel.process,space:ColorSpace.cmyk,colorValue:setColorBlack});

// ドキュメントサイズを設定(横2倍 縦2倍+ドブ×2 単ページ表示 左綴じ)
with (myDocument.documentPreferences) {
pageWidth = DocumentWidth * 2;
pageHeight = DocumentHeight * 2 + BLEED * 2;
facingPages = false;
pageBinding = PageBindingOptions.leftToRight;
slugTopOffset = 20;
slugBottomOffset = 20;
slugInsideOrLeftOffset = 20;
slugRightOrOutsideOffset = 20;
}

// 不要なマスターを削除
myDocument.masterSpreads.item(0).pages.item(0).remove();
// マスターの全マージンを0mmに設定
with (myDocument.masterSpreads.item(0).pages.item(0)) {
editUnits = MeasurementUnits.millimeters;
with (marginPreferences) {
right = 0;
left = 0;
top = 0;
bottom = 0;
}
}

//レイアウトグリッド非表示
myDocument.cjkGridPreferences.showAllLayoutGrids = false;

// ガイドライン作成
horizontalGuidelineBound = new Array(DocumentHeight / 2, DocumentHeight, DocumentHeight + BLEED, DocumentHeight + BLEED * 2, DocumentHeight * 1.5 + BLEED * 2);
verticalGuidelineBound = new Array(DocumentWidth / 2, DocumentWidth, DocumentWidth * 1.5);

for(i = 0; i < horizontalGuidelineBound.length; i ++) {
myGuide = myDocument.masterSpreads.item(0).guides.add();
myGuide.orientation = HorizontalOrVertical.horizontal;
myGuide.location = horizontalGuidelineBound[i];
myGuide.fitToPage = true;
}
for(i = 0; i < verticalGuidelineBound.length; i ++) {
myGuide = myDocument.masterSpreads.item(0).guides.add();
myGuide.orientation = HorizontalOrVertical.vertical;
myGuide.location = verticalGuidelineBound[i];
myGuide.fitToPage = true;
}

// マスターAに裁ち罫を入れる
var tachikeiBounds = new Array(4);
tachikeiBounds[0] = [ [-BLEED - tachikeiLength, DocumentHeight], [-BLEED, DocumentHeight] ];
tachikeiBounds[1] = [ [-BLEED - tachikeiLength, DocumentHeight + BLEED * 2], [-BLEED, DocumentHeight + BLEED * 2] ];
tachikeiBounds[2] = [ [DocumentWidth * 2 + BLEED, DocumentHeight], [DocumentWidth * 2 + BLEED + tachikeiLength, DocumentHeight] ];
tachikeiBounds[3] = [ [DocumentWidth * 2 + BLEED, DocumentHeight + BLEED * 2], [DocumentWidth * 2 + BLEED + tachikeiLength, DocumentHeight + BLEED * 2] ];
var myTachikei;
var myRegistrationColor = myDocument.colors.item("Registration");
for(i = 0; i < 4; i++) {
myTachikei = myDocument.masterSpreads.item(0).rectangles.add();
myTachikei.paths.item(0).entirePath = tachikeiBounds[i];
myTachikei.strokeColor = myRegistrationColor;
myTachikei.strokeWeight = tachikeiWeight + "mm";
}

// A-マスターの名前を設定(マスター(背丁有))
app.activeDocument.masterSpreads[0].baseName = "マスター(背丁有)";

// マスターを複製し名前を設定(B-マスター)
app.activeDocument.masterSpreads[0].duplicate();
app.activeDocument.masterSpreads[1].baseName = "マスター";
app.activeDocument.masterSpreads[1].namePrefix = "B"

// マスターAに背丁タイトルを入れる(ヒラギノ明朝Pro W3 11Q 縦書き 綴じ方により位置が変化する)
myBackSignTextFrame = myDocument.masterSpreads.item(0).textFrames.add();
if(bindingStyle == 0)
myBackSignTextFrame.geometricBounds = [DocumentHeight + BLEED * 2 + 111, DocumentWidth + 1.375, DocumentHeight + BLEED * 2 + 28.5, DocumentWidth - 1.375];
else if(bindingStyle == 1)
myBackSignTextFrame.geometricBounds = [111, DocumentWidth + 1.375, 28.5, DocumentWidth - 1.375];
// 文字の大きさは11Q, 文字色黒で0.1mmの白フチ
with (myBackSignTextFrame) {
texts[0].pointSize = "11Q";
texts[0].strokeColor = colorWhite;
texts[0].fillColor = colorBlack;
texts[0].strokeWeight = 0.01;
contents = bookTitle;
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
}
myBackSignStory = myBackSignTextFrame.parentStory;
myBackSignStory.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

var impositionBounds = new Array(4);
impositionBounds[0] = [DocumentHeight * 2 + BLEED * 2, DocumentWidth, DocumentHeight + BLEED * 2 ,0];
impositionBounds[1] = [DocumentHeight * 2 + BLEED * 2, DocumentWidth * 2, DocumentHeight + BLEED * 2 ,DocumentWidth];
impositionBounds[2] = [DocumentHeight, DocumentWidth * 2, 0, DocumentWidth];
impositionBounds[3] = [DocumentHeight, DocumentWidth, 0, 0];

var impositionBoundsWithBleed = new Array(4);
impositionBoundsWithBleed[0] = [DocumentHeight * 2 + BLEED * 3 , DocumentWidth + BLEED, DocumentHeight + BLEED, -BLEED];
impositionBoundsWithBleed[1] = [DocumentHeight * 2 + BLEED * 3, DocumentWidth * 2 + BLEED, DocumentHeight + BLEED, DocumentWidth -BLEED];
impositionBoundsWithBleed[2] = [DocumentHeight + BLEED, DocumentWidth * 2 + BLEED, -BLEED, DocumentWidth - BLEED];
impositionBoundsWithBleed[3] = [DocumentHeight + BLEED, DocumentWidth + BLEED, -BLEED, -BLEED];

var impositionBoundsWithBleedOffset = new Array(4);
impositionBoundsWithBleedOffset[0] = [DocumentHeight * 2 + BLEED * 3 , DocumentWidth, DocumentHeight + BLEED, -BLEED];
impositionBoundsWithBleedOffset[1] = [DocumentHeight * 2 + BLEED * 3, DocumentWidth * 2 + BLEED, DocumentHeight + BLEED, DocumentWidth];
impositionBoundsWithBleedOffset[2] = [DocumentHeight + BLEED, DocumentWidth * 2 + BLEED, -BLEED, DocumentWidth];
impositionBoundsWithBleedOffset[3] = [DocumentHeight + BLEED, DocumentWidth, -BLEED, -BLEED];

var impRotaionAngleLeftBinding = new Array(0, 0, 180, 180);
var impRotaionAngleRightBinding = new Array(180, 180, 0, 0);

var i = 0;
var pageFlag = false;

// 1ページあたり4つの四角形オブジェクトを作り、PDFファイルを画像として貼り込む
while(i < totalPage) {
if((i + 1) % 2 == 0) {
// 偶数ページの処理
// マスターを「B-マスター」に設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("B-マスター");
// 合い番を入れる
myBackSignTextFrame3 = myDocument.pages[i].textFrames.add();
with (myBackSignTextFrame3) {
geometricBounds = [DocumentHeight * 2 + BLEED * 2 + 10, DocumentWidth + 46.0, DocumentHeight * 2 + BLEED * 2 + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 2) >>> 1) + foldingCount - 1) + "折ウラ";
}
} else {
// 奇数ページの処理
// マスターを「A-マスター(背丁有)」に設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("A-マスター(背丁有)");
// 折数を入れる(綴じ方により位置が変化する)
myBackSignTextFrame2 = myDocument.pages[i].textFrames.add();

if(bindingStyle == 0)
myBackSignTextFrame2.geometricBounds = [DocumentHeight + 131, DocumentWidth + 1.375, DocumentHeight + 120, DocumentWidth - 1.375];

else if(bindingStyle == 1)
myBackSignTextFrame2.geometricBounds = [131, DocumentWidth + 1.375, 120, DocumentWidth - 1.375];
// 文字の大きさは11Q, 文字色黒で0.1mmの白フチ
with (myBackSignTextFrame2) {
texts[0].pointSize = "11Q";
texts[0].strokeColor = colorWhite;
texts[0].fillColor = colorBlack;
texts[0].strokeWeight = 0.1;
contents = hankaku2kansuji(((i + 2) >>> 1) + foldingCount - 1) + "折";
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
}
myBackSignStory2 = myBackSignTextFrame2.parentStory;
myBackSignStory2.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

// 背標を入れる(綴じ方により位置が変化する)
myBackSignTextFrame4 = myDocument.pages[i].textFrames.add();
if(bindingStyle == 0)
myBackSignTextFrame4.geometricBounds = [DocumentHeight + 243.5, DocumentWidth + 1.375, DocumentHeight + 161, DocumentWidth - 1.375];
else if(bindingStyle == 1)
myBackSignTextFrame4.geometricBounds = [243.5, DocumentWidth + 1.375, 161, DocumentWidth - 1.375];
// 文字の大きさは11Q, 文字色黒で0.1mmの白フチ
with (myBackSignTextFrame4) {
texts[0].pointSize = "11Q";
texts[0].strokeColor = colorWhite;
texts[0].fillColor = colorBlack;
texts[0].strokeWeight = 0.1;
contents = sehyoGenerator(((i + 2) >>> 1) + foldingCount - 1);
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
paragraphs[0].justification = Justification.rightAlign;
}
myBackSignStory4 = myBackSignTextFrame4.parentStory;
myBackSignStory4.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

// 合い番を入れる
myBackSignTextFrame3 = myDocument.pages[i].textFrames.add();
with (myBackSignTextFrame3) {
geometricBounds = [DocumentHeight * 2 + BLEED * 2 + 10, DocumentWidth + 46.0, DocumentHeight * 2 + BLEED * 2 + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 2) >>> 1) + foldingCount - 1) + "折オモテ";
}
}

for(j = 0; j < 4; j++) {
// 画像配置のために四角形オブジェクト作成
myRectangle = myDocument.pages[i].rectangles.add();
//オブジェクトの属性を設定(線・塗りともに透明 グラフィック形式)
myRectangle.strokeColor = myDocument.swatches.item(0, 0, 0, 0);
myRectangle.fillColor = myDocument.swatches.item(0, 0, 0, 0);
myRectangle.contentType = ContentType.graphicType;

// 綴じ方によりPDFの配置角度を変化させる
if(bindingStyle == 0) myRectangle.absoluteRotationAngle = impRotaionAngleLeftBinding[j];
else if(bindingStyle == 1) myRectangle.absoluteRotationAngle = impRotaionAngleRightBinding[j];

// オブジェクトの位置、大きさを設定(ドブの有無により位置、大きさを変更)
if(bleedStatus == true)
myRectangle.geometricBounds = impositionBoundsWithBleed[j];
else
myRectangle.geometricBounds = impositionBounds[j];

// PDFデータをメディアサイズに設定
app.pdfPlacePreferences.pdfCrop = PDFCrop.cropMedia;

// PDFのページを設定(綴じ方によりページの順序が変化する)
if(bindingStyle == 0)
app.pdfPlacePreferences.pageNumber = (FILENUM[(i % 2)][j] + (i >>> 1) * 8) + pdfPageOffset - 1;
else
app.pdfPlacePreferences.pageNumber = (FILENUM2[(i % 2)][j] + (i >>> 1) * 8) + pdfPageOffset - 1;

//PDFファイルを四角形オブジェクトに貼り込む
if( (isNaN(app.version) ) && (parseInt(app.version) >= 5) )
myPdfObj = myRectangle.place(fileRef)[0]; // CS3以上
else
myPdfObj = myRectangle.place(fileRef); // CS, CS2

//塗り足し有りの場合、塗り足しが合わさった部分を削除する
if(bleedStatus == true) myRectangle.geometricBounds = impositionBoundsWithBleedOffset[j];

myRectangle.sendToBack();

// 指定した折数よりPDFファイルのページ数が少なかった時の処理はpageFlagフラグを立ててtrueにしてループを抜ける
if( (i > 0) && (myPdfObj.pdfAttributes.pageNumber == 1) ) {
pageFlag = true;
break;
}

}

// 品名をオーバーライド
if(i % 2 == 0) myDocument.pages[i].masterPageItems[0].override(myDocument.pages[i]);

// pageFlagがtrueならば最後のページを削除してループを抜ける
if(pageFlag == true) {
myDocument.pages[i].remove();
break;
}

i++;
if(i >= totalPage) break;

// ページを追加
myDocument.pages.add();
}
// 1ページ目に戻す
app.activeWindow.activePage = myDocument.pages[0];
}

//
// 背標(階段状)を生成する関数(1 <= arg <= 99)
//
// 11進数的動作を行う。引数が大きくなる度に一の位を示す■が移動する。
// ただし引数の一の位が1の時に繰り上がり、十の位を示す■が1つ増える。
//
function sehyoGenerator(arg) {
var str = "";
var i;
var x = new Array(2);

var n = arg.toString();
// 引数を十の位と一の位に分け、配列変数xに格納する。ただし引数が10以下ならば配列内で右詰め処理
if(arg < 10) {
x[0] = 0;
x[1] = eval(n.charAt(0));
} else {
x[0] = eval(n.charAt(0));
x[1] = eval(n.charAt(1));
}
// 引数が10の倍数ならば十の位を1減じて、一の位を10とする
if(x[1] == 0) {
x[0] -= 1;
x[1] = 10;
}
// 一の位を示す■を入れる
str = str + "■";
// 一の位の数だけ空白を入れる
for(i = 0; i < x[1]; i++) str = str + " ";
// 十の位を示す■と一の位を示す■を区別するための空白を入れる。(4 - 十の位の数)個だけ離している
for(i = 0; i < (4 - 1) - x[0] ; i++) str = str + " ";
// 十の位の数だけ■を入れる
for(i = 0; i <= x[0]; i++) str = str + "■";

return str;
}

//
// 半角数字を漢数字に変換する関数
// 0~9は〇~九、10~99は十~九十九、100以上は一〇〇…に変換
// 半角数字以外は無変換
//
function hankaku2kansuji(arg) {
var res = "";
var tmpString = "";
var tmpNum = 0;

arg += "";

// 数字以外の文字がある場合の処理
if(arg.match(/[^0-9]/)) {
for(tmpNum = 0; tmpNum < arg.length; tmpNum++) {
// 数字の場合の処理
if(arg[tmpNum].match(/[0-9]/)) {
tmpString += arg[tmpNum];
// 次の文字が数字でない場合、漢数字に変換する
if(arg[tmpNum + 1].match(/[0-9]/) == null) {
res += hankaku2kansuji_main(tmpString);
tmpString = "";
}
}
else
res += arg[tmpNum];
}
} else res = hankaku2kansuji_main(arg);

return res;
}

//
// 半角数字を漢数字に変換するメイン関数
// 0~9は〇~九、10~99は十~九十九、100以上は一〇〇…に変換
//
// 引 数:半角数字
// 戻り値:漢数字
//
function hankaku2kansuji_main(argNum) {
var kansuji = new Array("〇","一","二","三","四","五","六","七","八","九");
var res = "";
var tmpNum = 0;
// 1~9までの処理
if(Math.floor(argNum / 10) < 1) {
res = kansuji[(argNum)];
// 10~99までの処理
} else if( (tmpNum = Math.floor(argNum / 10) ) < 10) {
// 10のみの処理
if(argNum == 10)
res = "十";
// 11~19までの処理
else if(tmpNum <= 1)
res = "十" + kansuji[((argNum % 10) + "")[0]];
// 20~99までで10で割り切れる場合の処理
else if(argNum % 10 == 0)
res = kansuji[tmpNum] + "十";
else
res = kansuji[tmpNum] + "十" + kansuji[( (argNum % 10) + "")[0]];
// 100以上の処理
} else {
argNum = argNum + "";
for(tmpNum = 0; tmpNum < argNum.length; tmpNum++)
res += kansuji[argNum[tmpNum][0]];
}
return res;
}


//
// 半角数字を漢数字に変換する関数
//
//function hankaku2kansuji(arg) {
// var kansuji = new Array("〇","一","二","三","四","五","六","七","八","九");
// var str = "";
// var i;
// for (i = 0; i < arg.toString().length; i++) str = str + kansuji[arg.toString()[i]];
// return str;
//}
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


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

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