印刷機関連開発              2022/6
Indesign上でPDFファイルを自動的に配置する=オンデマンド用javaScript

ここでは、すでにIndesignに用意されているサンプルスクリプトを基本にして、オンデマンドなどで利用しやすいように改良してみました。ちなみに、テストしたのはIndesign CS3です。
基本としたjavaスクリプトは、「PlaceMultipagePDF.jsx」で、これは「PDFのすべてのページを配置する」というものです。
(https://helpx.adobe.com/jp/indesign/using/scripting.html参照)
ただし、このスクリプトは直接ページに貼り付けているので、少し自由度が悪い気がします。そこでテキストフレーム内にPDFを配置してみることにしました。このようにするとトリミングもできるし、回転も自由です。

まず、オンデマンド用の用紙サイズにあわせてIndesignで台紙ドキュメントを作成しておきます。
ここでは4面付けのスクリプトを試作してみましたが、このスクリプトの最初の部分に設定箇所があるので、この部分を適宜編集して使います。
オンデマンドで出力したら、用紙の真ん中で断裁していけばそのまま製本にかけられるようになっています。(下部に3mmのドブがとってあります。)




●javaScript

// 設定 //////////////////////////////////////

var paperSizeX = 312; //紙の短辺
var paperSizeY = 438; //紙の長辺

var bookSizeX = 148; //本の短辺
var bookSizeY = 210; //本の長辺

var toji = 3; //綴じ方 1:右綴じ(縦書き) 2:中央配置 3:左綴じ(横書き)

///////////////////////////////////////////////


var myPDFFile = File.openDialog("Choose a PDF File"); //PDFファイルの選択

//メイン
if((myPDFFile != "")&&(myPDFFile != null)){
myKakunin();

var myDocument = app.activeDocument;
var myPage = myChoosePage(myDocument);

if(toji == 1){
myPlacePDF1(myDocument, myPage, myPDFFile);
}
else if(toji == 2){
myPlacePDF2(myDocument, myPage, myPDFFile);
}
else if(toji == 3){
myPlacePDF3(myDocument, myPage, myPDFFile);
}
else {
alert("error toji");
}
}

//設定確認 https://dtpscriptin.com/gui-button/
function myKakunin(){
var objDlg = new Window ("dialog", "設定確認", [0,0,400,250]);

objDlg.add("statictext", [20,20,300,40], "紙の短辺: " + paperSizeX);
objDlg.add("statictext", [20,40,300,60], "紙の長辺: " + paperSizeY);

objDlg.add("statictext", [20,80,300,100], "本の短辺: " + bookSizeX);
objDlg.add("statictext", [20,100,300,120], "本の長辺: " + bookSizeY);

objDlg.add("statictext", [20,140,350,160], "綴じ方: " + toji + "  1:右綴じ(縦書き) 2:中央配置 3:左綴じ(横書き)");

objDlg.add("button", [100, 200, 200, 220], "中止", {name:"cancel"});
objDlg.add("button", [250, 200, 350, 220], "OK", {name:"ok"});

// ダイアログを画面のセンター表示
objDlg.center();
var rtType = objDlg.show();

if (rtType==2){ //cancelのとき  okのときはrtType==1となる
exit(); //ここでプログラムを終了させるためには「ESC」キーあるいはダイアログ画面の×でもできる
}
}

//indesignのどのページから貼り付ける始めるか選択する
function myChoosePage(myDocument){
var myPageNames = new Array;
//Get the names of the pages in the document
for(var myCounter = 0; myCounter < myDocument.pages.length;myCounter++){
myPageNames.push(myDocument.pages.item(myCounter).name);
}
var myChoosePageDialog = app.dialogs.add({name:"Choose a Page", canCancel:false});
with(myChoosePageDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Place PDF on:"});
}
with(dialogColumns.add()){
var myChoosePageDropdown = dropdowns.add({stringList:myPageNames, selectedIndex:0});
}
}
}
myChoosePageDialog.show();
var myPage = myDocument.pages.item(myChoosePageDropdown.selectedIndex);
myChoosePageDialog.destroy();
return myPage;
}

