ドキュメント保存時にテキストの文字あふれを警告するスクリプト(プリフライト利用)
元ネタはInDesignの勉強部屋BBSの投稿です。
ドキュメント保存時に、オーバーセットテキストがある場合、アラート表示させる方法はないでしょうか。
プリントやPDF書き出しの際に、表示されるようなアラートです。
プリフライト機能であふれの確認はできますが、そのまま保存ができるのが問題です。
Usukeさんがテキストやセルのオーバーフローをチェックしようと頑張っているので、その方面のアプローチはそっちにお任せするとして、ここではプリフライトを利用する方法について書きます。
というのも、この投稿は「保存時にアラートが出て保存をキャンセルしたい」というだけなので、「アラートが出たらプリフライトパネルで確認する」と解釈できます。なので、プリフライトの使用を前提にしても問題ないはずです。ということで作ってみました。
使い方
- zip圧縮されたファイルをダウンロードします
- そのファイルを解凍してできた「checkOverflowBeforeSave.jsx」を「Scripts Panel」フォルダまたは「StartUp Scripts」フォルダに移動します
- 「Scripts Panel」フォルダに移動した場合は、スクリプトパネル上でダブルクリックして実行します。「StartUp Scripts」フォルダに移動した場合は何もする必要はありません
以上です。
スクリプトの解説
ほとんど以前の記事のコードのままです。保存しようとしたときに実行するためのイベントリスナを仕込んでいるのと、保存を中止する命令(ev.preventDefault())を入れているぐらいです。
/***********************************************************************
保存時に文字あふれがあれば保存を中止する 2024/02/29 version 1.1.2
Copyright 2024 CS5 Omachi
**********************************************************************/
//@targetengine "checkBeforeSave:CS5"
if (app.eventListeners.itemByName("saveEV:CS5").isValid) {
app.eventListeners.itemByName("saveEV:CS5").remove();
}
app.addEventListener(Document.BEFORE_SAVE, overflowCheck).name = "saveEV:CS5";
function overflowCheck(ev) {
var pfp;
for (var i = 0; i < app.preflightProcesses.length; i++) {
if (app.preflightProcesses[i].targetObject == app.documents[0]) {
pfp = app.preflightProcesses[i];
break;
}
}
if (pfp == undefined) {
alert("プリフライトが実行されていません。\r" +
"プリフライトパネルで[基本]プロファイルを選択し、\r" +
"オンにしてください");
ev.preventDefault();
return;
}
if (pfp.description.substring(0, 23) != "State: Results complete") {
alert("プリフライト実行途中です。少々お待ちください");
ev.preventDefault();
return;
}
// 次の行は、プリフライト確認中で結果が取得できない場合は
// 「Error: このプロセスの集計結果は利用できません」という
// エラーになる
var res = pfp.aggregatedResults[2].join("");
if (res.indexOf("オーバーセットテキスト") > -1) {
if (!confirm("文字があふれています。保存を続行しますか?")) {
ev.preventDefault();
}
}
}
18:45 追記
初期のコードでは文字があふれていた場合強制的に保存を中止していました。そのためオーバーセットテキストエラーが解消されるまで保存できない状態でした。しかしそれだと「急に便意を催したときにとりあえず⌘Sして走る」場合にパニックになります。ですから保存するかどうか問い合わせるダイアログに変更しました。
2月29日14:23 追記
プリフライト確認中に保存しようとした場合に「このプロセスの集計結果は利用できません」というエラーが発生していたのを修正しました。それが次の部分です。
if (pfp.description.substring(0, 23) != "State: Results complete") {
alert("プリフライト実行途中です。少々お待ちください");
ev.preventDefault();
return;
}
プリフライトが完了するとpfp.descriptionに「State: Results complete~」という文字列が入りますので、それを利用しています。