見出し画像

Illustratorでテキストをアウトライン化するとき、文字列、フォント、フォントサイズ、行送りの情報を記憶させ、それを元に復元するスクリプト

アウトライン化してしまったテキストを復元する方法について考えてみました。


Retype

2023年10月リリースからビットマップ画像やアウトライン化されたオブジェクトからテキストに戻すことができるようになりました。この機能をRetype(リタイプ)、戻されたテキストは〈ライブテキスト〉と呼びます。

非常にウェルカムな機能ですが、現在、対応しているのは欧文のみ。当然、縦組みも非対応です。

[属性]パネルのメモ

一方、Illustratorの[属性]パネルを拡張表示すると、下部に[メモ]と呼ばれる欄が表示されます。このメモはオブジェクトごとに記憶されます(ドキュメントを開閉したり、Illustratorを再起動しても記憶しています)。

選択しているテキストの文字列をメモに追加するスクリプト

次のようなスクリプトで選択しているテキストの文字列をメモに追加できます。

// 選択されたテキストフレームを取得
var doc = app.activeDocument;
var selectedObjects = doc.selection;

// テキストフレームが選択されているかチェック
if (selectedObjects.length == 0) {
    alert("テキストを選択してください。");
} else {
    for (var i = 0; i < selectedObjects.length; i++) {
        var selectedObject = selectedObjects[i];
        
        // テキストフレームかどうかをチェック
        if (selectedObject.typename == "TextFrame") {
            var textContent = selectedObject.contents;
            
            // メモを追加
            selectedObject.note = textContent;
            
            // 再描画
            app.redraw();
        } else {
            alert("選択したオブジェクトはテキストフレームではありません。");
        }
    }
}

「app.redraw();」で再描画していますが、ほかのオブジェクトを選択してから元のオブジェクトを選択し直さないと反映されません。

テキストをアウトライン化するとき、文字列、フォント、フォントサイズ、行送りの情報を記憶させ、それを元に復元するスクリプト

そこで、次の手順でテキストを復元できないかと考え、ChatGPTで生成してみました。

アウトライン化するスクリプト

  • テキストをアウトライン化前に文字列、フォント、フォントサイズ、行送りの情報を読み込む

  • アウトライン化されたオブジェクトの〈メモ〉に文字列、フォント、フォントサイズ、行送りの情報を書き込む

アウトライン化されたオブジェクトからテキストを復元する

  • アウトライン化されたオブジェクトの〈メモ〉のフォント、フォントサイズ、行送りの情報を読み込む

  • テキストを入力

  • 文字列、フォント、フォントサイズ、行送りの情報をテキストに反映

  • 元のオブジェクトは不透明度30%に設定してロック

制限事項

次には対応していません。

  • 異なるフォント、文字サイズ…などが混在

  • アウトライン化されたオブジェクトのカラー(や不透明度)の反映

こうなったらいいのに…!!!のアイデア

「後は任せて!」という方がいらっしゃれば、ぜひお願いします!

テキストの位置

  • 元のオブジェクトの座標に正確に揃えたい

行送りとカラー

  • 自動行送りの場合には「自動」として復元

  • カラー情報の取得と反映

元のオブジェクトの扱い

  • グループオブジェクトは「outlined-text」レイヤーに移動(ない場合には作成)

  • 「outlined-text」レイヤーは最背面にする(「bg」レイヤーがある場合には、その前面)

  • 「outlined-text」レイヤーは「テンプレート」にする(ロックされ、プリント対象外に)

レイヤーを「テンプレート」にする操作

レイヤーを「テンプレート」にする操作はスクリプトでは行えません。

そこで、アクションを一時的に読み込んで実行し、アクションを削除する「dynamic action」を使います。

function act_setLayTmplAttr() {
  // スクリプトのバージョンとアクションの設定を行う文字列
  var actionString = 
    '/version 3' +'/name [ 5' +' 6c61796572' +' ]' +'/isOpen 1' +'/actionCount 1' +'/action-1 {' +' /name [ 24' +' 6368616e67652d746f2d74656d706c6174652d6c61796572' +' ]' +' /keyIndex 0' +' /colorIndex 0' +' /isOpen 1' +' /eventCount 1' +' /event-1 {' +' /useRulersIn1stQuadrant 0' +' /internalName (ai_plugin_Layer)' +' /localizedName [ 9' +' e8a1a8e7a4ba203a20' +' ]' +' /isOpen 1' +' /isOn 1' +' /hasDialog 1' +' /showDialog 0' +' /parameterCount 10' +
    ' /parameter-1 {' +' /key 1836411236' +' /showInPalette 4294967295' +' /type (integer)' +' /value 4' +' }' +
    ' /parameter-2 {' +' /key 1851878757' +' /showInPalette 4294967295' +' /type (ustring)' +' /value [ 36' +' e383ace382a4e383a4e383bce38391e3838de383aae382aae38397e382b7e383' +' a7e383b3' +' ]' +' }' +
    ' /parameter-3 {' +' /key 1953068140' +' /showInPalette 4294967295' +' /type (ustring)' +' /value [ 13' +' 6f75746c696e65642d74657874' +' ]' +' }' +
    ' /parameter-4 {' +' /key 1953329260' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 1' +' }' +
    ' /parameter-5 {' +' /key 1936224119' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 1' +' }' +
    ' /parameter-6 {' +' /key 1819239275' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 1' +' }' +
    ' /parameter-7 {' +' /key 1886549623' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 1' +' }' +
    ' /parameter-8 {' +' /key 1886547572' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 0' +' }' +
    ' /parameter-9 {' +' /key 1684630830' +' /showInPalette 4294967295' +' /type (boolean)' +' /value 1' +' }' +
    ' /parameter-10 {' +' /key 1885564532' +' /showInPalette 4294967295' +' /type (unit real)' +' /value 50.0' +' /unit 592474723' +' }' +' }' +
    '}';

  // スクリプトアクションファイルを作成し、アクションを設定
  var actionFile = new File('~/ScriptAction.aia');
  actionFile.open('w');
  actionFile.write(actionString);
  actionFile.close();

  // アクションを読み込み、実行し、削除する
  app.loadAction(actionFile);
  actionFile.remove();
  app.doScript("change-to-template-layer", "layer", false); // action name, set name
  app.unloadAction("layer", ""); // set name
}

// アクションを設定する関数を実行
act_setLayTmplAttr();

ダウンロード

Keyboard Maestro使いであれば、MaestroPackを使ってスクリプトファイルを指定します。なお、「Ai Execute Jsx Text」アクションは使えないみたいです。

Illustratorのキーボードショートカットの[アウトラインを作成]コマンドをOFFにして、このスクリプトに同じキーボードショートカットをあてるとよいでしょう(⌘ + shift + O)。

復元のキーボードショートカットは⌘ + control + Oにしています(変更可能)。

ここから先は

30字 / 2ファイル
月に10-20本くらいの記事を投稿しています。定期購読されると、更新のお知らせを受け取ったり、マガジン限定記事やサンプルファイルをダウンロードできます。 購読を開始した月に更新された記事から読むことができます(初月無料)。

DTP Transit 定期購読マガジン

¥100 / 月 初月無料

マガジン限定記事やサンプルファイルをダウンロードできます。

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5