リンクをクリップボードにコピー
コピー完了
お世話になります。
イラストレーターのスクリプトで次のような動作を実現させたいと考えております。
-----
開いているアートボードに、複数ページのPDFを全ページ貼り込み(リンク形式)
【環境】Windows/IlustratorCS6
-----
過去のフォーラムの会話「JavaScriptで、アートボードに配置したアイテムの間隔を指定したい」などを参考にさせていただき、AIなども頼りつつ、現状以下のスクリプトになりました。
テストに主に使用したPDFは計14ページあるのですが、とりあえず14ページ貼り込みはされるものの、すべて1ページ目が貼り込まれてしまいます。順次、つまり1ページから14ページを1ページずつ貼り込みたいのですが可能でしょうか? アートボードは別にする必要はありませんが、アートボードを作成していった方がかえってうまくいきますでしょうか? ページ数の取得が問題なのかと思い、ユーザーに総ページ数を入れてもらう仕様にしてみましたが、うまくいかず自分としては手詰まりとなってしまいました。
Ilustratorで配置したPDFを加工する目的があるため、あくまでIllustrator上で実現させたいと考えております。また、CCは所持しておりますのでバージョンが上がっても問題ございません。
当方ほとんどjavascriptの知識がない状態で、不躾な質問となってしまい申し訳ございませんが、よろしくお願いいたします。
-----
// PDFファイル選択
var fileObjs = File.openDialog("PDFを選択してください", "*.pdf", true);
var pdfOptions = app.preferences.PDFFileOptions;
pdfOptions.pDFCropToBox = PDFBoxType.PDFMEDIABOX;
// 定規の原点を左上に設定(変更なし)
app.activeDocument.rulerOrigin = [0, 0];
// A4サイズ(mm単位)
var artboardW = 210; // ドキュメント幅(mm)
var artboardH = 297; // ドキュメント高さ(mm)
var pageW = 210; // PDFのページ幅(mm)
var pageH = 297; // PDFのページ高さ(mm)
var spreadcount = 5; // 1行のページ数(5個並べる)
// 各ページ間の間隔(5mm固定)
var xmargin = 5;
var ymargin = 5;
var ptPerMm = 2.83465; // mm を pt に変換する係数
// ユーザーにページ数を入力してもらう
var userInput = prompt("PDFの総ページ数を入力してください", "10");
var pdfPages = parseInt(userInput, 10); // 数値に変換
if (fileObjs && !isNaN(pdfPages)) {
var row = 0; // 縦の段数トラッキング
var col = 0; // 横の配置トラッキング
for (var f = 0; f < fileObjs.length; f++) {
var fileObj = fileObjs[f];
for (var p = 0; p < pdfPages; p++) { // **ユーザーが入力したページ数を使用**
var artboardIndex = p % app.activeDocument.artboards.length; // アートボードの循環
var artboard = app.activeDocument.artboards[artboardIndex];
var artboardRect = artboard.artboardRect;
var startX = artboardRect[0]; // 左上原点(変更なし)
var startY = artboardRect[1]; // 左上原点(変更なし)
var myX1 = startX + (ptPerMm * col * (pageW + xmargin)); // 横へ並べる
var myY1 = startY - (ptPerMm * row * (pageH + ymargin)); // 縦の移動
pdfOptions.pageToOpen = p + 1; // **ページ指定を適切に適用**
var myImage = app.activeDocument.placedItems.add();
myImage.file = fileObj;
myImage.left = myX1;
myImage.top = myY1;
col++; // 次の列へ移動
if (col >= spreadcount) {
col = 0; // 横の配置をリセット
row++; // 次の行へ移動
}
}
}
pdfOptions.pageToOpen = 1;
} else {
alert("正しいページ数を入力してください。");
}
リンクをクリップボードにコピー
コピー完了
ひとつ質問なんですけど、Illustratorなら PDFを開くだけで各ページがアートボードに配置された状態になりますが、それではダメなんですか?
リンクをクリップボードにコピー
コピー完了
Ten A様
早速のご確認・ご回答ありがとうございます。
返信が遅れまして失礼いたしました。
おっしゃるとおり、
CC2023でためしたところ、「開く」の後に
「PDF読み込みオプション」が出てきて
配置を「すべて」にすることで各ページがアートボードに
配置された状態となりました。
(普段、事情によりCS6をメインで使っており、
CCの挙動についても勉強不足でお恥ずかしいです…)
また、デフォルトでは列方向に配置されるページの数は
制御できないようでしたが、
スクリプトを使い制御可能となることを
確認いたしました。
ご指摘のおかげで気づきを得て
希望する結果を得ることができました。
ありがとうございました。
リンクをクリップボードにコピー
コピー完了
コード自体を見るに、CS6というのがうまく動かない原因です。CCにアップグレードすると動くんじゃないかと思います。もっとも、先に書いたようにPDFを編集目的で配置するのであれば直接開くのが効率的です。
ただし、配置して埋め込み経由で編集するのも同様ですがIllustratorでのPDF編集は完全なものではありませんので、諸々義注意ください。
リンクをクリップボードにコピー
コピー完了
Ten A様
ご返信いただき、ありがとうございます。
行き違いで返信をアップしてしまいましたが、
おかげさまで気づきを得まして、
おっしゃるとおり、CCの環境であればなんとかなりそうです。
>配置して埋め込み経由で編集するのも同様ですがIllustratorでのPDF編集は完全なものではありません
これは本当におっしゃるとおりで、リスクを伴うかと思いますが
お客様からの支給データがPDFのためやむなく…といったところです。
CCでの作業経験値が低いので、十分注意して作業を行うようにいたします。
いろいろと試行錯誤して勉強になりました。ありがとうございました。