Amazon10/19まで!プライム感謝祭開催中!セール会場へ

Illustratorスクリプト(jsx)│フォルダー内のAIをまとめてPDFにする方法

Illustratorで複数のAIファイルをPDFへ変換する場合、PDFプリセットを指定してフォルダー内のファイルを順番に保存する方法があります。この記事のJSXは、同名のPDFをスキップし、ファイルごとの成功・失敗をログへ残す処理例です。

2026年10月3日にコードを改修し、模擬オブジェクトによる試験と、Windows 11 Pro/Illustrator 30.8.2(64-bit)での限定条件の実機試験を行いました。確認した入力・結果と、未確認の条件は後述します。Macの実機試験は行っていません。コピーした少数のファイルで試し、出力を開いて確認してから用途に合わせて使います。

2026年10月16日には、Windows 11 Pro(10.0.26200)のAdobe Illustrator 30.8.2で、文書を閉じたホーム画面から「ファイル」→「スクリプト」→「その他のスクリプト」で実行し、フォルダーを画面で選んでPDFを作るまでの手順を確かめました。

PDF/X規格への適合、印刷会社の受理、Macでの動作は確かめていません。

目次

アクションのバッチとJSXの使い分け

同じ操作を記録して繰り返すだけなら、標準のアクションとバッチが候補になります。この記事は、既存出力の確認や処理結果の記録をコードで管理したい場合を扱います。1ファイル内のアートボードを画像へ書き出す処理や、CSVで文字を差し替える処理とは対象が異なります。

処理対象と保存方法

項目このコードの扱い
入力選んだフォルダー直下の.ai/.AIファイル。サブフォルダーへは入りません。
出力別フォルダーに元の名前.pdfとして保存。sample.v2.AIはsample.v2.pdfになります。
同名PDF開く前と保存直前に確認し、存在すればスキップ。上書きや自動連番にはしません。
元のAI入力パスへ保存する呼び出しはありません。処理用のドキュメントを保存せずに閉じます。
PDF設定PRESETで指定したプリセットを使い、保存後にビューアーを自動起動する設定をfalseにします。生成結果は別途確認します。
操作中の警告確認ダイアログを抑制しません。フォントやリンクの警告が出たら内容を確認します。

実行前の準備

  1. 作業に使うAIをコピーし、入力用フォルダーへ3件ほど入れる。サブフォルダーは対象外です。
  2. 入力とは別の出力用フォルダーを作る。ほかのアプリや同期処理から同じ出力先へ書き込まない。
  3. Illustratorで開いているドキュメントを保存して閉じる。入力AIを1件ずつ手動で開き、フォント・リンク・見た目を確認して閉じる。
  4. 掲載コードをUTF-8のテキストとして保存する。日本語が化ける場合はBOM付きUTF-8にする。拡張子が「.jsx.txt」になっていないか確認する。
  5. 「ファイル」→「スクリプト」→「その他のスクリプト」から実行する。外部JSXの警告は内容を確認し、この手順では無効化しません。

2026年10月16日に、Windows 11 Pro(10.0.26200)のAdobe Illustrator 30.8.2で、この手順の画面を確かめました。

開いている文書がないホーム画面(「Illustrator へようこそ」の画面)でも、「ファイル」→「スクリプト」→「その他のスクリプト」を選べました。

Illustratorのホーム画面で、ファイルメニューのスクリプトから「その他のスクリプト」を選んだ状態
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。開いている文書がないホーム画面で「ファイル」→「スクリプト」を開き、「その他のスクリプト」を選んだ実機画面(画面の一部を切り取り)。

「その他のスクリプト」を選ぶとスクリプトのファイルを選ぶ画面が開き、保存したスクリプトのファイルを選んで開くと実行が始まりました。

PRESETに正しい名前を入れていても、文書を開いたまま実行すると「開いているドキュメントを保存して閉じてから実行してください。」と表示されて止まり、OKを押してもフォルダーを選ぶ画面には進みませんでした。

開いているドキュメントを保存して閉じてから実行するよう求めるスクリプト警告
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。文書を開いたまま、PRESETに正しいプリセット名を入れて実行したときの通知(通知部分を切り取り)。

なお、今回の確認では、開いていた文書は画面の操作ではなく別の方法で閉じたため、文書を閉じる操作は確認に含めていません。