//配置開始
//1:右綴じ(縦書き)
function myPlacePDF1(myDocument, myPage, myPDFFile){
var x11 = paperSizeX/2 - bookSizeX;
var y11 = paperSizeY/2 - bookSizeY - 3;
var x12 = paperSizeX/2;
var y12 = 3;
var x21 = paperSizeX/2 - bookSizeX;
var y21 = paperSizeY - bookSizeY - 3;
var x22 = paperSizeX/2;
var y22 = paperSizeY/2 + 3;

var x11b = paperSizeX/2 - bookSizeX;
var y11b = 3;
var x12b = paperSizeX/2;
var y12b = paperSizeY/2 - bookSizeY - 3;
var x21b = paperSizeX/2 - bookSizeX;
var y21b = paperSizeY/2 + 3;
var x22b = paperSizeX/2;
var y22b = paperSizeY - bookSizeY - 3;

var myPDFPage;
var myFrame;

app.pdfPlacePreferences.pdfCrop = PDFCrop.cropMedia;
var myCounter = 1;
var myBreak = false;
app.activeWindow.transformReferencePoint = AnchorPoint.CENTER_ANCHOR; //基準点を中心にしておく(そうでないとうまく回転できない)
while(myBreak == false){
if(myCounter > 1){
myPage = myDocument.pages.add(LocationOptions.after, myPage); //indesignページを1つ増やし、myPageをそのページに変更
}
if( myCounter % 2 !== 0 ) { //奇数ページ
app.pdfPlacePreferences.pageNumber = myCounter; //PDFファイルのページをmyCounterに設定する
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y11, x11, y11+bookSizeY, x11+bookSizeX];
myPDFPage = myFrame.place(myPDFFile)[0]; //CS3以上 //このmyPDFPageは後で使う(次のif文)
//myPDFPage = myFrame.place(myPDFFile); //CS2
myFrame.fit(FitOptions.centerContent); //内容を中央に合わせる
//内容を中央に合わせる   FitOptions.centerContent
//フレームを内容に合わせる FitOptions.frameToContent
//内容をフレーム内に収める FitOptions.proportionally
//内容をフレームに合わせる FitOptions.contentToFrame

//フレームのサイズを再設定するとトリミングもできる myFrame.visibleBounds = [y11+a, x11+b, y11+bookSizeY+c, x11+bookSizeX+d];

app.pdfPlacePreferences.pageNumber = myCounter; //その都度ページをmyCounterに設定し直さないと、1ページにもどってしまう
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y12, x12, y12+bookSizeY, x12+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180; //回転

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y21, x21, y21+bookSizeY, x21+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y22, x22, y22+bookSizeY, x22+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;
}else{ //偶数ページ
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y11b, x11b, y11b+bookSizeY, x11b+bookSizeX];
myPDFPage = myFrame.place(myPDFFile)[0];
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y12b, x12b, y12b+bookSizeY, x12b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y21b, x21b, y21b+bookSizeY, x21b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y22b, x22b, y22b+bookSizeY, x22b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
}

if(myCounter == 1){
var myFirstPage = myPDFPage.pdfAttributes.pageNumber;
}
else{
if(myPDFPage.pdfAttributes.pageNumber == myFirstPage){
myPage.remove();
myBreak = true;
}
}
myCounter = myCounter + 1;
}
}

