InDesignで圧縮ファイルを操作しよう(^-^)/

 

みなさまお久しぶりでございます。皆様におかれましてはご健勝のことと存じますが、無事年の瀬を乗り切れそうな方もそうでない方もそれなりに過ごしていただければと思う次第です。
わたしどもに関しては自動化フォーラムを消されたり(信じられない!)Communityが散々な出来(なんなんだろうねホントウニ!!!)だったりで、さんざん暴れまわって(だいたい裏で…)いるような次第でございますが、裏でちょろちょろっと(本当にチョットダケヨ)動いていたら暗躍とか言われて心外なのです。
まあ、こみゅにてぃに関しましては(問題はアレだけじゃないけどw)多くの皆様にご意見(罵声)・ご支持(本当か?)を頂き(実際はどうなんだろう?)良い方向に向かっている(多分ダメ)のかどうなのかはわかりません(本当ドウスンダコレ?)が、言う必要のあること(コレオオスギ)は言わせていただく(だいたいは裏で)と言ったスタンス(メンドウですぅ)でこれからも挑もう(多分)とは思うのです(ガンバルルルル)。
と長々と並べ立てているのですが、本題です。ばたばたしている間にAdvent Calendarの季節がやって来てしまったわけでして、この記事は「https://adventar.org/calendars/3958」の1番めのTipsにあたるものという事になります。一番最初ですからゆる〜く行きますねw

InDesignには、いにしえよりUCFを操作する為のメソッドが実装されています。UCFというのはUniversal Container Formatの略であり、そのパッケージは各種情報をお約束に従って集めたものをZIP圧縮してひとつのファイルにまとめたものなのです。(かなり乱暴な解説)で、先のInDesignに実装されているメソッドというのはpackageUCFとunpackageUCFという2つのメソッドです。ちょっとOMVから引用してみましょう。

Application.packageUCF (sourceFolder: File , ucfFile: File ) 
Adobe InDesign CC 2018 (6.0) Object Model 
Package a folder into a UCF file.
sourceFolder: Data Type: File 
The folder to be packaged into an IDML file. Does not validate structure of the folder pursuant to the IDML spec. Caller is responsible for making sure the files in the folder are correctly organized.
ucfFile: Data Type: File 
The destination UCF file. Will be overwritten if it already exists.
Application.unpackageUCF (ucfFile: File , destinationFolder: File ) 
Adobe InDesign CC 2018 (10.2) Object Model 
Unpackage a UCF file into a folder structure.
ucfFile: Data Type: File 
The UCF file to be unpackaged.
destinationFolder: Data Type: File 
The folder where you would like the UCF file unpackaged to. Will be created if it does not exist.

ご覧の通り、これらのメソッドはIDMLを操作するために存在します。注意点としてはpackageUCFの第1引数とunpackageUCFの第2引数はFileオブジェクトではなくFolderオブジェクトが正しいです。まあ、ドキュメンテーションがおかしいのはいつものことですからスルーしておきましょう。そのIDMLが諸々のデータを集めて圧縮をかけた構造をもちますからUCFを扱うということはZIPファイルをあつかう事になるのです。でもって、このメソッド達はそのZIPファイルの中身には頓着しないというおおらかなものなのです。
一旦まとめると、packageは指定フォルダをIDMLの構造を持つと思い込んで圧縮する事ができて、unpackageの方は指定ファイルをIDMLだと思い込んで展開してくれるのです。はい、すご〜く便利そうだと思うでしょ???
ですから、今回はunpackageUCFメソッドを利用して何が出来るのかを考えてみました。

1.IDMLファイルの展開
当然のごとくIDMLファイルを展開することが可能です。その為のメソッドなのですから当たり前ですね。

2.zxpパッケージの展開
実はCEPエクステンションのインストール用パッケージであるzxpファイルもこのUCFに準拠した構造を持つアーカイブなのです。CEPの前身であるCSSDKの時代にはucf.jarを利用してzxpを操作していました。びっくりするほどそのまんまですね。InDesignに実装された、これらのメソッドはzxpファイルを操作する為に適したものでもあります。展開したフォルダは例のextensionsフォルダに投入すると各アプリケーションに認識させることが可能です。

3.zipファイルの展開
このunpackageUCFはパッケージ構造を検証しません。ですから圧縮ファイルをそのまま展開してしまいます。ちょっと便利です。

4.docxやxlsx、pptxの展開
新しいオフィス・スィートのファイルフォーマットがマイクロソフトの皮を被ったzipファイルだと言ったのはかなり以前の話で、このネタでわたしの存在を認識知ったって方は相当数いるとおもわれるのですが、これらのファイルも拡張子の変更なしに扱うことが出来ます。まあ、マイクロソフトの皮を被ったzipファイルですからねw

とまあ、その他にも色々とあるのですが、DTPerの守備範囲ではこれぐらい出来るようになれば、そこそこ便利ツールと言えるのではないかと思います。
スクリプトは以下です。

(function(){
var f = File.openDialog("Please select your archive.");
f.fsName.match(/(.+?)\.|docx$|xlsx$|pptx$|zip$|idml|/);
var fdr = new Folder(RegExp.$1);
if (!fdr.exists) fdr.create();
else return;
app.unpackageUCF(f, fdr);
})();

InDesign用のスクリプトですからInDesignのスクリプトパネルに放り込んで、そこから実行します。
動作的には圧縮ファイルを選択したら同一階層に同一名称のフォルダ(拡張子なし)が生成されてそこに圧縮ファイルが展開されるというかんじです。もしその階層にに同じ名前のフォルダが存在した場合は展開をあきらめます。その際は予め圧縮ファイルまたはフォルダ名称を変更しておきましょう。
スクリプトを保存するのが面倒な人は以下のGistからドウニュウシテモイイヨ(^-^)/

https://gist.github.com/ten-A/625a178e9972328dfaa4c2575cc6b28c

「ワタシチョットスクリプトカケル」な人はpackageUCFを利用してフォルダを圧縮したりしてみてください。以下にリファレンス的なものを置いておきます。

var fdr = Folder.selectDialog("Choose Target Folder.");
app.packageUCF(fdr, File(fdr.fsName+".zip"));

ただし、基本的にIDMLを作るための機能ですから圧縮時には「application/vnd.adobe.indesign-idml-package」と記述されたmimetypeファイルも添付されてしまいます(^-^;
ちなみにですが、MacOS側で圧縮したマルチバイトで名前を付けられたファイル名はWindowsで処理すると文字化けしますw
この事から実装されているコードは各OS依存のライブラリを利用していて挙動についても差異があるだろうことが予想されるのです。
こちらも以下のGistからダウンロード可能です。

https://gist.github.com/ten-A/4ad932ab9516b3b8365fd00bd6db6f6a

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中