PDFプリセットを指定する

  1. 下のコードをconvert_to_pdf.jsxとして保存し、PRESETを空のまま一度実行する。この回はプリセット一覧を表示するだけです。
  2. 一覧にある名前をPRESETのダブルクォーテーション内へ正確に入力して保存する。名前に「"」や「\」が含まれる場合はJavaScript文字列としてエスケープする。
  3. 再実行して入力と出力のフォルダーを選ぶ。名前が一覧と一致しなければ、フォルダー選択前に停止します。
  4. 結果ログと生成PDFを開き、ページ数、アートボード、文字、リンク画像、サイズ、色、トンボ・塗り足しを用途に合わせて確認する。

2026年10月16日に、手順1と手順3の表示をWindows 11 Pro(10.0.26200)のAdobe Illustrator 30.8.2で確かめました。

PRESETを空のまま実行すると、9件のプリセット名が一覧で表示されました。

9件のPDFプリセット名が並んだスクリプト警告
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。PRESETを空のまま実行したときに表示されたPDFプリセットの一覧(通知部分を切り取り)。

この一覧は、開いている文書があっても先に表示されました。

今回は、一覧にあった名前を使って、PRESETの行を次のように書き換えました。

var PRESET = "[Illustrator 初期設定]";

一覧にない名前を入れて実行すると、「指定したPDFプリセットが見つかりません。」と表示され、OKを押してもフォルダーを選ぶ画面には進みませんでした。

指定したPDFプリセットが見つからないというスクリプト警告
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。一覧にない名前をPRESETに入れて実行したときの通知(通知部分を切り取り)。

入稿用のプリセットは印刷会社の指定に合わせます。PDF/Xの名前だけで入稿条件を満たしたと判断せず、PDF/X-1aとPDF/X-4の選び方と入稿前の確認項目を参照してください。

PDF一括変換のコード

// コピーした少数のAIで試してください。
(function () {
  var PRESET = ""; // 空のまま実行して一覧を確認し、正確な名前を入力
  var OUTPUT_SUFFIX = ".pdf";
  var LOG_PREFIX = "pdf_batch_";
  var RUN_NOTE = "PDF preset=" + PRESET;

  function clean(value) {
    return String(value).replace(/[\t\r\n]+/g, " ");
  }
  function logRow(log, status, input, output, note) {
    log.encoding = "UTF-8";
    if (!log.open("a")) throw new Error("ログを開けません: " + log.error);
    var written = false;
    var closed = false;
    try {
      written = log.writeln([new Date().toString(), status, clean(input),
        clean(output), clean(note)].join("\t"));
    } finally {
      closed = log.close();
    }
    if (!written || !closed) throw new Error("ログを保存できません: " + log.error);
  }
  function makeLog(dst) {
    var stamp = new Date().getTime();
    var number = 0;
    var log;
    do {
      log = new File(dst.fsName + "/" + LOG_PREFIX + stamp + "_" + number + ".tsv");
      number++;
    } while (log.exists);
    log.encoding = "UTF-8";
    if (!log.open("w")) throw new Error("ログを作成できません: " + log.error);
    var written = false;
    var closed = false;
    try {
      written = log.writeln("time\tstatus\tinput\toutput\tnote");
    } finally {
      closed = log.close();
    }
    if (!written || !closed) throw new Error("ログを保存できません: " + log.error);
    return log;
  }

  function processDocument(doc) {
    return "preset=" + PRESET;
  }
  function saveDocument(doc, output) {
    var options = new PDFSaveOptions();
    options.pDFPreset = PRESET;
    options.viewAfterSaving = false;
    doc.saveAs(output, options);
  }

  function main() {
    var presets = app.PDFPresetsList;
    if (PRESET === "") {
      alert("PDFプリセット名をPRESETへ入力してください。\n" + presets.join("\n"));
      return;
    }
    var valid = false;
    for (var presetIndex = 0; presetIndex < presets.length; presetIndex++) {
      if (presets[presetIndex] === PRESET) valid = true;
    }
    if (!valid) { alert("指定したPDFプリセットが見つかりません。"); return; }
    if (app.documents.length !== 0) {
      alert("開いているドキュメントを保存して閉じてから実行してください。");
      return;
    }
    var src = Folder.selectDialog("コピーした入力AIのフォルダーを選択");
    if (!src) return;
    var dst = Folder.selectDialog("入力とは別の出力フォルダーを選択");
    if (!dst) return;
    if (src.fsName.toLowerCase() === dst.fsName.toLowerCase()) {
      alert("入力と出力は別のフォルダーにしてください。");
      return;
    }
    var files = src.getFiles(function (entry) {
      return entry instanceof File && /\.ai$/i.test(entry.name);
    });
    if (files.length === 0) {
      alert("入力フォルダー直下にAIファイルがありません。");
      return;
    }
    var log = makeLog(dst);
    logRow(log, "START", src.fsName, dst.fsName, RUN_NOTE);
    var done = 0;
    var failed = 0;
    var skipped = 0;
    var processed = 0;
    var halted = false;
    for (var fileIndex = 0; fileIndex < files.length; fileIndex++) {
      var input = files[fileIndex];
      var name = File.decode(input.name).replace(/\.ai$/i, "") + OUTPUT_SUFFIX;
      var output = new File(dst.fsName + "/" + name);
      var doc = null;
      var status = "OK";
      var note = "";
      if (output.exists) {
        status = "SKIP";
        note = "同名の出力があるため処理しません";
      } else {
        try {
          doc = app.open(input);
          note = processDocument(doc);
          // 開いている間に出力が作られた場合も保存を避ける。
          output = new File(output.fsName);
          if (output.exists) {
            status = "SKIP";
            note = "保存直前に同名の出力を検出";
          } else {
            saveDocument(doc, output);
            if (!new File(output.fsName).exists) {
              throw new Error("保存後に出力ファイルを確認できません");
            }
          }
        } catch (error) {
          status = "ERROR";
          note = String(error);
        } finally {
          if (doc !== null) {
            try {
              doc.close(SaveOptions.DONOTSAVECHANGES);
            } catch (closeError) {
              status = "ERROR";
              note += " / 終了失敗: " + closeError;
              halted = true;
            }
          }
        }
      }
      processed++;
      if (status === "OK") done++;
      else if (status === "SKIP") skipped++;
      else failed++;
      logRow(log, status, input.fsName, output.fsName, note);
      // 開く処理の途中でドキュメントが残った場合も継続しない。
      if (app.documents.length !== 0) halted = true;
      if (halted) break;
    }
    var remaining = files.length - processed;
    var summary = "保存 " + done + " / 失敗 " + failed + " / スキップ " + skipped +
      " / 未処理 " + remaining;
    logRow(log, halted ? "HALTED" : "END", "", "", summary);
    alert(summary + "\nログ: " + log.fsName +
      "\nERRORの出力は不完全な可能性があります。開いて確認してください。");
  }
  try {
    main();
  } catch (fatalError) {
    alert("処理を停止しました: " + fatalError +
      "\n出力とログ、開いているドキュメントを確認してください。");
  }
}());

