ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

InDesign に配置されたPDF形式ファイルの配置オプション「背景を透明に」のチェックの状態を確認する CEP Extensions を作った

概要

InDesign に配置されたPDF形式ファイルの配置オプション「背景を透明に」のチェックの有無を確認する CEP Extensions を作った。

背景

Twitter で下記記事が話題になっていた。
www.screen.co.jp

かなり厄介なバグ?でみなさん戦々恐々といった感じ。
しかも一度配置されたファイルの設定を手動で確認する方法がないという。
そんな中、一緒にもくもく会を主催してくれている @Uske_S さんが早速スクリプトを公開されていたのを見て、自分もなにか書こうと思ったことがきっかけ。

作ったもの

youtu.be

使い方

動画で大体のイメージがつくと思うけど、簡単に説明。

  1. zxp をダウンロードする(この記事の最後にリンクがあるのでそこから入手)
  2. ZXPInstaller で zxp をインストール(ZXPInstaller については別記事を参照)
  3. InDesignを再起動する
  4. 「メニュー>ウィンドウ>エクステンション」から「背景を透明にチェック簡易版」を選択
  5. 「背景を透明にチェック簡易版」パネルが表示されるので、他のパネルにくっつけるなどする
  6. グラフィックフレーム、もしくは画像を選択すると、パネルに情報が表示されるので、確認する

仕様的なもの

  • InDesign でオブジェクトを選択したイベントをトリガーにチェックを実行
  • グラフィックフレーム、もしくは画像を選択すると、「背景を透明に」オプションのチェックボックスの状態をパネルに表示
    • チェックがオンの場合は、「ON」と表示
    • チェックがオフの場合は、「OFF」と表示し、パネルの背景を赤にする
    • PDF形式以外の画像の場合は、「背景を透明にオプションがない形式の配置画像です」と表示
  • グラフィックフレーム以外は「配置画像ではありません」と表示
  • ドキュメントを開いていない、オブジェクトが選択されていない、選択したオブジェクトが2つ以上の場合は、「グラフィックフレーム、または画像を1つだけ選択してください」と表示

対応バージョン

InDesign CC 2015以降。

ソースコード

index.html

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="css/styles.css"/>
        <link id="hostStyle" rel="stylesheet" href="css/theme.css"/>
        <title>背景を透明にチェック簡易版</title>
    </head>
    <body class="panel">
        <div class="container" style="padding: 5px; font-size: 12px; font-family: sans-serif; line-height: 250%; text-align: center;">
            <span>配置オプションの「背景を透明に」: <br />
                <span id="state" style="font-size: 16px; font-weight: bold;">グラフィックフレームか画像を1つだけ選択してください</span>
            </span>
        </div>
        <script src="js/libs/CSInterface-4.0.0.js"></script>
        <script src="js/libs/jquery-2.0.2.min.js"></script>
        <script src="js/themeManager.js"></script>
        <script src="js/main.js"></script>
    </body>
</html>

main.js

(function () {
    'use strict';
    var csInterface = new CSInterface();
    function init() {
        themeManager.init();
        // プロジェクト内のjsxディレクトリのパスを取得
        var jsxDirPath = csInterface.getSystemPath(SystemPath.EXTENSION) + "/jsx";
        // jsxにjsxディレクトリのパスを渡す
        csInterface.evalScript('setDirPath("' + jsxDirPath + '")');

        // オブジェクト選択時のイベントを受け取って、なんかする
        csInterface.addEventListener("afterSelectionChanged", function (evt) {
            csInterface.evalScript('setCallback()', function (e) {
            });
        });

        csInterface.addEventListener("getCallback", function (evt) {
            var message = '';
            var state = evt.data;
            if (state === 'notSelected') {
                message = 'グラフィックフレーム、または画像を1つだけ選択してください';
            } else if (state === 'notExistPdfAttributes') {
                message = '背景を透明にオプションがない形式の配置画像です';
            } else if (state === 'notImageObject') {
                message = '配置画像ではありません';
            } else if (state === 'ON') {
                message = 'ON';
            } else {
                message = 'OFF';
            }
            $(".panel").css('background', state === 'OFF' ? 'red' : '');
            $("#state").text(message);
        });
    }
    init();
}());

hostscript.jsx

// グローバル変数でjsxディレクトリのパスを保持
var dirPath = "";

// 引数で渡ってきたパスをグローバル変数に代入する
function setDirPath(jsxDirPath) {
    dirPath = jsxDirPath;
}

// コールバックをセットする
function setCallback() {
    try {
        var xLib = null;
        // PlugPlugExternalObject.frameworkのパスを生成
        var ppLibFile = File(dirPath + "/PlugPlugExternalObject.framework");
        if (ppLibFile.exists) {
            // ExternalObjectを生成
            xLib = new ExternalObject("lib:"+ ppLibFile.fullName);
        }
        else {
            throw new Error("Can't find 'PlugPlugExternalObject.framework'.");
        }
    }  catch(e) { alert(e); }

    // 配置オプションの「背景を透明に」の状態を返す(初期値はtrueを返す)
    var checkTransparentBackground = function () {
        if (app.documents.length === 0) return 'notSelected';
        if (app.selection.length !== 1) return 'notSelected';
        var selObj = app.selection[0];
        if (selObj.constructor.name === 'Rectangle'
            && selObj.graphics.length === 1
            && selObj.graphics[0].imageTypeName.indexOf("PDF") > -1) {
            // pdfAttributesはisValidが動作しない...
            try {
                if (selObj.graphics[0].pdfAttributes.transparentBackground) {
                    return 'ON';
                } else {
                    return 'OFF';
                }
            } catch (e) {
                return 'notExistPdfAttributes';
            }
        }
        if (selObj.constructor.name === 'TextFrame') {
            return 'notImageObject';
        }
        try {
            if (selObj.pdfAttributes.transparentBackground) {
                return 'ON';
            } else {
                return 'OFF';
            }
        } catch (e) {
            return 'notExistPdfAttributes';
        }
        return 'OFF';
    };

    // コールバック処理
    var eventObj = new CSXSEvent();
    eventObj.type = "getCallback";
    eventObj.data = checkTransparentBackground();
    eventObj.dispatch();
    xLib.unload();
    return true;
}

ダウンロード

https://drive.google.com/open?id=0B22BuC_RZ_hvLWZKWk4tbENvQlU
サポートしていないファイルのせいか、エラーが表示されるが、ダウンロードはできるはず。