Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2011-12-26

[][][]インタラクティブPDFの作り方

電子書籍といえば、EPUBやリッチなアプリなどが注目されていますが、PDFも立派な電子書籍です。PDFの表現能力はフォントやレイアウトの再現性だけじゃありません。動画も貼れるしボタンもつけられます。インタラクティブなフォームやリンク、電子透かしや認証方式も選べたり、印刷やコピーの許可などのセキュリティも備わっています。リーダーさえ対応していれば、JavaScriptだって動作します。


インタラクティブPDFの詳しい解説書が、インタラクティブPDFによって出版されています。

個々のインタラクティブ機能について、たいへんわかりやすい教材になっています。実際の動きを見ながらインタラクティブPDFを作ることができるでしょう。


出版・印刷業界以外の方々はご存知ないかもしれませんが、現在では出版物のデジタル化はほぼ完了していて、新規出版物は「今すぐ」PDFで電子書籍化できるようになっています(オライリーみたいに)。ADPSのような大掛かりで高コストなソリューションを導入しなくても、たいていのインタラクティブ機能は既にここにあります。PDFをスルーしなければならない理由はありません。

2011-11-15

[][][]選択したページアイテムを新規ドキュメントに複製して、アートボードをフィットさせる

D

/*
    duplicate_and_fit_for_selection
    選択したページアイテムを新規ドキュメントに複製して、アートボードをフィットさせる
    for Illustrator CS5
    (c)2011 seuzo
    
   2011-11-15   ver.0.1 とりあえず
*/

#target "Illustrator"

//複数のオブジェクト全体のvisibleBoundsを得る
function get_bounds(my_objs) {
    var my_bounds = my_objs[0].visibleBounds;
    var my_Left = 0;
    var my_Right = 1;
    var my_Top = 2;
    var my_Bottom = 3; 
    for ( var i = 1; i < my_objs.length ; i ++ ) { 
        my_bounds[my_Left] = Math.min( my_bounds[my_Left], my_objs[i].visibleBounds[my_Left]);
        my_bounds[my_Right] = Math.max( my_bounds[my_Right], my_objs[i].visibleBounds[my_Right]);
        my_bounds[my_Top] = Math.max( my_bounds[my_Top], my_objs[i].visibleBounds[my_Top]);
        my_bounds[my_Bottom] = Math.min( my_bounds[my_Bottom], my_objs[i].visibleBounds[my_Bottom]);
    }
    return my_bounds;
}

//メイン
function main(){
    var my_dup = true;//新規ドキュメントを作って複製するモード
    var my_doc = app.documents[0];//ドキュメント
    var my_abi = my_doc.artboards.getActiveArtboardIndex();//インデックス
    var my_ab = my_doc.artboards[my_abi];//アートボードオブジェクト
    var my_objs = my_doc.selection;//選択したオブジェクト。とりあえず、アートボードをまたぐ選択は考慮していない。

    if (my_objs.length > 0) {
        var my_bounds = get_bounds(my_objs);
        
        //複製モードかどうか
        if (my_dup) {
            var new_doc = app.documents.add();//新規ドキュメント
            var new_ab = new_doc.artboards[0];

            //オブジェクトの複製
            for (var i = 0; i < my_objs.length; i++) {
                var tmp_position = my_objs[i].position;
                var tmp_obj = my_objs[i].duplicate(new_doc, ElementPlacement.PLACEATEND);
                tmp_obj.position = tmp_position;
            }
            new_ab.artboardRect = my_bounds;//アートボードの大きさを合わせる
        } else {
            my_ab.artboardRect = my_bounds;
        }
    }
}
main();

2011-09-26

[][][]ルビの検索置換

とあるブログに「InDesignではルビの検索置換ができない」と書いてあった。まあ、確かにできない。誰かが書いているでしょうけれど、JavaScriptだとこんな感じに書けると思います。

var my_find_re = /けん さく も じ れつ/g;
var my_change_str ="ち かん も じ れつ";

var my_doc = app.documents[0];
var my_story = my_doc.stories;
for (var i = 0; i < my_story.length; i++) {
    var my_style = my_story[i].textStyleRanges;
    for (var ii = 0; ii<my_style.length; ii++) {
        my_style[ii].rubyString = my_style[ii].rubyString.replace(my_find_re, my_change_str);
    }
}

▼こういうルビを持ったテキストが...

f:id:seuzo:20110926110753p:image


▼こうなりました

f:id:seuzo:20110926110745p:image

だかしかし、大変遅いです。書籍だと実用に耐えられない遅さかもしんない。

親文字がわかっているなら、まず親文字を検索してそのルビで検索置換すればいいのかな。