ログと失敗したファイルの確認

出力フォルダーにTSV形式のログを作ります。各行は日時、状態、入力パス、出力パス、補足の順です。テキストエディターで開き、入力件数と「保存・失敗・スキップ・未処理」の合計を照合します。入力フォルダーに残したファイルは変更していないか、更新日時や内容でも確認します。

状態意味と次の確認
OK保存処理が戻り、出力ファイルの存在を確認した状態。見た目や印刷条件への適合は判定していません。
SKIP同名の出力があったため保存を見送った状態。既存ファイルが今回の入力と一致するとは限りません。
ERROR開く・処理する・保存する・閉じる、のいずれかで例外が起きた状態。出力があっても不完全な可能性があるため開いて確認します。
HALTED/未処理ドキュメントを閉じられないなどの理由で後続を停止した状態。開いているファイルとログを確認し、原因を解消してから再開します。

通常のファイル別エラーはログに記録して次へ進みます。ただし、ドキュメントが残った場合やログを保存できない場合は停止します。強制終了・アプリのクラッシュでは最後の行が残らない場合もあります。ERRORの出力を自動削除する処理は入れていません。再実行時も既存出力はスキップされるので、不完全な出力を別の場所へ退避してから必要な入力だけを再処理します。

同名チェックは保存前に行いますが、別の処理が同時に出力を作る状況まで排他的に防ぐ仕組みではありません。同じ出力先を使うスクリプトを並行して実行しないでください。入力・出力を分ける判定はパス文字列によるため、同じフォルダーを指す別名・エイリアスも選ばないでください。

実機で確認するケース

  • 同名PDFがあるケースで、そのファイルの内容と更新日時が変わらないこと。
  • 途中に開けないAIや保存できないファイルを置き、ログと後続ファイルの結果を照合すること。
  • 複数ドット・日本語・大文字拡張子の名前、複数アートボード、フォント不足、リンク切れを含むコピーで結果を確認すること。
  • 手動で同じプリセットから作ったPDFと比較し、ページ範囲・圧縮・色・塗り足しなどの設定結果を確認すること。

