dポイントプレゼントキャンペーン実施中!

InDesignのスクリプトで自動化したいことがあり、試行錯誤しているのですが行き詰まってしまいました。アドバイスをいただけましたら幸いです。

【環境】
OS:Mac OS X 10.5.8
ソフト:InDesign CS3
ExtendScript Toolkit 2を使って、JavaScriptで作成

【したいこと】
・タテ310mm×ヨコ225mmの用紙に、タテ148mm×ヨコ105mmで作成したpdfデータ(複数ページ)を全ページ4面付(1ページにpdf1ページ目、2ページにpdf2ページ目…をそれぞれ4枚ずつ配置)したい
・配置場所はそれぞれの4角(右と左の画像間は15mm、上と下の画像間は14mm)

【今の状態】
pdfを呼び出す→指定サイズの新規ドキュメントを作る→左上にボックスをつくり、画像中央配置

filename = File.openDialog("Select Pdf");
if(filename)
{
startNum = 1;
endNum = parseInt(prompt("終了ページ","終了ページを入力"));
pageObj = app.documents.add();
pageObj.documentPreferences.pageWidth = "225mm";
pageObj.documentPreferences.pageHeight = "310mm";
for(i=startNum; i<=endNum; i++)
{
app.pdfPlacePreferences.pageNumber = i;
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = ["0mm","0mm","148mm","105mm"];
txtObj.place(filename);
txtObj.fit(FitOptions.frameToContent);
pageObj = app.activeDocument.pages.add();
}
}

これを4面配置できるようにしたく、ボックスを4つ配置したのですが、これだと最後のボックスにしかpdfが配置されませんでした。

boxdata = [
[0,0,105,148],
[0,120,225,148],
[162,0,105,310],
[162,120,225,310]
];
filename = File.openDialog("Select Pdf");
if(filename)
{
pageObj = app.documents.add();
pageObj.documentPreferences.pageWidth = "225mm";
pageObj.documentPreferences.pageHeight = "310mm";
for(i=0; i<boxdata.length; i++)
{
y1 = boxdata[i][0]+"mm";
x1 = boxdata[i][1]+"mm";
x2 = boxdata[i][2]+"mm";
y2 = boxdata[i][3]+"mm";
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = [y1,x1,y2,x2];
}
txtObj.place(filename);
txtObj.fit(FitOptions.frameToContent);
}

ボックスを4つ作るより、繰り返し複製したほうがいいのかともおもいましたが、書き方がわかりませんでした。
改良スクリプトと、できましたら今後の勉強のために、スクリプトの解説もいただけますと嬉しいです。よろしくお願いいたします。

A 回答 (3件)

どうもです。



>通常の仕事の流れでは、もともと分割されたPDFが入稿され、
>それを結合してプリンタに流す→プリンタ側で4面付、
>という感じで印刷していました。

>もう一台、低コストなプリンタがあるのですが
>4面付の機能がないため、いままで使用できませんでした。
>そちらのプリンタでなんとか印刷できないか、ということで
>自動化スクリプトを研究中なのです。

との事ならやはり「データ結合」が一番作業としては向いています。
前回の回答に書きました「コピー&ペースト」「PDF内の総ページ数」
の処理をどの様に演算させ、どのタイミングで動かすかを考慮する必要が要ります。
仕組み的に複雑になるが、希望する動作は単純動作なので「研究中」には向いてますが、実務には向いてないかと。
それにこのスクリプトはかなり難易度が高いと思います。

実務でははやり「データ結合」が良いでしょう。

必要データ
・InDesignドキュメント(225mm x 310mm)
  このドキュメント内にあらかじめ配置用画像ボックス4個を作成

・csvデータ
  シンプルテキストにて【1行目】に「@画像」と入力。
  2行目に「A 1.pdf」と入力。3行目以降は「A 2.pdf~最終ページし書類名「ページ情報.csv」として保存

・結合してるページデータを「A」とリネームしてからAcrobat Proで開き
 「文書/ページの抽出...」を選び全ページを選択後「ページを個別のファイルとして抽出」を
 チェック後「OK」をクリック。フォルダ「images」の作成してこのフォルダ内に作成する。


上記のデータが用意できた時点で下記の作業を行う

1.InDesignドキュメントを開く
2.ウィンドウ/自動化/データ結合 ボックスを開く。
3.ボックス内のオプションより「データソースを選択」で「ページ情報.csv」を選択
4.リスト内に「画像」が出てくるのでそのリストをページ内の画像ボックスにドラックで持って行き離す
5.画像ボックス内に「<<画像>>」と表示されてることを確認
6.オプションより「結合ドキュメントの作成」を選択する
7.設定ダイアログボックスが出るので
  結合するレコード → すべてのレコード
  ドキュメントページあたりのレコード → 単一レコード
  を選択後、OKをクリック
8.一時後、ページ内に同一PDFを4個配置したPDF個数分のページのドキュメントの完成


スクリプトで行うより簡単で確実です。
今回の作業はバッチ処理が最適と思われるので、この方法が良いと思います。

組み版などでインデザインドキュメント内でデザインを行う場合はスクリプトが便利です。
用途に合わせた使い方が良いと思います。

ちなみにスクリプトで処理を行う場合
繰り返し変数
for (変数名=0; 変数名<繰り返す回数; 変数名++)
{
繰り返す処理
}

>繰り返す回数=総ページ数の抽出
>繰り返す処理=PDF配置後指定位置3箇所にコピーペースト後、新規ページに移動

が必要なためかなり難易度が高い割に作業自体がシンプルという事になります。