//2:中央配置
function myPlacePDF2(myDocument, myPage, myPDFFile){
var x11 = (paperSizeX/2 - bookSizeX)/2;
var y11 = (paperSizeY/2 - bookSizeY)/2;
var x12 = paperSizeX/2 + (paperSizeX/2 - bookSizeX)/2;
var y12 = (paperSizeY/2 - bookSizeY)/2;
var x21 = (paperSizeX/2 - bookSizeX)/2;
var y21 = paperSizeY/2 + (paperSizeY/2 - bookSizeY)/2;
var x22 = paperSizeX/2 + (paperSizeX/2 - bookSizeX)/2;
var y22 = paperSizeY/2 + (paperSizeY/2 - bookSizeY)/2;

var myPDFPage;
var myFrame;
app.pdfPlacePreferences.pdfCrop = PDFCrop.cropMedia;
var myCounter = 1;
var myBreak = false;
while(myBreak == false){
if(myCounter > 1){
myPage = myDocument.pages.add(LocationOptions.after, myPage);
}
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y11, x11, y11+bookSizeY, x11+bookSizeX];
myPDFPage = myFrame.place(myPDFFile)[0];
myFrame.fit(FitOptions.centerContent);
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y12, x12, y12+bookSizeY, x12+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y21, x21, y21+bookSizeY, x21+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y22, x22, y22+bookSizeY, x22+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
if(myCounter == 1){
var myFirstPage = myPDFPage.pdfAttributes.pageNumber;
}
else{
if(myPDFPage.pdfAttributes.pageNumber == myFirstPage){
myPage.remove();
myBreak = true;
}
}
myCounter = myCounter + 1;
}
}

//3:左綴じ(横書き)
function myPlacePDF3(myDocument, myPage, myPDFFile){
var x11b = paperSizeX/2 - bookSizeX;
var y11b = paperSizeY/2 - bookSizeY - 3;
var x12b = paperSizeX/2;
var y12b = 3;
var x21b = paperSizeX/2 - bookSizeX;
var y21b = paperSizeY - bookSizeY - 3;
var x22b = paperSizeX/2;
var y22b = paperSizeY/2 + 3;

var x11 = paperSizeX/2 - bookSizeX;
var y11 = 3;
var x12 = paperSizeX/2;
var y12 = paperSizeY/2 - bookSizeY - 3;
var x21 = paperSizeX/2 - bookSizeX;
var y21 = paperSizeY/2 + 3;
var x22 = paperSizeX/2;
var y22 = paperSizeY - bookSizeY - 3;

var myPDFPage;
var myFrame;

app.pdfPlacePreferences.pdfCrop = PDFCrop.cropMedia;
var myCounter = 1;
var myBreak = false;
app.activeWindow.transformReferencePoint = AnchorPoint.CENTER_ANCHOR; //基準点を中心にしておく(そうでないとうまく回転できない)
while(myBreak == false){
if(myCounter > 1){
myPage = myDocument.pages.add(LocationOptions.after, myPage);
}
if( myCounter % 2 !== 0 ) { //奇数ページ
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y11, x11, y11+bookSizeY, x11+bookSizeX];
myPDFPage = myFrame.place(myPDFFile)[0];
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y12, x12, y12+bookSizeY, x12+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y21, x21, y21+bookSizeY, x21+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y22, x22, y22+bookSizeY, x22+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
}else{ //偶数ページ
app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y11b, x11b, y11b+bookSizeY, x11b+bookSizeX];
myPDFPage = myFrame.place(myPDFFile)[0];
myFrame.fit(FitOptions.centerContent);

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y12b, x12b, y12b+bookSizeY, x12b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y21b, x21b, y21b+bookSizeY, x21b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);

app.pdfPlacePreferences.pageNumber = myCounter;
myFrame = myPage.textFrames.add();
myFrame.visibleBounds = [y22b, x22b, y22b+bookSizeY, x22b+bookSizeX];
myFrame.place(myPDFFile);
myFrame.fit(FitOptions.centerContent);
myFrame.rotationAngle = 180;
}

if(myCounter == 1){
var myFirstPage = myPDFPage.pdfAttributes.pageNumber;
}
else{
if(myPDFPage.pdfAttributes.pageNumber == myFirstPage){
myPage.remove();
myBreak = true;
}
}
myCounter = myCounter + 1;
}
}

ダウンロード