このうち、同名PDFがあるケースと大文字拡張子の名前は、2026年10月16日に確かめました(下の「2026年10月16日に画面から実行した結果」)。

途中に開けないAIや保存できないファイルを置くケース、フォント不足、リンク切れ、手動で作ったPDFとの比較は確かめていません。

Windows実機で確認した入力と結果

2026年10月3日15:12〜15:14(日本時間)に、自作のRGBドキュメント3件を処理しました。PDFプリセットは「[Illustrator 初期設定]」。試験用ハーネスでフォルダー選択とプリセット値を固定し、情報メッセージを記録しています。掲載コードの保存・同名判定・終了処理は変更していません。操作ダイアログを手動で選ぶ手順全体の再現試験とは区別します。

入力AI条件生成PDF
名札.v2.ai日本語のファイル名、複数ドット、文字2件(サブレイヤー内を含む)、1アートボード名札.v2.pdf/1ページ
sample-two.ai文字2件、2アートボード。2枚目は意図した空白sample-two.pdf/2ページ
no-text.ai文字なし、1アートボードno-text.pdf/1ページ

初回ログは保存3・失敗0・スキップ0。再実行は保存0・失敗0・スキップ3でした。生成した全4ページをレンダリングして確認し、文字のある2ページでは「名札」と「Nested text」が表示され、2アートボードの空白ページも含まれていました。各ページは360×240pt。試験前後の入力3件のSHA-256は一致しました。

一括生成した名札.v2.pdfの1ページ目
実際に生成したPDFの1ページ目を144dpiでレンダリングした画像です。2026年10月3日/Illustrator 30.8.2。

これは基本的な保存結果の確認です。

途中に破損AIを含む処理、リンク切れ・フォント不足、保存権限不足、同時書き込み、Mac、手動保存との設定比較、PDF/X規格・印刷会社の受理は実機未確認です。

模擬試験で確認した例外処理を、この実機試験で確認済みとは扱いません。

10月3日の入力には、大文字拡張子のファイルを含めていませんでした。

2026年10月16日に画面から実行した結果

Windows 11 Pro(10.0.26200)のAdobe Illustrator 30.8.2で、開いている文書がないホーム画面から「ファイル」→「スクリプト」→「その他のスクリプト」でスクリプトを実行しました。

使ったコードは上の掲載コードで、PRESETだけを"[Illustrator 初期設定]"に書き換え、BOM付きUTF-8で保存しました。

入力用と出力用のフォルダーはCドライブの直下に短い名前で作り、フォルダーを選ぶ画面でそれぞれ指定しました。

入力AI用意した条件1回目再実行
sample.v2.AI大文字の拡張子、名前に複数のドット保存(sample.v2.pdfを作成)スキップ
skip-existing.ai出力フォルダーに同名のskip-existing.pdfを先に置いたスキップスキップ

1回目の通知は「保存 1 / 失敗 0 / スキップ 1 / 未処理 0」でした。

保存1、失敗0、スキップ1、未処理0と表示された集計の通知
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。ホーム画面から実行した1回目の集計の通知。ログは出力フォルダーに作られた。

出力フォルダーにはsample.v2.pdfが1件作られ、先に置いたskip-existing.pdfは、SHA-256(ファイルの内容から計算した値)も更新日時も変わりませんでした。

同じ入口から同じフォルダーを選んで再実行すると、通知は「保存 0 / 失敗 0 / スキップ 2 / 未処理 0」でした。

保存0、失敗0、スキップ2、未処理0と表示された集計の通知
2026-10-16撮影。Adobe Illustrator 30.8.2、Windows 11 Pro (10.0.26200)。同じフォルダーを選んで再実行したときの集計の通知(通知部分を切り取り)。

2つのPDFは、1回目のあとと再実行のあとで、SHA-256も更新日時も変わりませんでした。

出力フォルダーのログ(TSV)にも、1回目はOKとSKIPが1行ずつ、再実行はSKIPが2行記録され、SKIPの行には「同名の出力があるため処理しません」と書かれていました。

開いていた文書を閉じる操作と、入力用のAI・先に置くPDFのコピーは、画面の操作ではなく別の方法で行ったため、確認に含めていません。

作られたPDFの見た目やページの設定は、この回では確かめていません。

PDF/X規格への適合、印刷会社の受理、Macでの動作も確かめていません。

参照資料

実行手順はAdobeのInstall and run scripts、PDF設定はAdobe PDFの作成を参照。File・Folderの読み書きはAdobe公開リポジトリーのJavaScript Tools Guide CC第3章を参照しています。APIの説明はAdobe資料をもとに維持されているPDFSaveOptionsの参照ページも案内します。掲載JSXの実機結果とは区別しています。

