スポンサーサイト

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

PDFデータを8ページ折りで面付するスクリプト(2UPバージョン)

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

//
// PDFデータを8P本掛で面付し、2ページずつ出力するスクリプト
//

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

var ImpsitionBounds = new Array(2);

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

myDisplayDialog();

function myDisplayDialog() {
myDialog = app.dialogs.add( {name:"PDF8ページ本掛/2P出力スクリプト"} );
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;
totalPage = (eval(myIntEBox3.editContents) - eval(myIntEBox2.editContents) + 1) * 4;
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();

//ドキュメントサイズを設定(横2倍 単ページ表示 左綴じ 横置き 印刷可能範囲:天地左右20mm)
with (myDocument.documentPreferences) {
pageWidth = DocumentWidth * 2;
pageHeight = DocumentHeight;
facingPages = false;
pageBinding = PageBindingOptions.leftToRight;
pageOrientation = PageOrientation.landscape;
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;

//ガイドライン作成
verticalGuidelineBound = new Array(DocumentWidth / 2, DocumentWidth, DocumentWidth * 1.5);
//横に1本
myGuide = myDocument.masterSpreads.item(0).guides.add();
myGuide.orientation = HorizontalOrVertical.horizontal;
myGuide.location = DocumentHeight / 2;
myGuide.fitToPage = true;
//縦に3本
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-マスターの名前を設定(マスター(背丁有))
app.activeDocument.masterSpreads[0].baseName = "マスター(背丁有)";
//マスターを複製し名前を設定(B-マスター)
app.activeDocument.masterSpreads[0].duplicate();
app.activeDocument.masterSpreads[1].baseName = "マスター";
app.activeDocument.masterSpreads[1].namePrefix = "B"

//マスターAに背丁タイトルを入れる(小塚明朝Pro R 11Q 縦書き)
myBackSignTextFrame = myDocument.masterSpreads.item(0).textFrames.add();
with (myBackSignTextFrame) {
geometricBounds = [111, DocumentWidth + 1.375, 28.5, DocumentWidth - 1.375];
texts[0].pointSize = "11Q";
contents = bookTitle;
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
}
myBackSignStory = myBackSignTextFrame.parentStory;
myBackSignStory.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

//
//総ページ数をPDFのページ数取得からダイアログの折数入力で取得する方法に
//変更したため不要になった。
//
// //読み込んだPDFファイルの総ページ数を調べる
// pdfPageNum = 1;
// while (true) {
// app.pdfPlacePreferences.pageNumber = pdfPageNum;
// myRectangle = myDocument.pages[0].rectangles.add();
// myRectangle.geometricBounds = ImpsitionBounds[0];
// var pdfObj = myRectangle.place(fileRef);
// if ((pdfPageNum > 1) && (pdfObj.pdfAttributes.pageNumber == 1)) {
// break;
// }
// myRectangle.remove();
// pdfPageNum++;
// }
// //ループを1回多く回るので四角を削除して、pdfPageNumを1減ずる
// myRectangle.remove();
// pdfPageNum--;
//
// //PDFのページ数が偶数か奇数で処理を変え台紙の枚数を割り出す
// if(pdfPageNum % 2 == 1)
// totalPage = (pdfPageNum + 1) / 2;
// else
// totalPage = pdfPageNum / 2;
//
//

//総ページ数を指定する
// myDocument.documentPreferences.pagesPerDocument = totalPage;

//1ページあたり2つの四角形オブジェクトを作り、PDFファイルを画像として貼り込む

var i = 0;
var pageFlag = false;

while(i < totalPage) {
//合い番を入れる
myBackSignTextFrame3 = myDocument.pages[i].textFrames.add();
switch( (i + 1) % 4 ) {
case 0:
//マスターを設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("B-マスター");
//合い番を設定
with (myBackSignTextFrame3) {
geometricBounds = [DocumentHeight + 10, DocumentWidth + 46.0, DocumentHeight + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折ウラB";
}
break;

case 1:
//マスターを「A-マスター(背丁有)」に設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("A-マスター(背丁有)");

//折数を入れる
myBackSignTextFrame2 = myDocument.pages[i].textFrames.add();
with (myBackSignTextFrame2) {
geometricBounds = [131, DocumentWidth + 1.375, 120, DocumentWidth - 1.375];
texts[0].pointSize = "11Q";
contents = hankaku2kansuji(((i + 4) >>> 2) + foldingCount - 1) + "折";
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
}
myBackSignStory2 = myBackSignTextFrame2.parentStory;
myBackSignStory2.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

//背標を入れる
myBackSignTextFrame4 = myDocument.pages[i].textFrames.add();
with (myBackSignTextFrame4) {
geometricBounds = [243.5, DocumentWidth + 1.375, 161, DocumentWidth - 1.375];
texts[0].pointSize = "11Q";
contents = sehyoGenerator(((i + 4) >>> 2) + foldingCount - 1);
paragraphs[0].appliedFont = myDefaultFont;
paragraphs[0].fontStyle = "R";
paragraphs[0].justification = Justification.rightAlign;
}
myBackSignStory4 = myBackSignTextFrame4.parentStory;
myBackSignStory4.storyPreferences.storyOrientation = HorizontalOrVertical.vertical;

//合い番を設定(綴じ方により表示位置を変更)
with (myBackSignTextFrame3) {
if(bindingStyle == 0) {
geometricBounds = [DocumentHeight + 10, DocumentWidth + 46.0, DocumentHeight + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折オモテA";
} else if(bindingStyle == 1) {
geometricBounds = [-6, DocumentWidth - 46.0, -10, DocumentWidth - 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折オモテA";
paragraphs[0].justification = Justification.rightAlign;
}
}
break;

case 2:
//マスターを設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("B-マスター");

//合い番を設定
with (myBackSignTextFrame3) {
geometricBounds = [DocumentHeight + 10, DocumentWidth + 46.0, DocumentHeight + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折オモテB";
}
break;

case 3:
//マスターを設定
myDocument.pages.item(i).appliedMaster = myDocument.masterSpreads.item("B-マスター");

//合い番を設定(綴じ方により表示位置を変更)
with (myBackSignTextFrame3) {
if(bindingStyle == 0) {
geometricBounds = [DocumentHeight + 10, DocumentWidth + 46.0, DocumentHeight + 6, DocumentWidth + 18.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折ウラA";
} else if(bindingStyle == 1) {
geometricBounds = [-6, DocumentWidth - 46.0, -10, DocumentWidth - 22.0];
texts[0].pointSize = "16Q";
contents = (((i + 4) >>> 2) + foldingCount - 1) + "折ウラA";
paragraphs[0].justification = Justification.rightAlign;
}
}
break;

default:
break;
}

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

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

for(j = 0; j <= 1; j++) {
//画像配置のために四角形オブジェクト作成
myRectangle = myDocument.pages[i].rectangles.add();

//オブジェクトの属性を設定(線・塗りともに透明 グラフィック形式 回転角0°)
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 = 0;
} else if(bindingStyle == 1) {
if(i % 2 == 0)
myRectangle.absoluteRotationAngle = 0;
else
myRectangle.absoluteRotationAngle = 180;
}

//オブジェクトの位置、大きさを設定(塗り足しの有無により位置、大きさを変更)
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 % 4)][j] + (i >>> 2) * 8) + pdfPageOffset - 1;
else if(bindingStyle == 1)
app.pdfPlacePreferences.pageNumber = (FILENUM2[(i % 4)][j] + (i >>> 2) * 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) && (j == 0) )
myRectangle.geometricBounds = ([DocumentHeight + BLEED, DocumentWidth, -BLEED, -BLEED]);
else if( (bleedStatus == true) && (j == 1) )
myRectangle.geometricBounds = ([DocumentHeight + BLEED, DocumentWidth * 2 + BLEED, -BLEED, DocumentWidth]);

myRectangle.sendToBack();

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

//品名をオーバーライド
if(i % 4 == 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)
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;
}

//
//半角数字を漢数字に変換する関数
//
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;
}



//半角数字を漢数字に変換する関数
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;
}

//
//この方式は99までしかできないのでヤメ
//
//function hankaku2kansuji(arg) {
// var kansuji = new Array("〇","一","二","三","四","五","六","七","八","九");
// var str = "";
// if(arg < 10) return kansuji[arg];
// else if(arg % 10 == 0) return (kansuji[(arg + "")[0]] + "十");
// else if((arg >= 11) && (arg < 20)) return ("十" + kansuji[(arg + "")[1]]);
// else if(arg < 100) return (kansuji[(arg + "")[0]] + "十" + kansuji[(arg + "")[1]]);
//}
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


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

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