var my_find_p = "検索文字列";//親文字
var my_find_ruby = /けん さく も じ れつ/g;
var my_change_str ="ち かん も じ れつ";

////////////////////////////////////////////正規表現検索
/*
my_range	検索置換の範囲
my_find	検索オブジェクト ex.) {findWhat:"(わたく?し|私)"}
*/
function my_RegexFindChange(my_range, my_find) {
	//検索の初期化
	app.findGrepPreferences = NothingEnum.nothing;
	app.changeGrepPreferences = NothingEnum.nothing;
	//検索オプション
	app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
	app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
	app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
	app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
	app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
	app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
	app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

	app.findGrepPreferences.properties = my_find;//検索の設定

    return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す
}

var my_doc = app.documents[0];
var my_texts = my_RegexFindChange(my_doc, {findWhat:my_find_p});
for (var i = 0; i < my_texts.length; i++) {
    my_texts[i].rubyString = my_texts[i].rubyString.replace(my_find_ruby, my_change_str);
}

そこそこ速くなりました。


でもまあ、もっと大量かつ適切に置換する必要がある場合はIDMLとかIDMSにしてRubyString属性を変えればいいのかな。完全互換ではないからよっぽどの必要性がなければやらないでしょうけれど^^

2011-09-13

[][][]ドキュメントを俺設定で開く

ドキュメントを開いた時、グリッドやガイド類が非表示になっていたり、あらぬページが400%拡大で表示されたりすることがありませんか。これらの表示/非表示は設定があちこちに散らばっていていちいち直すのがめんどいです。

「Startup Scripts」フォルダにこのスクリプトを入れておけば、ドキュメントを自動的に俺設定で開くようになります。

/*
show_grids_and_guides.jsx
(c)2011 seuzo
ドキュメントを俺設定で開く

2011-09-12  ver.0.1 とりあえず

*/

#target "InDesign"
#targetengine "show_grids_and_guides"

(function(){
/////設定
var my_bounds = [69,115,1194,1535]; //レイアウトウィンドウの座標値[y1, x1, y2, x2]。自分の好きな大きさに書き換えてください。


function change_view_settings(my_event){
    if (app.documents.length === 0){return;}
    if ((parseInt(app.version) >= 7) &&
        (my_event.eventType === "afterOpen") &&
        (my_event.target instanceof Document)){
        return;
    }
    var my_doc = app.documents[0];
    my_doc.zeroPoint = [0,0];//ルーラー原点を初期値に戻す
    
    var my_layoutWindow = app.layoutWindows[0];
    my_layoutWindow.bounds = my_bounds; //レイアウトウィンドウの大きさを変更
    my_layoutWindow.activePage = my_doc.pages[0]; //ページを1ページ目に変更
    my_layoutWindow.screenMode = ScreenModeOptions.PREVIEW_OFF ; //プレビューモードをオフ(標準モード)にする
    my_layoutWindow.zoom(ZoomOptions.FIT_SPREAD); //表示をスプレッド全体に合わせる
    
    var my_viewPre = my_doc.viewPreferences;
    my_viewPre.rulerOrigin = RulerOrigin.PAGE_ORIGIN; //定規の開始位置を「ページ」に変更
    my_viewPre.showRulers = true; //定規ルーラーを表示
    my_viewPre.showFrameEdges = true;//フレーム枠を表示
    
    //ここはどうせアプリケーションデフォルト
    //var my_generalPre = app.generalPreferences;//?オブジェクトビューアではDocumentのプロパティにも入っているけど、my_doc.generalPreferencesはエラーになるっぽい?
    //my_generalPre.showLiveCorners = false;//ライブコーナーを非表示(CS5〜)
    //my_generalPre.showContentGrabber = false; //コンテンツグラバーを非表示(CS5〜)
    
    var my_guidePre = my_doc.guidePreferences;
    my_guidePre.guidesShown = true; //ガイドを表示
    my_guidePre.guidesSnapto = true; //ガイドにスナップ
    
    var my_CJKguidePre = my_doc.cjkGridPreferences;
    my_CJKguidePre.showAllFrameGrids = true;//フレームグリッドを表示
    my_CJKguidePre.showCharacterCount = true;//文字数を表示
    
    var my_textPre = my_doc.textPreferences;
    my_textPre.showInvisibles = true; //「書式」-「制御文字を表示」
}

app.addEventListener("afterOpen", change_view_settings, false);

})();

変更したくない所は適宜コメントアウトしてください。

レイアウトウィンドウの大きさは、それぞれの環境で好みの大きさが違うので変更する必要があります。設定したい大きさに調整して

var my_layoutWindow = app.layoutWindows[0];
prompt("現在のLayout windowの大きさ\r座標:[y1, x1, y2, x2]", "[" + my_layoutWindow.bounds +"]");