よくある質問:フォルダー内AIのPDF一括変換JSX

このスクリプトは、何をしますか?

選んだフォルダー直下の.ai/.AIファイルを順番に開き、PDFプリセットを指定して別フォルダーにPDFとして保存します。同名のPDFがあればスキップし、ファイルごとの成功・失敗をログへ残す処理例です。サブフォルダーには入りません。

アクションのバッチと、JSXは、どう使い分けますか?

同じ操作を記録して繰り返すだけなら、標準のアクションとバッチが候補になります。記事のJSXは、既存出力の確認や処理結果の記録を、コードで管理したい場合を扱っています。1ファイル内のアートボードを画像へ書き出す処理や、CSVで文字を差し替える処理とは、対象が異なります。

出力されるPDFの名前と、同名のPDFがあった場合の扱いを教えてください。

別フォルダーに、元の名前.pdfとして保存します。たとえば sample.v2.AI は sample.v2.pdf になります。同名のPDFが開く前と保存直前に存在すれば、スキップします。上書きや自動連番はしません。元のAIの入力パスへ保存する呼び出しはなく、処理用のドキュメントは保存せずに閉じます。

PDFプリセットは、どうやって指定しますか?

コードをconvert_to_pdf.jsxとして保存し、PRESETを空のまま一度実行すると、プリセット一覧が表示されます。一覧にある名前をPRESETのダブルクォーテーション内へ正確に入力して保存し、再実行して入力と出力のフォルダーを選びます。名前が一覧と一致しなければ、フォルダー選択前に停止します。入稿用のプリセットは、印刷会社の指定に合わせます。PDF/Xの名前だけで入稿条件を満たしたと判断しないでください。

実行する前に、何を準備しておくとよいですか?

作業に使うAIをコピーして、入力用フォルダーへ3件ほど入れます。入力とは別に、出力専用のフォルダーを用意します。入力AIを1件ずつ手動で開き、フォント・リンク・見た目を確認して閉じておきます。掲載コードはUTF-8のテキストで保存し、日本語が化ける場合はBOM付きUTF-8にして、拡張子が「.jsx.txt」になっていないか確認します。実行は、「ファイル」→「スクリプト」→「その他のスクリプト」から行います。

ログのOK・SKIP・ERROR・HALTEDは、それぞれ何を意味しますか?

出力フォルダーにTSV形式のログが作られます。OKは、保存処理が戻り、出力ファイルの存在を確認した状態で、見た目や印刷条件への適合は判定していません。SKIPは、同名の出力があったため保存を見送った状態です。ERRORは、開く・処理する・保存する・閉じる、のいずれかで例外が起きた状態で、出力があっても不完全な可能性があるため、開いて確認します。HALTED/未処理は、ドキュメントを閉じられないなどの理由で後続を停止した状態です。通常のファイル別エラーは、ログに記録して次へ進みます。

実際のIllustratorで、動作を確認していますか?

2026年10月3日に、Windows 11 Pro/Illustrator 30.8.2(64-bit)で、自作のRGBドキュメント3件を処理しました。初回ログは保存3・失敗0・スキップ0で、再実行は保存0・失敗0・スキップ3でした。生成した全4ページをレンダリングして確認し、試験前後の入力3件のSHA-256は一致しました。一方、途中に破損AIを含む処理、リンク切れ・フォント不足、保存権限不足、同時書き込み、Mac、手動保存との設定比較、PDF/X規格・印刷会社の受理は、実機では未確認です。

2026年10月16日には、Illustrator 30.8.2で、文書を閉じたホーム画面から「その他のスクリプト」で実行し、フォルダーを画面で選んでPDFを作る手順と、同名のPDFがあるときにスキップして既存のPDFを変えないことを確かめました。

プリセット一覧の表示と、名前が違うとき・文書が開いているときにフォルダーを選ぶ前で止まることも、同じ日に確かめています。

使うときの注意点は、ありますか?

コピーした少数のファイルで試し、出力を開いて確認してから、用途に合わせて使ってください。生成されたPDFは、ページ数、アートボード、文字、リンク画像、サイズ、色、トンボ・塗り足しを確認します。同じ出力先を使うスクリプトを並行して実行しないでください。入力と出力を分ける判定はパス文字列によるため、同じフォルダーを指す別名・エイリアスも選ばないでください。外部JSXの警告は、内容を確認し、この手順では無効化しません。最新はAdobe公式の資料で確認してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次