リンクをクリップボードにコピー
コピー完了
お世話になります。
今、Illustratorへ複数ページのPDFの配置を行なっています。
ページ毎に異なるアートボードへ配置し(1ページ目はアートボード1、2ページ目はアートボード2と固定です)、間隔を調整したい(アートボード1と2で異なる数字ではない)のですが、どうしても同じ位置にしか配置してくれません。
ネットで検索したり、ChatGTPを頼ったり色々しているのですが、うまくいきません。
どうしたら、位置が動いてくれるのでしょうか?
どなたかご教授くださいませ。
// 複数のPDFファイルを選択
var fileObjs = File.openDialog("PDFを選択してください", "*.pdf", true);
var pdfOptions = app.preferences.PDFFileOptions;
pdfOptions.pDFCropToBox = PDFBoxType.PDFMEDIABOX;
var pt = 2.83465;
var pageW = 91 * pt; // ページの幅
var pageH = 55 * pt; // ページの高さ
var xmargin = 10 * pt; // ページ間のマージン
var ymargin = 3 * pt; // ページ間のマージン
var spreadcount = 2; // 何ページごとに改行するか
if(fileObjs) {
for (var f = 0; f < fileObjs.length; f++) {
var fileObj = fileObjs[f];
var pdfPages = 2; // PDFのページ数
for(var p = 0; p < pdfPages; p++){
// アートボードを選択(pをインデックスとして使用)
var artboardIndex = p; // PDFの1ページ目をアートボード1に、2ページ目をアートボード2に
if(artboardIndex < app.activeDocument.artboards.length) {
var artboard = app.activeDocument.artboards[artboardIndex];
var artboardRect = artboard.artboardRect; // アートボードの左上隅を基準に配置
var startX = artboardRect[0]+ 5.996 * pt; // 開始X座標をアートボードに合わせて調整
var startY = artboardRect[1] - 1.996 * pt; // 開始Y座標をアートボードに合わせて調整
var myX1 = startX; // 現在のX座標
var myY1 = startY; // 現在のY座標
pdfOptions.pageToOpen = p + 1; // PDFのページを開く
var myImage = app.activeDocument.placedItems.add();
myImage.file = fileObj;
myImage.left = myX1; // X座標をアートボードに合わせて設定
myImage.top = myY1; // Y座標をアートボードの上辺に合わせて設定
myX1 += pageW + xmargin; // X座標を更新
if(((p + 1) % spreadcount == 0) || (p == pdfPages - 1)){
myX1 = startX; // X座標を初期位置にリセット
myY1 -= pageH + ymargin; // Y座標を更新(下に移動)
}
}
}
}
pdfOptions.pageToOpen = 1; // 最後に設定をデフォルトに戻す
} else {
alert("ファイルが選択されませんでした。");
}
作業環境
MacOS10.14.6
Illustrator2020
処理を追ってコメントを入れてみました。
これで問題点が見えましたね。
var startX = artboardRect[0]+ 5.996 * pt; // 開始X座標をアートボードに合わせて調整
var startY = artboardRect[1] - 1.996 * pt; // 開始Y座標をアートボードに合わせて調整
// ↓ ここで定義しているせいで、下の(※1)(※2)が無意味となっている
var myX1 = startX; // 現在のX座標
var myY1 = startY; // 現在のY座標
pdfOptions.pageToOpen = p + 1; // PDFのページを開く
var myImage = app.activeDocument.placedItems.add();
myImage.file = fileObj;
// この時点で myX1 は startX と全く同じ値である。myY1 も同様。
// 次の処理では myX1 をmyImageの座標に代入している。ここは startX をそのまま使っても構わない。
// 言い
...
リンクをクリップボードにコピー
コピー完了
すこしくわしくおしえてください。
>間隔を調整したい(アートボード1と2で異なる数字ではない)
ここがよくわかりません。
・PDFは全ページ同じサイズである
・アートボードは全て同じサイズである
・PDFはアートボードの左上隅に合わせて配置したい
・アートボード間の間隔を制御したい
で合っていますか?
リンクをクリップボードにコピー
コピー完了
早速のお返事ありがとうございます。
・PDFは全ページ同じサイズである → はい。そうです
・アートボードは全て同じサイズである → はい。そうです
・PDFはアートボードの左上隅に合わせて配置したい → アートボード2は最終的には右上基準にしたいですが、とりあえず並べたいと思いまして…。
・アートボード間の間隔を制御したい →アートボード間ではなく、配置したそれぞれの画像の間です。
どうぞよろしくお願いいたします。
リンクをクリップボードにコピー
コピー完了
ほかのお二方が出てきた(片方は師匠、片方は弟子だけど実力は自分が一番下)ので
自分はあと見守る予定ですけど、
以下は我々が共通して知りたいことだと思うので、回答ください。
・この仕事に使えるスクリプトが完成すればいい(完成品だけほしい)
・この仕事に使えるスクリプトを自分で書けるようになりたい(説明もほしい)
どちらでしょう?
また、どちらにしても、整った要件定義は必須です。
自動化は、何がしたいのかを完璧に伝えられないと進みません。要件を履き違えたままスクリプトを書いてあげて「どうでしょう」「だめでした」だと、お互いに無駄な労力と心労を負うことになります。
手作業で仕事を完成させた状態のスクリーンショットでもけっこうですし、なにか工夫して伝えてみてください。
リンクをクリップボードにコピー
コピー完了
ajabon grinsmith様
再度のご回答ありがとうございます。
おっしゃっておられること、ごもっともです。申し訳ありません。
完成予定図は、添付させていただきました。
また、今の私の置かれた状況からは、
・この仕事に使えるスクリプトが完成すればいい(完成品だけほしい)
が一番正しいです(作業開始まであまり時間がないもので)。
本来は、「・この仕事に使えるスクリプトを自分で書けるようになりたい(説明もほしい)」の方が、将来のためにもなるので理想的なのですが…。
教えていただいた説明書きは本当に嬉しかったです。
今、一生懸命試しているのですが、まだ思った通りの動きをしてくれません。
リンクをクリップボードにコピー
コピー完了
完成図ありがとうございます。半分ほど把握できました。
面付けというより、単面の付け合わせ出力ですね。
すみませんまだわからないことがあります。
・PDFの頁はきっちり20頁?
・PDFの内容は、1オモテ、1ウラ、2オモテ…の順?
・目標は単一ドキュメント?それとも 2台目以上あって連続でやりたい?
場合によっては、スクリプトで全頁貼るだけ貼ってから、整列パネルの「等間隔に分布」などの半自動でも足りそうな気もするですが、せっかくスクリプトに触れてみようというきっかけを作ったことは大事にしたいですね。
それと、完成品を誰かに書いてもらおうというなら、アートボード、ページ、間隔などの寸法図は必須ですよね。ミリメートルですよね?
スクリプトからとりとめのない値を拾ってpoint→mm換算もできそうですが、そこまでいったらもうこちらとしてはお仕事になってしまいます。
リンクをクリップボードにコピー
コピー完了
ご返信ありがとうございます。
ひとまず、いただいたご助言を元に、なんとか完成いたしました。(色々ツッコミどころがあると思いますが、とりあえず動くので良しとしてください)
本当にありがとうございました。
リンクをクリップボードにコピー
コピー完了
今、Illustratorへ複数ページのPDFの配置を行なっています。
ページ毎に異なるアートボードへ配置し(1ページ目はアートボード1、2ページ目はアートボード2と固定です)、間隔を調整したい(アートボード1と2で異なる数字ではない)のですが、どうしても同じ位置にしか配置してくれません。
スクリプトを試してみましたが、既に存在するアートボードにPDFを配置するスクリプト、ということですよね。
動作の確認ですが、最初のアートボードにPDFの1ページ目、次のアートボードに2ページ目を配置する(2ページまでを想定)というスクリプトかと思います。
それで、間隔を調整したいというのは、アートボードとアートボードの間の距離を調整したいということでしょうか?
スクリプトの動作から察するに、最初からアートボードを自分で作っておく必要があり、配置されるPDFの距離は作成する時のアートボードの位置に依存していますよね。
自分でアートボードを作るけど、スクリプトで指定した間隔になるようにアートボードを移動したい、ということでしょうか?
リンクをクリップボードにコピー
コピー完了
早速のご回答ありがとうございます。
アートボードはすでに作成している状態です。(フォーマットがありますので)
すでにアートボードはあり、そこにアイテムを指定した間隔で配置したいのです。
言葉足らずで申し訳ございません。
どうぞよろしくお願いいたします。
リンクをクリップボードにコピー
コピー完了
処理を追ってコメントを入れてみました。
これで問題点が見えましたね。
var startX = artboardRect[0]+ 5.996 * pt; // 開始X座標をアートボードに合わせて調整
var startY = artboardRect[1] - 1.996 * pt; // 開始Y座標をアートボードに合わせて調整
// ↓ ここで定義しているせいで、下の(※1)(※2)が無意味となっている
var myX1 = startX; // 現在のX座標
var myY1 = startY; // 現在のY座標
pdfOptions.pageToOpen = p + 1; // PDFのページを開く
var myImage = app.activeDocument.placedItems.add();
myImage.file = fileObj;
// この時点で myX1 は startX と全く同じ値である。myY1 も同様。
// 次の処理では myX1 をmyImageの座標に代入している。ここは startX をそのまま使っても構わない。
// 言い換えると myX1 を宣言した意味がない。
myImage.left = myX1; // X座標をアートボードに合わせて設定
myImage.top = myY1; // Y座標をアートボードの上辺に合わせて設定
// ↑ myImage を移動した。そのあと ↓ myX1の値を変えた。
myX1 += pageW + xmargin; // X座標を更新(※1)
// ↓ X座標リセット、Y座標を下にずらす、を2ページごとに行う(※2)
if(((p + 1) % spreadcount == 0) || (p == pdfPages - 1)){
myX1 = startX; // X座標を初期位置にリセット
myY1 -= pageH + ymargin; // Y座標を更新(下に移動)
はじめの座標の定義をループの中で行なっているせいで、
つぎのページの処理が始まるたんびに下のほうでいじっておいた値が台無しになっている、
という見解です。
リンクをクリップボードにコピー
コピー完了
返信が遅くなり、誠に申し訳ございません。
出来ました!
ループ内で行なっている、というご助言を元に、色々試行錯誤して、なんとか希望通りに出来上がりました。
// 複数のPDFファイルを選択
var fileObjs = File.openDialog("PDFを選択してください", "*.pdf", true);
var pdfOptions = app.preferences.PDFFileOptions;
pdfOptions.pDFCropToBox = PDFBoxType.PDFMEDIABOX;
var pt = 2.83465;
var pageW = 91 * pt; // ページの幅
var pageH = 55 * pt; // ページの高さ
var xmargin = 10 * pt; // ページ間のマージン
var ymargin = 3 * pt; // ページ間のマージン
var spreadcount = 2; // 何ページごとに改行するか
if (fileObjs) {
for (var f = 0; f < fileObjs.length; f++) {
var fileObj = fileObjs[f];
var pdfPages = 2; // PDFのページ数
for (var p = 0; p < pdfPages; p++) {
// アートボードを選択(pをインデックスとして使用)
var artboardIndex = p; // PDFの1ページ目をアートボード1に、2ページ目をアートボード2に
if (artboardIndex < app.activeDocument.artboards.length) {
var artboard = app.activeDocument.artboards[artboardIndex];
var artboardRect = artboard.artboardRect;
// アートボード1の場合(左上から配置)
if (artboardIndex == 0) {
startX = artboardRect[0] + 5.996 * pt;
startY = artboardRect[1] - 1.996 * pt;
var myX1 = startX + (f % spreadcount) * (pageW + xmargin); // X座標を更新
var myY1 = startY - Math.floor(f / spreadcount) * (pageH + ymargin); // Y座標を更新
}
// アートボード2の場合(右上から配置)
else if (artboardIndex == 1) {
startX = artboardRect[2] - 5.996 * 2 * pt - pageW; // 右端からページ幅を引く
startY = artboardRect[1] - 1.996 * pt;
var myX1 = startX + (f % spreadcount) * (pageW - (pageW*2+xmargin)); // X座標を更新
var myY1 = startY - Math.floor(f / spreadcount) * (pageH + ymargin); // Y座標を更新
}
pdfOptions.pageToOpen = p + 1; // PDFのページを開く
var myImage = app.activeDocument.placedItems.add();
myImage.file = fileObj;
myImage.left = myX1; // X座標を設定
myImage.top = myY1; // Y座標を設定
}
}
}
pdfOptions.pageToOpen = 1; // 最後に設定をデフォルトに戻す
} else {
alert("ファイルが選択されませんでした。");
}
皆様から見れば、なんちゃってスクリプトかもしれませんが、(これも後出し情報で申し訳ございませんが)便宜上PDF配置と申し上げましたが、ai配置で、かつエイリアスに対応できたので、個人的に大満足です。
説明書きをつけてくださったの本当に嬉しかったです。
本当にありがとうございました。
リンクをクリップボードにコピー
コピー完了
アートボードの再配置やPDFの取り回しに関して、リテラルで決め打ちだったりと、道半ばというところでしょうか。
アートボードを完全に操作するにはグローバル系の座標操作が必須になります。このコントロールで一番単純な処理になるのが、
グローバル座標系の取得→アートワークサイズの四角を作成→四角形のポジションをグローバル系の座標へ移動→アートボードを四角形に合わせる→四角形を削除
といった手順になります。これらのややこしい処はmatrix操作が必須なところです。この四角形を配置したPDFを利用する事もできるでしょう。PDFの各ページを正しくグローバル座標系に配置できれば、あとはそのPDFにアートボードをフィットさせていけば良いということになります。
ところで、なんのためにこのようなスクリプトが必要なのでしょうか?
PDFをAcrobatで束ねてそれをIllustratorで開けば全部のページがリンクされた状態になりますし、アートボードメニューから間隔も操作できます。
リンクをクリップボードにコピー
コピー完了
早速のご回答ありがとうございます。
初心者すぎて勉強が必要な状況です。
>ところで、なんのためにこのようなスクリプトが必要なのでしょうか?
大量にある個別のPDF(両面)を面付けして、両面で印刷したいからです。
表と裏を対応させるためにこんな感じになりました(できてないですけど_ _;;)。
リンクをクリップボードにコピー
コピー完了
PDFが2ページで構成されているんですよね?
Acrobatで表裏印刷…ではNGということです???
リンクをクリップボードにコピー
コピー完了
すでに決められた間隔で絵柄が印刷された紙に追い刷りで印刷しないとけないのです。
完成予定図をajabon grinsmith様のスレッドに添付させていただきました。
この形が一発で可能なら、別にIllustratorにこだわってはいませんのでぜひAcrobatでの仕方を教えてください。
リンクをクリップボードにコピー
コピー完了
>すでに決められた間隔で絵柄が印刷された紙に追い刷りで印刷しないとけないのです。
これが、必要な仕様です。最初に出すべきものです。
他にも、今やってることを省略せず書いた方がいいでしょうね。
追い刷りする紙はどこでどう刷られたものか。追い刷りでなく最初から全て印刷することはできるのかどうか、追い刷りする機器、位置合わせの必要な精度、そしてあなたの立場、など………
あと、使えるソフトウェアは何があるのか(InDesign等あるのか)、テンプレートは誰が用意したものなのか………などなど。
こちらで、そちらの状況を正しく想像できるだけの情報をまず出してください。
リンクをクリップボードにコピー
コピー完了
ご返信ありがとうございます。
お怒りごもっともです。
とりあえず、そこまでお話ししてしまうと、乗っ掛かりがひどくなってしまうため、当方としては遠慮という形で控えさせていただいた次第です。当方の遠慮と思ったものが逆に皆様を混乱させてしまいましたこと、深く反省しております。
申し訳ございませんでした。
ひとまず、希望していたものはなんとか出来ました。
ありがとうございました。
リンクをクリップボードにコピー
コピー完了
これだとアートボード操作するスクリプトを書くのはスジが悪いですね。
ダミーデータを配置したドキュメントを用意してダミーを差し替えるような処理にするのが適切でしょう。
更に言うと、IllustratorではなくInDesignでやる方が適しています。