を実行すれば、現在のウィンドウの大きさを得られます。


先日来、EventListenerづいているかもしれませんが、自動表示に関しては4年前に失敗して以来、気になっていたんですよね。EventListenerじゃなくて手動実行型のもので我慢していました。CS5でlayoutWindowが開いた時に反応するようになったので、改めて書いてみました。あ、だからCS5でないと動作しないと思います^^

2011-09-12

[][][]任意のプリフライトプロファイルをイベント駆動で自動実行する

何をするスクリプトか?

通常、作業用のプリフライトプロファイルは「[基本]」になっていますが、細かいチェックをしてくれません。もっと細かくチェックできるプロファイルを作業用にしてしまうと、InDesignアプリケーション全体の動作が遅くなってしまいます。ですから、必要な時だけ別のプロファイルでプリフライトできればいいですね。このスクリプトは

  • ドキュメント開いた時
  • (PDFなどに)書き出す時
  • プリント時
  • 保存時

に任意のプロファイルでプリフライトを自動チェックします。エラーがあればアラートダイアログを表示します。

D


同梱ファイル(2Files)

Readme.txt このファイルです。とにかく最初によんでください。

preflight_check.jsx スクリプト本体です。


使用条件

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが未検証です。


ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS5/index.html#preflight_check


インストールと準備

(1)スクリプトをエディタ等で開き、15行目あたりにあるプロファイル名

var my_profile_name = "[基本]"; //使用するプリフライトのプロファイル名

の「[基本]」の部分をチェックしたいプロファイル名に書き換えます。

(2)スクリプト本体(preflight_check.jsx)を「Startup Scripts」フォルダ

~/Library/Preferences/Adobe InDesign/Version 7.0-J/ja_JP/Scripts/Startup Scripts/

にコピーしてください。エイリアスを入れておくだけでもかまいません。


使用方法

インストール場所さえ間違えなければ、特に使用手順はありません。

プリフライトでエラーがあれば、エラーがあればアラートダイアログを表示します。


既知の不具合、またはToDo



免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshとMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2011-09-11 ver 0.1 とりあえず http://d.hatena.ne.jp/seuzo/20110912/1315797240


コード

/*
preflight_check.jsx
(c)2011 seuzo.jp
ドキュメントを開いた後、プリントする前、書出し前、保存する前に指定したプロファイルでプリフライトチェックをします。
15行目あたりにあるmy_profile_nameにチェックしたいプロファイル名を記入してください

2011-09-11  ver 0.1 とりあえず
*/

#target "InDesign"
#targetengine "preflight_check"

(function(){
//////////////設定
var my_profile_name = "[基本]"; //使用するプリフライトのプロファイル名

function check_preflight(my_event){
    if (app.documents.length === 0){return;}
    if ((parseInt(app.version) >= 7) &&
        (my_event.eventType === "afterOpen") &&
        (my_event.target instanceof LayoutWindow)){
        return;
    }
    var my_doc = app.documents[0];    
    
    ////preflightProfileオブジェクトに変換
    if ((/^\[?(基本|Basic)\]?$/i).test(my_profile_name)) {
        var my_profile = app.preflightProfiles.item[0];//[基本]プロファイルは名前参照できないみたい
    } else {
          ////入力されたmy_profile_nameの名前が存在しているかどうか
         var tmp_str = "[";//すべてのプロファイルを繋げた文字列
         for (var i = 0; i < app.preflightProfiles.length; i++) {
             tmp_str += app.preflightProfiles[i].name + "][";
          }
        if (tmp_str.indexOf(my_profile_name) === -1) {
              alert("「" + my_profile_name + "」プロファイルは存在しません"); 
              return;
         }
        var my_profile = app.preflightProfiles.itemByName(my_profile_name);
    }
    
    /////プリフライトチェックを実行
    var my_process = app.preflightProcesses.add(my_doc, my_profile);
    my_process.waitForProcess();
    var my_results = my_process.processResults;//返事
    my_process.remove();//プロセスをクリーンアップする
    //$.writeln(my_results);

    
    ////エラーがあれば警告ダイアログを出す
    //プリフライトでOKが出ると"None\r\n"が返る(CS5)
    if ((my_results.length < 7) && (/^None/i).test(my_results)) {
        return;
    } else {
        alert("プリフライトエラーです\rプロファイル名:" + my_profile_name);
    }

}//function check_preflight

    app.addEventListener("afterOpen", check_preflight, false);//ドキュメントを開いた後
    app.addEventListener("beforeExport", check_preflight, false);//書出し前
    app.addEventListener("beforePrint", check_preflight, false);//プリント前
    app.addEventListener("beforeSave", check_preflight, false);//保存前
})();