見出し画像

Pages+AS本で必要になって追加で強力なScriptを書いた

電子書籍の作成上、どうしても必要だったAppleScriptを書いて使ってみました。


フォント見本の記事が引き起こすPDFの容量増大

いま書いている電子書籍のPages書類上に「フォント見本帳」みたいなページがあって


そのままでも見た目はよいものの……そのままPDF化すると、やたらとたくさんのフォントが埋め込まれてしまい、PDFのサイズが理不尽なレベルまで増大

そのため、テキストオブジェクトではなく「画像」としてPages書類上に配置しておいたほうが、フォント埋め込みが発生しなくていいんじゃないか、という話になりました(1人でお題を出して1人でツッコむ、1人会議)。

コピーした書式付きテキストを画像化

これまでに作ったAppleScriptを一部変更することで、この機能を実現しました。

クリップボードに入っている書式つきテキストの、文字情報、フォント種別、フォントサイズ、描画色を取り出し、その情報を使ってメモリ上の「画像」の上に文字を書き、画像全体を使うと邪魔なので、外周部から空白(透明な部分)をトリミング。

最後に、トリミングした画像をクリップボードに設定。

これで、「コピーした文字」を「画像」に変換したことになります。普通に動きました。

OSの「どこの機能」を「誰」から借りてくるか?

クリップボードに入れた「書式つきテキスト」の情報を、どのように画像化するか?

AppleScript自体にそのような機能はなく、よその機能を持っている何かに依頼することしかできません

その、誰に借りてくるかによって、難易度とか、処理速度とか、応用範囲の広さ、広域への配布時できるかどうかといった話が変わってきます。

楽をしたら、楽をした分だけあとでそのツケを払う必要が発生するというのも、よくある話です。

A. 一番簡単な相手:GUIアプリ。PhotoshopやPixelmator Proなど。購入ないしサブスク契約する必要がある

B. 知識があれば便利な相手:githubで配布されているオープンソースのフレームワーク。SwiftやObjective-C、C++などで記述されているXcodeのプロジェクトを自分でビルドする必要がある。無料

C. ◯◯でも容易にインストールできる相手:各種UNIXコマンド。最初からOSに入っていれば楽。入っていなくても、パッケージシステムでターミナルから楽にインストールできる。無料

D. 手数が増えるが強力な相手:OSの内部機能(Cocoa)。無料

プログラムの作りやすさは、A→C→B→Dの順。

プログラムの実行速度は、B→D→C→Aの順(例外はあるがだいたい)。

他人へのプログラムの配布しやすさは、D→B→A→Cの順。

Mac App Store用アプリ開発時の使いやすさは、D→B→Aの順(Cは依存パッケージのインストールなどが必要で独立したバイナリにするのが、自分にはほとんど無理)。

なので、今回はD+Bで作りました

2時間ぐらいでできたが

必要なものの、あまり作りたいとはいなかったAppleScriptです(利用できるケースが多くなかったから)。でも、冒頭に説明したとおり、これを作らなかったら最終的なPDFのサイズが数十Mバイト増えてしまいます。

利用するには、まずはPages上で何かの1文字をコピーします。ここでは、フォント見本として利用している「永」の字をコピーすることになります。

この直後にAppleScriptを実行すると、クリップボードに入っている書式つきテキストを解釈して、フォント名フォントサイズ文字情報などを取り出します。

この情報をもとに、メモリ上に作成した背景が透明な画像に同じ文字を描画

そのままだと画像が大きすぎるので、外部のフレームワークの機能を呼び出して外周部を切り抜き(トリミング)

得られた画像をクリップボードに設定。

これで、Pages上でフォント見本の文字をコピーしてAppleScriptを実行すると、画像化したものをPages上にペーストできるようになりました。

実際に自分で使ってみたらダルかった

目的のAppleScriptが書けました。めでたいかぎりです。

しかし、何個も処理していると、

「これ、複数のテキストボックスを選択しておくと、全部画像に置き換えてくれたりしてほしいな」

と感じます。

1個1個、瞬時に処理できるのはよいのですが、実際にはそれが数十個存在しているので、複数処理できないと時間がかかってやる気がなくなります。

複数オブジェクトの処理機能がないと実用性がない、という結論です。しょうがない、作るか……。

→ 作りました。埋め込みフォントの数が減って書籍1冊分のPDFが25Mバイトほど小さくなりました


いいなと思ったら応援しよう!