一度ご確認下さい。
    • good
    • 0
この回答へのお礼

うっわー、ででできました!
CS3はインストールしてあるものの、
CS1をメインに使っているもので、『データ結合』を知りませんでした。
業務にはスクリプトではなく、こちらの機能を使おうとおもいます。

とてもわかりやすい解説で、勉強させていただきました。
どうもありがとうございました!

お礼日時:2011/11/08 17:00

#1です。


取りあえず今日開いた時間を使って簡単に作ってみました。
あくまで単ページでの表示です。

docObj = app . documents . add () ; //新規ドキュメントの作成
docObj . documentPreferences . pageWidth = 225 ; //ドキュメントの横幅
docObj . documentPreferences . pageHeight = 310 ; //ドキュメントの縦幅
filename = File.openDialog("配置するPDFを選択してください"); //配置データの選択
imageX = 0; //配置データの横軸座標
imageY = 0; //配置データの縦軸座標
unit = "mm" //入力単位
pageNo = 0; //スタートページ
pageObj = app.activeDocument.pages[pageNo]; //1ページ目よりスタート


if (filename){
app.pdfPlacePreferences.pageNumber = 1; //PDFページ番号
imgObj = pageObj.textFrames.add(); //新規テキストフレーム作成
imgObj.move([imageX+unit,imageY+unit]); //スタートテキストボックスの配置位置
imgObj.visibleBounds = [ 0 , 0 , 148 , 105 ]; //左上の画像座標
imgObj.place(filename);

app.pdfPlacePreferences.pageNumber = 1; //PDFページ番号
imgObj = pageObj.textFrames.add(); //新規テキストフレーム作成
imgObj.move([imageX+unit,imageY+unit]); //スタートテキストボックスの配置位置
imgObj.visibleBounds = [ 0 , 120 , 148 , 225 ]; //右上の画像座標
imgObj.place(filename);

app.pdfPlacePreferences.pageNumber = 1; //PDFページ番号
imgObj = pageObj.textFrames.add(); //新規テキストフレーム作成
imgObj.move([imageX+unit,imageY+unit]); //スタートテキストボックスの配置位置
imgObj.visibleBounds = [ 162 , 0 , 310 , 105 ]; //左下の画像座標
imgObj.place(filename);

app.pdfPlacePreferences.pageNumber = 1; //PDFページ番号
imgObj = pageObj.textFrames.add(); //新規テキストフレーム作成
imgObj.move([imageX+unit,imageY+unit]); //スタートテキストボックスの配置位置
imgObj.visibleBounds = [ 162 , 120 , 310 , 225 ]; //右下の画像座標
imgObj.place(filename);

}


このスクリプトを書きながら問題点が出てきました。
お望みの事を行うなら
・PDF内のページを1つ貼り付けた後、コピーペーストで4つの配置にすること。
・上記の作業をPDF内のページ数分行うこと。
の2つの演算が必要です。
それに加えページでの処理になるので各ページを処理する毎にPDF解析を行います。
PDFデータが仮に100Mの100ページなら単純計算で100Mの処理100回です。
処理時間的に不満が残るのでは無いでしょうか?

それで一つ思ったのですが、PDFデータのページ分割は可能でしょうか?
もし可能ならもっと簡単に行える「データ結合」がありますが・・・

中間報告です ご参考に!
    • good
    • 0
この回答へのお礼

【PDFの分割について】
可能です。
えっと、印刷会社勤務なのですが、
通常の仕事の流れでは、もともと分割されたPDFが入稿され、
それを結合してプリンタに流す→プリンタ側で4面付、
という感じで印刷していました。

もう一台、低コストなプリンタがあるのですが
4面付の機能がないため、いままで使用できませんでした。
そちらのプリンタでなんとか印刷できないか、ということで
自動化スクリプトを研究中なのです。

作っていただいたスクリプト、動作確認してみました。
これが全ページ自動で貼れたら最高です。
参考にさせていただきつつ、改良していきたいとおもいます!
ありがとうございました!

お礼日時:2011/11/07 10:45

確認ですが


1P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│1││8│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│4││5│┃
┃└─┘└─┘┃
┗━━━━━━┛
2P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│7││2│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│6││3│┃
┃└─┘└─┘┃
┗━━━━━━┛
を目指してるのか?
それとも
1P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│1││4│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│5││8│┃
┃└─┘└─┘┃
┗━━━━━━┛
2P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│3││2│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│7││6│┃
┃└─┘└─┘┃
┗━━━━━━┛
を目指してるのか?
どちらですか?

上記の内容を踏まえて一つ質問です。
・読み込もうとしてるPDFのページ数のMAXは?
・両面印刷と思えるので必ず8の倍数で完結しますか?

教えて下さい。

この回答への補足

ご覧いただきありがとうございます。
目指しているのは、

1P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│1││1│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│1││1│┃
┃└─┘└─┘┃
┗━━━━━━┛
2P
┏━━━━━━┓
┃┌─┐┌─┐┃
┃│2││2│┃
┃└─┘└─┘┃
┃┌─┐┌─┐┃
┃│2││2│┃
┃└─┘└─┘┃
┗━━━━━━┛

です。プリンタの『4リピート』と考えるとお分かりいただけるかもしれません。
言葉が足らず申し訳ありませんでした。

PDFページのMAXは300Pですが、枚数は場合によります。
おっしゃるとおり両面印刷用の面付けですので、必ず2の倍数です。
プリンタ出力で『折り』はありませんので、8の倍数とは限りません。

補足日時:2011/11/03 12:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!