コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

060.【Ai】PDFを複製保存→上書きして閉じる

挙動

  1. aiデータを開いた状態でIllustratorのファイルメニューから実行する
  2. PDF書き出しプリセットを選択する
  3. aiとpdfの更新時間を一致させるため、1番目のレイヤーのロックを切り替えて元に戻す
  4. pdfを書き出す
  5. aiを上書き保存する

    コード

//@targetengine saveAsPDFandAI
//ESTKから実行する場合、1行目をコメントアウトする

(function() {
    if (app.documents.length ===0) {
        alert("開いているドキュメントがないため中断します");
        return;
    }
    var doc = app.activeDocument;
    var dialog = new Window("dialog", "プリセットを選択してください");
    var dropdown1 = dialog.add("dropdownlist", undefined, getPresest());
    var button1 = dialog.add("button", undefined, "実行");
    button1.onClick = function() {
        dialog.close(1);
    }
    var dlgResult = dialog.show();
    if (dlgResult !== 1) {
        alert("中断します");
        return;
    }

    var n = doc.fullName.toString().replace(/ai$/, "pdf");
    var p = dropdown1.selection;
    var tmp = doc.layers[0].locked;
    if (doc.layers[0].locked) { //aiとpdfの更新時間を一致させる目的で上書き保存するため
        doc.layers[0].locked = false;
        doc.layers[0].locked = true;
    } else {
        doc.layers[0].locked = true;
        doc.layers[0].locked = false;
    }

    savePDF(doc, n, p);
    app.activeDocument.close(SaveOptions.SAVECHANGES);

    function savePDF(docObj, newfilepath, preset) {
        var fileObj = new File(newfilepath);
        var saveOpts = new PDFSaveOptions();
        saveOpts.pDFPreset = preset;
        saveOpts.viewAfterSaving = false;
        docObj.saveAs(fileObj, saveOpts);
    }

    function getPresest() {
        var presets = app.PDFPresetsList;
        var presetsArr = [];
        for (var i = 0; i < presets.length; i++) {
            presetsArr.push(presets[i]);
        }
        return presetsArr;
    }
}());

メモ

分かったこと

ESTKからAiをスクリプト制御するとき、targetengineを指定できない。

viewAfterSavingのデフォルトはfalseだが、これはアプリケーションを起動した状態での値がfalseということ(?)。
手動で「保存後に表示」にチェックを入れて複製保存したあとのviewAfterSavingの値はtrueになる。
つまりこの状態でviewAfterSavingを設定せず複製保存すると、書き出されたPDFが表示されてしまう。

参考