Translation:Cookbook contents/ja
From IDMLWiki
Adobe InDesign CS4 IDML Cookbook
はじめに
このドキュメントは、InDesign Markup Language (IDML)と呼ばれる、Adobe InDesign CS4用マークアップ言語の使用方法についてまとめたものです。IDMLとパッケージファイルフォーマットの公式文書である、「IDML Language Specification」とともにご使用ください。
IDMLは、XMLベースフォーマットでInDesignのコンテンツを記述します。基本的に、従来のInDesignによるXMLベースファイルフォーマットである、INXを大きく改訂したものです。IDMLは、INXの持つ欠点への対処と、人間が読めるフォーマット(経験のあるXMLプログラマーであれば、アセンブルと逆アセンブルに支障ないレベル)でInDesignコンテンツを表現することを目標に、つくられました。
IDMLは何に使えるの?
IDMLの構文は、次のアプリケーションで使用されています。
- IDML書き出し(*.IDML)
- ライブラリ(*.INDL)
- スニペット(*.INDS)
- InCopyストーリー(*.ICML)
- InCopyアサインファイル(*.ICMA)
IDMLファイルは完全なInDesignドキュメントです。ZIPアーカイブ(正確にはUCF)であるため、「パッケージ」と呼びます。パッケージには、たくさんのInDesignドキュメントのパーツを表している、XMLファイルが階層化されています。同じXML表記は、単一テキストファイル(階層のない)であるInCopyストーリーファイルやスニペット、アサインファイルにも使われています。これらのファイルはZIPではなく、単一のXMLファイルで、特定のコンテンツを再構成するために必要な、すべてのエレメントを含んでいます。
どうやってIDMLをInDesignの外部で使うの?
IDMLは、InDesignコンテンツの精査と構成を、InDesignを使わずに容易に行えるよう、設計されています。SDKにある、IDMLToolsのサンプルコードに、たくさんの例と、再利用できるコンポーネントがあり、IDMLをInDesignの外部で使用するときに便利です。
IDMLToolsって何?
IDMLToolsには、サンプルコード、ツール、再利用できるJavaクラスがあります。スキーマを有効にしたり、パッケージを検査、圧縮、解凍したりする、単独のツールもあります。IDMLToolsのサンプルコードで、データの収集や抽出、変更、追加でIDMLを生成する、デモを体験できます。これらのサンプルコードのほとんどはXSLTが使われ、一般的なJavaクラスのセットでビルドされています。
IDMLToolsのサンプルコードはどこにあるの?
IDMLToolsのサンプルコードは、InDesign CS4 Products SDKに含まれています。
<SDK>/devtools/sdktools/idmltools
(もしくは<IDMLTOOLS>)
IDMLToolsのセットアップに必要なもの
IDMLToolsのセットアップには、次の2つの方法があります。
- IDMLToolsディレクトリの場所を含む環境変数IDMLTOOLS_HOMEを作る
- システムパスに<IDMLTOOLS>/binを追加する。これでどのディレクトリからも、IDMLToolsプログラムを実行することができる
Windowsでは、環境変数はシステムのプロパティで設定します。システムのプロパティはコントロール パネルからか、またはマイ コンピュータを右クリックしてプロパティを選択すると表示されます。システムのプロパティで詳細設定タブを選択し、環境変数を押します。
Mac OSでは、環境変数を設定するいくつかの方法があります。Bash(デフォルトターミナル)を使用しているなら、シェル始動ファイルに追加できます。~/.bashrcファイルを探してください。(Finder上ではドットファイルは見えません)次に、以下の変数を定義してください。
export IDMLTOOLS_HOME="/sdk/devtools/sdktools/idmltools"
export PATH="$PATH:$IDMLTOOLS_HOME/bin"
あなたのidmltoolsパスに合わせて内容を変えてください。この設定を有効にするために、シェルを再起動させてください。
IDMLファイルにあるもの
サンプルプログラム「Hello World」の次は、「Hello World」パッケージをみてみましょう。SDKの<IDMLTools>/samples/helloworldディレクトリに、下記の2つのパッケージがあります。
- InDesignによって作成されたhelloworld-1.idml
- テキストエディターで作成された、ミニマルなIDMLファイルであるhelloworld-2.idml
これらのファイルのコンテンツを表示するには、解凍する必要があります。IDMLToolsがセットアップされていれば、パッケージツールを使って解凍できます。手順は次のとおりです。
Windows
package.bat -d helloworld-1.idml helloworld-1 package.bat -d helloworld-2.idml helloworld-2
Mac OS
package.sh -d helloworld-1.idml helloworld-1 package.sh -d helloworld-2.idml helloworld-2
InDesignのIDML書き出し(helloworld-1.idml)では、各ストーリーファイル、スプレッドファイル、マスタースプレッドファイルを含むIDMLパッケージファイルすべてのタイプが意図的に含まれます。「Helloworld-1」の場合は下記のファイルです。IDML File Format Specificationに説明があります。
- designmap.xml
- mimetype
- MasterSpread_uc4.xml
- container.xml
- META-INF\metadata.xml
- Resources\Fonts.xml
- Resources\Graphics.xml
- Resources\Preferences.xml
- Resources\Styles.xml
- Spreads\Spread_ubd.xml
- Stories\Story_ud5.xml
- XML\BackingStory.xml
- XML\Tags.xml
それぞれのファイル内で、各プロパティは設定されています。designmap.xmlファイルは300行以上あります。各プリファレンス、スタイルおよびスウォッチはResourcesフォルダ内のファイルに記述されています。これは、空のドキュメントであらゆるプロパティを設定するスクリプトを書いて、さらに新しいコンテンツのあらゆる可能なプロパティを設定することにおよそ等しいことです。これは意図的なもので、デフォルトが異なる環境でドキュメントを開いても、結果が変わらないようにするためです。
InDesignのIDML書き出しが冗長である一方、読み込みはとても柔軟に設計されています。属性がすべて設定されている必要はありません。ないものは、デフォルト値が割り当てられます。helloworld-2.idmlファイルには、たった2つのXMLファイルしかなく、エレメントと属性の設定も少なめです。これは、デフォルト値を利用したスクリプティングです。例えば、ほんの数行のコードでテキストフレーム1つを含む、1ページ分のドキュメントを作成することができます。そのようなスクリプトには、プリファレンスやスタイル、スウォッチなどへの関連が必要ありません。アプリケーションのデフォルト値がきちんと設定されるからです。これは、InDesignが書き出すものに比べて、はるかに短いスクリプトです。
Helloworld-2は、Helloworld-1と比べるととてもシンプルです。designmap.xmlファイルは数行しかありませんが、idPkg:SpreadとidPkg:Storyエレメントを使うことにより、スプレッドとストーリーファイルドキュメントのエレメントを含んでいます。
<?xml version="1.0" encoding="utf-8"?><?aid style="50" type="document" readerVersion="6.0" featureSet="257"?><Document xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0" Self="d"><idPkg:Spread src="Spreads/Spread_spread1.xml"/><idPkg:Story src="Stories/Story_story1.xml"/></Document>
その他の重要なコンテンツはスプレッドファイルとストーリーファイルです。ストーリーファイルはシンプルです。idPkg:Storyエレメント内のStoryエレメントに、ストーリーのIDとなるSelf属性があります。これを使って、パッケージ中でならばどこでも、テキストフレームにストーリーを参照させることができます。スプレッドファイルでも可能です。Storyエレメントには「Hello World」というテキストがあります。このテキストは、デフォルトのテキスト属性で書式設定されています。
<?xml version="1.0" encoding="utf-8"?><idPkg:Story xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0"><Story Self="story1"><Content>Hello World!</Content>
</Story></idPkg:Story>
スプレッドファイルもシンプルです。ただし、いくつか説明が必要です。まずはコードをみてみましょう。
<?xml version="1.0" encoding="utf-8"?><idPkg:Spread xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0"><Spread Self="spread_1" PageCount="1"><TextFrame Self="textframe1" ParentStory="story1" ContentType="TextType" ItemTransform="1 0 0 1 -612 -396"><Properties><PathGeometry><GeometryPath PathOpen="false"><PathPointArray><PathPoint Anchor="36 36" LeftDirection="36 36" RightDirection="36 36"/><PathPoint Anchor="36 186" LeftDirection="36 186" RightDirection="36 186"/><PathPoint Anchor="172 186" LeftDirection="172 186" RightDirection="172 186"/><PathPoint Anchor="172 36" LeftDirection="172 36" RightDirection="172 36"/></PathPointArray></GeometryPath></PathGeometry></Properties></TextFrame></Spread></idPkg:Spread>
ストーリーファイルと同様、スプレッドファイルのドキュメントエレメントはidPkgネームスペースにあります。実際のSpreadエレメントには、Self属性によりユニークIDが与えられています。PageCount属性でスプレッドのページ数をコントロールしています。この属性がないと、デフォルトのページ数になります。ItemTransform属性は重要です。スプレッドが複数あるとき、どのIDMLドキュメントでもみられるように、各スプレッドはペーストボード上で縦方向に並びます。pagebuilderサンプルでも、テンプレートからそのようなドキュメントを生成します。
スプレッド内には、テキストフレームエレメントが1つあります。このフレームはParentStory属性を使うことにより、ID「story1」をもつストーリーと同一です。このストーリーファイルをみると、この値がストーリーのIDに定義されていることがわかります。TextFrameには独自のItemTransform属性もあります。もしこの属性に、恒等行列(“1 0 0 1 0 0”)と呼ばれる特別な行列が設定されると、座標原点はスプレッド中央になります。上記のTextFrameのItemTransform属性は、座標原点を左ページの左上隅に戻しています。ページ幅が612pt、高さ792ptなので、座標原点はノド中央(デフォルトではページの右側)から612pt左へ、ページ高さの半分(396pt)上に動きます。pagebuilderサンプルに、様々な閉じかたの複数ページスプレッドでのデモがあります。
PathPoint配列はTextFrameの配置を指定します。IDML File Format Specificationに、これらのエレメントの説明があります。
IDMLデフォルトとは?
IDMLファイルをスモールスクリプトにして、アプリケーションのデフォルト値を使うことは望ましくありません。デフォルトが異なる環境では、違う結果になってしまう可能性があるからです。このような事態を避けるために、IDMLでは静的なデフォルトのセットを次のファイルに保持しています。
<InDesign>/Presets/Default/Predef.iddx
このファイルは常にすべてのIDMLファイルの直前に読み込まれ、デフォルトの一貫性を保障します。アプリケーションのインストール直後に、空のInDesignドキュメントを新規作成したときと、同じ値です。
意図的に、Predef.iddxファイルには拡張性がなく変更できません。静的なファイルなので、プラグイン設定で再生成されることはありません。また、InDesignによりIDML中に参照させることもできません。
IDMSファイルとは?
IDMSは、IDMLに基づいたスニペットのための新しい拡張機能です。スニペットは単一のXMLファイルで、InDesignドキュメント中でのコンテンツのサブセットが記述されています。IDMLベースのスニペットは単一ファイルで(パッケージではありません)、IDMLを用いてコンテンツを記述します。スニペットについてはAdobe InDesign Proguramming GuideのSnippet Fundamentalsの章を参照してください。
スニペットが何かを理解するのにいちばんよい方法は、いくつかのページオブジェクトをInDesignドキュメントで作成して、スニペットとして書き出すことです。つまり、スニペットにはすべてのオブジェクトと、オブジェクトのセットを新規ドキュメントで再構成するのに必要なプロパティがすべて含まれているということです。アプリケーションはこれらの従属関係を決定し、書き出しに追加します。スニペットはとても冗長で、フルに書き出されたIDMLと似たような感じです。パッケージの読み込みのように、単純化したファイルにすることも可能です。ただし、すべての従属関係はスニペット内にあるということに注意してください。
ICMLファイルとは?
ICMLは、IDMLに基づいたInCopyスニペットのための新しい拡張機能です。この特別なスニペットには、InCopyストーリーを再構成するために必要なプロパティとオブジェクトが含まれています。
ICMAファイルとは?
ICMAは、IDMLに基づいたInCopyアサインファイルのための新しい拡張機能です。
IDMLはクローズドなファイルフォーマットなの?
いいえ。IDMLはオープンファイルフォーマットです。Language Specificationに書かれているように、スクリプティングに基づいています。どのプラグインでも、スクリプティングモデルを拡張でき、そうすることによってIDMLを拡張できます。大まかに言えば、オブジェクトのスクリプティングがエレメントになり、プロパティのスクリプティングが属性か子エレメントになります。例外もありますが、それについてはLanguage Specificationに詳しい説明があります。
エレメントと属性の名前はJavaScriptの記述方法と同じです。例えば、Frame Label SDKサンプルではページオブジェクトにプロパティを追加しています。このことは、続く属性をすべてのページオブジェクトエレメントに追加することと同じです。これらの特殊な値はTextFrameエレメントに追加され、UIでの設定とも一致します。
FramelabelString="My Frame Label" FramelabelSize="12" FramelabelVisibility="true" FramelabelPosition="FrameLabelBottom"
INXはまだ使えるの?
はい。INXはCS4でも使用できます。将来的にはなくなるかもしれませんが、いつくかのCS4の機能でサポートされます。
INXは何に使えるの?
INXは書き出し形式(InDesign CS3互換形式)として使用可能です。スニペットの書き出しを、ISnippetExportインターフェースでプログラム的に行うときのオプションとしても使用可能です。また、アプリケーションプリファレンスの読み込み/書き出しをサポートするISnippetExport::ExportAppPrefs()メソッドでは、INX形式の書き出しのみが考慮されています。
大半のUI機能では、INXとIDMLのどちらかを選択することができます。例えば、IDMLでの作業環境を選択すれば、CS4では最適な結果が得られるでしょうし、INXベースの割り当てファイルを選択すれば、InDesign CS3互換形式としてのファイルになります。
IDML Schema 妥当性検証
IDMLはスキーマによる妥当性検証をサポートして設計されています。RELAX NG の Compact形式が、その表現力、単純性、そして読みやすさのため選ばれています。RELAX NG の詳細はエリック・バン・デル ブリストの 「RELAX NG」 (O'Reilly Media, Inc, 2003)を読んでください。
InDesignのIDMLサポートはスクリプティングモデルの上で確立され、サードパティのプラグインで拡張もされます。このことは、一つの静的なスキーマで記述することはできないことを意味しています。それどころか、スキーマは固有のプラグインの構成に適合させて生成されなくていけません。これをサポートするために、InDesignは実行時にスキーマを生成する手段を提供しています。
どうやってスキーマを生成するのですか?
解決方法:<IDML-Tools>/scripts のディレクトリーにある GeneratePackageSchema.jsx と GenerateSchema.jsx スクリプトを使いなさい。
2つのタイプのスキーマがあります。1つはIDMLパッケージに対して使うもの。もう一つはパッケージではない(例えば個々のXML)ファイルに対して使うものです。app.generateIDMLSchema (JavaScript) イベントはこれら2つのどちらのタイプ用にも書いてあります。(app.generateIDMLSchemaイベントを使うには)2つの引数を使います。
- スキーマを保存するディレクトリーパス。
- パッケージ用か非パッケージ用か、どちらが生成されるかをコントロールする真偽値。
例えば、次のJavaScriptはパッケージ用スキーマが生成されます。
app.generateIDMLSchema(Folder("/idml-schema/package"), true);
そして、次は非パッケージ用スキーマを生成します。
app.generateIDMLSchema(Folder("/idml-schema/single"), false);
両スキーマタイプ共に、datatype.rncと呼ばれる共有のファイルを含みます。このdatatype.rncファイルは、両スキーマ, common data type仕様において同等です。
非パッケージ用スキーマは2つのファイルで構成します。datatype.rnc というXMLファイルと IDMarkupLanguage.rnc というスキーマファイルです。datatype.rncファイルは IDMarkupLanguage.rnc によって組み込まれます。
パッケージ用スキーマは下に羅列した複数のスキーマファイルで構成します。IDMLパッケージに含まれているそれぞれのXMLファイルに対応したスキーマファイルがあります。
- datatype.rnc
- designmap.rnc
- MasterSpreads\MasterSpread.rnc
- Resources\Fonts.rnc
- Resources\Graphic.rnc
- Resources\Preferences.rnc
- Resources\Styles.rnc
- Spreads\Spread.rnc
- Stories\Story.rnc
- XML\BackingStory.rnc
- XML\Mapping.rnc
- XML\Tags.rnc
ほとんどの場合、パッケージのXMLファイルとスキーマファイルとの間で1対1の関係があります。例えば、designmap.rnc は designmap.xmlファイルの何が正当もしくは有効なのかが記述されています。パッケージはstory、spread、それからmasterspread と様々な名前のXMLファイルを含む事ができます。Story.rnc、Spread.rnc、そして MasterSpread.rncファイルで妥当なものは何かを記述しています。
どのようにしてIDMLファイルは検証するのですか?
解決方法:IDMLTools内に用意してある validation tool を使いなさい。
- IDMLTools ReadMe file に説明してあるように、IDMLToolsをセットアップしてください。
- 11ページの「どうやってスキーマを生成するのですか?」を参照して2つのスキーマを生成してください。
- <IDMLTOOLS>/bin 内のプラットフォームに適したスクリプトを実行しなさい。
IDMLToolsにはJingベースの検証ツールがあります。Jingは、RELAX NG のcompact形式をサポートしたJavaベースのオープンソース、スキーマ検証パッケージです。IDMLToolsスキーマ検証ツールはcom.adobe.idml.Validatorクラスの中で実装されています。それはJavaかもしくはコマンドラインから実行することができます。
非パッケージのIDMLファイルの検証は技術的にとても単純です。単体のXMLファイルを検証するのと同じ事です。Jingだけで実行するので単純なことです。Validatorクラスを使う事がほんとうのメリットとなるのはパッケージファイルを扱う時です。validationツールは自動的にテンポラリーディレクトリーへ解凍し、それぞれのファイルを検証します。RelaxNG上では記述できない追加された検証も含んでいます。例えば、すべてのパッケージファイルが存在しているかをチェックします。
プラットフォームごとのシェルスクリプト(Windows用にはvalidate.bat、Macintosh用にはvalidate.sh)の内部で、クラスファイルのパスと実行するValidatorクラスをセットします。これらのスクリプトは次の場所にあります。
<IDMLTOOLS>/bin
ヒント:検証を簡単に実行するには、あなたの環境変数のPATHに <IDMLTOOLS>/bin を加え、他のディレクトリーから実行すると良いでしょう。これはすべてのスクリプトが環境変数IDMLTOOLS_HOMEを使うように構成されているからです。
パッケージや非パッケージファイルを検証するには2つの引数と共に実行します。第一引数はスキーマのパスです。第二引数は検証対象のパスです。(idmlパッケージファイル、もしくは展開したフォルダのパス。スキーマが非パッケージタイプならxmlファイルなど)Javaのクラスは、それがパッケージを処理するのか非パッケージファイルを処理するのかを決め、実際に検証するためにJingを呼び出します。
Windows:
validate.bat c:¥idml-schema¥package-schema MyFile.idml validate.sh c:¥idml-schema¥non-package-schema MyStory.icml
Mac OS:
validate.sh /idml-schema/package-schema/ MyFile.idml validate.sh /idml-schema/non-package-schema/ MyStory.icml
使い方を確認するには、-h オプションを使ってスクリプトを実行してください。
$ validate.sh -h Usage: Validator SchemaPath PackagePath [PackagePath...]
IDMLの作業のためにAdobeはどんな外部ツールをお薦めますか?
IDMLで仕事をするためにはZipソフトウェアが必要になります。WinZipのような市販のZipアプリケーションが良いのすが、The InDesign CS4 Products SDK はIDMLパッケージの圧縮・解凍をするためのフリーのJavaベースのライブリーとアプリケーションを提供しています。
IDMLの作業をするにあたり、便利なXMLエディターを用意することは重要です。私たちは IDMLを扱う上でとても効率的なエディター Oxygen XML Editor を見つけました。そのエディターは Compact RELAX NG schema をサポートする上、IDMLをZipファイルに圧縮した後に、IDMLパッケージの中を直接見る事ができます。このZipファイルサポートはIDMLのテストをより容易にします。あなたはIDMLパッケージの中のファイルを直接見て、編集することができます。ファイルが保存された時、パッケージが更新されます。
“Eclipse Zip Editor” と呼ばれる Eclipse用のオープンソースのプラグインがあります。このプラグインは Oxygenで市販されているのと同じような体験ができます。
メモ:Zipアーカイブのサポートは Oxygen version 9.3 で追加されました。もしあなたがOxygenを購入するなら、定期的に新しい機能を追加してくれるようなメンテナンスパックを購入すると良いでしょう。
SDKにはどんなツールが入っていますか?
The InDesign Products SDK はJavaBaseのツール、ソースコードやIDMLでのあなたの作業をお手伝いするサンプルが入っています。IDMLツールと呼ばれる、このコードのコレクションは次のディレクトリーに格納されています。
<SDK>/devtools/sdktools/idmltools
IDMLツールを使う前に、次のセットアップ作業を終えてください。
- IDMLToolsを、あなたのハードドライブのどこでも良いのでコピーしなさい。
- あなたの環境設定の PATH に <IDMLTOOLS>/bin を追加しなさい。
- あなたの環境設定に、IDMLToolsのディレクトリーのパスを記述した IDMLTOOLS_HOME を追加しなさい。
これらのセットアップ作業は、IDMLToolsの中にある Readmeファイルにもっと詳しく書いてあります。
<IDMLTOOLS>/Readme.txt (<IDMLTOOLS>/InDesign CS4 IDML ReadMe.pdf ではないのか?)
Javaのコードの構成(Javaのライブラリーを使うためのAPIのリファレンス)は JavaDocs に記述されています。JavaDocsを手に入れるには次のファイルを解凍してください。
<IDMLTOOLS>/docs.zip
最後に、いくつかのサンプルプロジェクトファイルが次のディレクトリーにあります。
<IDMLTOOLS>/samples
IDMLファイルのスキーマチェックが合格しているのに、期待どうりに動かなかったらどうすればよいでしょうか?
解決方法:スクリプトエラーを見るには INXErrorLogging sample を使いなさい。(sampleの意味がわかりません)
INXのように、IDMLは予想外のデータやスクリプトエラーは寡黙に無視するように設計されています。これは古いバージョンや見当たらないプラグインがあってもファイルを開くことが出来るようにしているからです。しかしながら、この寛大な挙動はIDMLファイルのデバッグ作業を困難なものにしています。しかしプラグインを通してあなたはエラーを捕らえることができます。IINXErrorHandler interface の実装によって提供されています。INXErrorLogging sample がこのインターフェイスとエラーログのファイル書き出しの方法を説明しています。あなたは適切なデバッギングツールを見つけることでしょう。
INXErrorLoggingプラグインは、InDesign、InCopy、それからInDesign Serverの間で互換性のある唯一のプラグインです。次のJavaScriptはOSに依存しないファイルパス形式でログファイルの保存場所の指定を可能にします。
app.inxerrlogOn = true; app.inxerrlogPath = File("/c/temp.txt");
無効にするには:
app.inxerrlogOn = false;
添付のユーザーインターフェイス・プラグインである INXErrorLoggingUI もあります。InDesignのメニュー経由で INXErrorLogging sample を有効・無効にします (Plug-Ins -> SDK -> INXErrorLoggingUI -> Install INX Error Handler[US])。メニューでログ機能を有効にする時はログファイルを選択するためのダイアログが表示されます。エラー情報にアクセスする方法を得ることは、IDMLファイルのデバッギングをする時にとても便利です。スキーマによる検証と平行して、あなたが作成したIDMLファイルに含まれる問題点をデバッギングするのに役立ちます。INXErrorLogging sample は InDesign CS4 Products SDK の中にあります。ビルドしたプラグインを InDesignのアプリケーションの plug-insフォルダーにコピーしてください。
InDesignでディレクトリーからパッケージを生成するにはどのようにすればいいのですか?
解決方法:スクリプトで packageUCF と unpackageUCF イベントを使いなさい。
IDMLパッケージを解凍するには
var fromIDMLFile = new File( "~/Desktop/blankDoc.idml" );
var toFolder = new Folder( "~/Desktop/blankDocUnpackaged" );
app.unpackageUCF( fromIDMLFile, toFolder );
ディレクトリーをパッケージにするには
var fromFolder = new Folder( "~/Desktop/blankDocUnpackaged" );
var toIDMLFile = new File( "~/Desktop/blankDocUnpackagedRepackaged.idml" );
app.packageUCF( fromFolder, toIDMLFile );
InDesign以外でIDMLパッケージを生成するにはどうすればいいですか?
解決方法:com.adobe.idml.Packageクラスを使いなさい。
IDMLパッケージは完全に「the IDML Language Specification」に説明されています。これらのファイルはAdobe UCF(Universal Container Format)です。UCFはZipでアーカイブされています。Zipファイルにする上でUCFファイルはいくつかのルールに従っています。
アーカイブを生成する時のルールは次のとおりです。
1.アーカイブのトップ階層には mimetype という名の圧縮されていないファイルがなければいけません。そして、そのファイルは次の内容を含んでいなければいけません。
application/vnd.adobe.indesign-idml-package
2.META-INFディレクトリーはUCFとして要求されたファイルを含むことができます。IDMLは2つのファイル(container.xml と metadata.xml)を利用します。container.xmlにはファイルタイプとルート・ファイル(desinmap.xml)を記述します。metadata.xmlはXMP metadataを格納しています。
3.「the IDML Language Specification」で記述されているように、ファイルのディレクトリーはアーカイブのトップレベルの階層に存在していなくてはいけません(よくやる間違いはサブディレクトリーに入れたファイルを圧縮することです)。例えば、 mimetype META-INF/container.xm META-INF/metadata.xml designmap.xml MasterSpreads/MasterSpread_A.xml Resources/Fonts.xml Resources/Graphic.xml Resources/Preferences.xml Resources/Styles.xml Spreads/Spread_spread1.xml Spreads/Spread_spread2.xml Stories/Story_story0.xml Stories/Story_story1.xml XML/BackingStory.xml XML/Mapping.xml XML/Tags.xml
4.Zipファイルはウィンドウズ用でも構成要素としてして(/)を含むUnixパスで生成してください。Javaを使えば、ウィンドウズ上でも ¥ セパレーターを使ってZipファイルを生成することができます。しかしInDesignはそのファイルを使えません。パッケージ内にこのようなファイルが存在するという事実は、初期実装時の障害となっています。IDMLの研究の最初の段階は、パッケージの検証とアーカイブファイルをどうやって扱うかを決めることです。
IDMLToolsには、Javaの組み込みのZipサポートを使った圧縮・解凍の実演をするコードが入っています。パッケージの取り扱い方は the com.adobe.idml.Package class を見て理解してください。コマンドライン版のJavaクラスはスクリプトで使うことができます。これらのツールのセットアップと使い方が the IDML ReadMe file に解説してあります。
また、InDesignはファイルシステム上にあるファイルからパッケージを作るためのスクリプティングサポートも提供しています。
最後に、あなたはWinZipのような市販のZIP規格に準拠した容易に入手可能なソフトウェアを使うことができます。WinZipはInDesignとの互換性を示してくれますが、階層をコントロールしながらアーカイブに個々のファイルを圧縮していくのは難しいです。この問題に対処するには、あなたは最初に圧縮されていないmimetypeファイルだけを含むZipファイルを生成することです。それから残ったファイルを追加します。
もし単純にファイルをInDesignへ送り込むのなら、これらはすべて不必要なことだと思うかもしれません。しかし、もしあなたがAdobe Bridgeの中で正しくXMP metadataを公開し、一流の市民として振る舞いたいなら、これらのルールには従わなくてはいけません。
(以下 項目3の補足。PDFには含まれていません)
root
├ mimetype
├ META-INF
│ ├ container.xm
│ └ metadata.xml
├ designmap.xml
├ MasterSpreads
│ └ MasterSpread_A.xml
├ Resources
│ ├ Fonts.xml
│ ├ Graphic.xml
│ ├ Preferences.xml
│ └ Styles.xml
├ Spreads
│ ├ Spread_spread1.xml
│ └ Spread_spread2.xml
├ Stories
│ ├ Story_story0.xml
│ └ Story_story1.xml
├ XML
│ ├ BackingStory.xml
│ ├ Mapping.xml
│ └ Tags.xml
レシピとポイント
スプレッドとページ
既存のIDMLドキュメントにスプレッドを追加する
- 「Spreads」ディレクトリに、XMLファイルを1つ追加する。例えば「MySpread.xml」。
- 追加したXMLファイルに、コンテンツを追加する。シンプルな例は「IDMLファイルにあるもの」を参照。
- SpreadエレメントのItemTransform属性は設定しないこと。スプレッドの順番に基づいて、自動的に算出される。
- designmap.xmlファイルに、追加したスプレッドのためのidPkg:Spreadエレメントを追加する。実際のスプレッドの順番は、designmap.xmlファイルでの参照順で決定される。例えば、
<idPkg:Spread src="Spreads/Spread_spread1.xml"/>
スプレッドにページを追加する
- スプレッドのSpreadエレメントのPageCount属性を、新しいページ数に設定する。
- 新規ページの位置にページのエレメントを追加する。空でも可。またはページプロパティを指定する。
ページの綴じかたをコントロールする
ページの綴じかたは、SpreadエレメントのBindingLocation属性でコントロールされています。BindingLocation属性値よりインデックスが小さいページは、すべて左ページです。大きいページは右ページです。BindingLocation属性とページインデックスは、ゼロベースです。
サンプルPage Builderは、複数ページのスプレッド作成と、綴じかたのデモです。
ページオブジェクト
ページ座標にページオブジェクトを追加する
デフォルトでは、ページオブジェクトはスプレッド座標にあります。座標原点はノド中央にあります。ページ座標で扱う方が容易なときは、IDMLでページオブジェクトのItemTransform行列を調整します。考えかたとしては、座標原点をスプレッドの中央からページの左上端に移動するということです。手順は次のとおりです。
- ゼロ基点のページ綴じかたを決める。(上述)
- ゼロ基点のページインデックスを決める。
- ページ幅を決める。
- ページ高さを決める。
- x(水平)方向の移動距離を計算する。 xTranslation = (pageIndex - pageBinding) * pageWidth
- y(垂直)方向の移動距離を計算する。 yTranslation = pageHeight /2
- yTranslationを追加する。
例えば、下記のTextFrameは左ページにあります。従って水平方向に-612pt、垂直方向に-396pt移動されます。座標原点はノド中央から左に612pt、上に396pt移動されます。
<TextFrame ... ItemTransform="1 0 0 1 -612 -396">...
<PathPointArray><PathPointType Anchor="36 36" LeftDirection="36 36" RightDirection="36 36"/>...
このパターンは、Page Builderのspread.xslファイル(pagebuilder/xsl/Spreads/spread.xsl)など、たくさんのサンプルで使われています。
線、パスまたはシェイプの追加
パスとシェイプを表すエレメントは多数あります。GraphicLineエレメントは直線を、Ovalエレメントは楕円形を、Rectangleエレメントは長方形を表します。不規則なパスとシェイプはPolygonエレメントで表されます。これらのタイプにはパスポイントの配列が含まれ、オープンにしたりクローズにしたりすることができます。
画像の追加
画像はシェイプのエレメントかPolygonエレメントの子エレメントです。シェイプまたはポリゴンのType属性値は「GraphicType」で、Imageエレメントが最後の子エレメントとして追加されます。このエレメントにはたくさんの属性と子エレメントが含まれていますが、最も重要なことはLinkエレメントが子エレメントとして含まれ、配置画像の実データへのアクセスが記述されています。
いくつかのサンプルに、配置画像の例があります。Page Builderではドキュメントをゼロから作成して、そこにJPEG画像を追加します。Add Catalog Pagesではスプレッドに複数の画像を追加します。Replace Imagesでは、画像のLinkエレメントの抽出と変更を行います。
フレームに合わせた画像の調整
IDMLでは、フレームに合わせた画像の調整を行いません。ページオブジェクトのFrameFittingOptionエレメントでコントロールされる、フレーム調整機能があります。これはIDML読み込み時に自動的にフィットする機能ではありません。UI上で画像が配置されたときの振る舞いをコントロールします。
サンプルには画像をフレームに合わせるテクニックのデモがあります。手順は、
- 長方形の境界を画像の形状に合わせる。長方形のサイズは任意だが、画像と同じ形状にする。
- 画像のエレメントのItemTransform属性を「1 0 0 1 0 0」(恒等行列)にする。
- 画像の境界がフレームに合う。
テキストフレームの追加
テキストフレームは、不規則な形でも長方形でも、常にTextFrameエレメントで表されます。ParentStory属性はテキストがどのストーリーに属しているかと、リンクされたテキストフレームのPreviousTextFrameとNextTextFrameの情報です。
<TextFrame Self="ue1" ParentStory="ue3" PreviousTextFrame="ua1" NextTextFrame="uf1"
テキストフレームを追加する手順は次のとおりです。
- Storiesディレクトリに、ストーリーのXMLファイルを追加する。ミニマルなストーリーの例は、「IDMLファイルにあるもの」を参照のこと。このストーリーには、Self属性にユニークなIDが必須。
- 「<idPkg:Story src="Stories/MyStory.xml"/>」のように、idPkg:Storyエレメントをdesignmap.xmlファイルに追加する。
- テキストフレームを追加したいスプレッドファイルに、TextFrameエレメントを追加する。このエレメントのParentStory属性で、新しいストーリーのSelf属性を参照する。図形の設定が、ここでは最も難しい。「Hello World」の例を参照のこと。
- PreviousTextFrame属性とNextTextFrame属性を使って、既存のフレームとのリンクを設定する。リンク前後のフレームの、関係する属性を変更する。
テキストフレーム内で表示するテキストは、関連付けられたストーリーXMLファイルにあります。
オブジェクトスタイルの適用
オブジェクトスタイルは、ページオブジェクトのエレメントのAppliedObjectStyle属性を、目的のオブジェクトスタイルのSelf属性値に設定して、適用します。
<TextFrame ... AppliedObjectStyle="ObjectStyle/Object Style 1"
テキスト
テキストの追加
テキストのコンテンツと書式は、ストーリーXMLファイルのStoryエレメントまたはスニペットで処理されます。テキストコンテンツは、常にContentエレメント中にあります。サンプルReplace Storyに、ストーリー全体を置換するデモがあります。
テキストの書式
テキストは、ParagraphStyleRangeエレメントとCharacterStyleRangeエレメントで書式を設定します。「Paragraph」「Character」という語がエレメント名に含まれていますが、それぞれのエレメントは両方とも段落、文字問わず書式が設定でき、オーバーライドすることができます。
サンプルAdd Catalog Pagesに、書式設定のよい例があります。
スタイルの更新
スタイルはResourcesフォルダのStyles.xmlファイルにあります。このファイルのエレメントを更新すると、ドキュメント中のスタイルが更新されます。サンプルCopy Styleは、ドキュメント間でスタイルをコピーする方法のデモです。
スニペットとスタイル
スニペットには、InDesignドキュメントの一部分を再構成するのに必要な情報が含まれています。同じ名前のスタイルを持つ、他のドキュメントにスニペットを配置しても、ドキュメントのスタイルはスニペットのスタイルに置換されませんが、スニペットのスタイルは配置先ドキュメントのスタイルに置換されます。
改行の追加
改行は、Brエレメントを追加します。ただし、Contenエレメントの外で改行されます。
特殊文字
XMLでサポートされていない特殊文字がいくつかあります。それらは処理命令でエンコードされます。例えば、ページ番号の文字は「<?ACE 18?>」というように表されます。これらの文字についてのリファレンスは提供されていないので、必要に応じ、アプリケーション上で試してみてください。
条件付テキストの表示/非表示の切り換え
IDMLでの条件付テキストのコントロールは、UIで行うより複雑です。Conditional Textプリファレンスを設定して、ストーリーコンテンツのHiddenTextエレメントを追加または削除します。
条件付テキストを非表示にするには、次の手順に従います。
- designmap.xmlファイルで条件を設定し、Visible属性を「false」にする。
- すべてをHiddenTextエレメントでラップする。こうすることにより、AppliedCondition属性を持つ、各CharacterStyleRangeエレメント内のコンテンツもラップされ、非表示に設定される。
条件付テキストを表示するには、次の手順に従います。
- designmap.xmlファイルで条件を設定し、Visible属性を「true」にする。
- HiddenTextエレメントを削除し、CharacterStyleRangeエレメントのAppliedCondition属性を表示に設定する。
サンプルConditional Textに、XSLTを用いた条件付テキストの表示/非表示切り換えのデモがあります。
表
InDesignには独自の表モデルがあり、IDMLにも反映されています。表の行(BodyRowCount)、列(BodyColumnCount)、ヘッダ行(HeaderRowCount)およびフッタ行(FooterRowCount)の数は、Tableエレメントの属性として指定されます。表モデルは、複数の行と列におよぶセルをサポートしています。セルの位置とサイズは、CellエレメントのName属性、RowSpan属性、ColumnSpan属性で決まります。Name属性は「1:1」のように記述されます。このことにより、セルの開始位置が決められます。RowSpan属性とColumnSpan属性は、セルの結合する数を決めます。InDesignの表モデルでは、表スタイルとセルスタイルが指定できます。
サンプルICML Builderは、シンプルなXHTMLの表をIDML(ICML)の表に変換するデモです。
XML
タグの追加
タグは、Tags.xmlファイルで定義されます。ドキュメントにタグを追加する手順は次のとおりです。
- (ない場合は)XMLフォルダにTags.xmlファイルを追加する。ドキュメントのエレメントはidPkg:Tags。例は、下記を参照。
- XMLTagエレメントをTags.xmlファイルに追加する。新しいタグはユニークなSelf属性と名前および、ユニークなカラー定義にすること。
タグを1つ定義した、Tags.xmlファイルの例です。
<idPkg:Tags xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0"><XMLTag Self="XMLTag/ItemHeading" Name="ItemHeading"><Properties><TagColor type="enumeration">Green</TagColor>
</Properties></XMLTag></idPkg:Tags>
タグとスタイルのマッピング
タグをスタイルにマップする手順は、次のとおりです。
- (ない場合は)XMLフォルダにMapping.xmlファイルを追加する。ドキュメントのエレメントはidPkg:Mapping。例は、下記を参照。
- ユニークなSelf属性を持つXMLImportMapエレメントを追加して、それぞれのマッピングを定義する。
- MarkupTag属性を追加して、マップするスタイルのSelf属性に設定する。
- MappedStyle属性を追加して、マップするスタイルのSelf属性に設定する。
スタイルをタグにマップする手順は、次のとおりです。
- ユニークなSelf属性を持つXMLExportMapエレメントを追加して、それぞれのマッピングを定義する。
- MarkupTag属性を追加して、マップするスタイルのSelf属性に設定する。
- MappedStyle属性を追加して、マップするスタイルのSelf属性に設定する。
下記は、シンプルなMapping.xmlファイルの例です。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><idPkg:Mapping xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0"><XMLExportMap Self="did5" MarkupTag="XMLTag/Tag2" MappedStyle="CharacterStyle/Character Style 1" IncludeMasterPageStories="false" IncludePasteboardStories="false" IncludeEmptyStories="false"/><XMLImportMap Self="did2" MarkupTag="XMLTag/Tag1" MappedStyle="CharacterStyle/Character Style 1"/></idPkg:Mapping>
ドキュメント構造を適合させる
ドキュメント構造は、XMLフォルダのBackingStory.xmlファイルにあり、ストーリーXMLファイル内部でマークアップされています。BackingStory.xmlファイルは、コンテンツと構造の間のトップレベルの関係を含みます。ストーリー内でマークアップされているテキストは、個別のストーリーファイル内にあります。この関係についての詳細は、このドキュメントでは触れません。サンプルImport XML Templateは、XML読み込みをInDesign外部で完全に同じように行うデモです。
プログラミング
XSLTパターン
IDMLパッケージ内のXMLファイルで必要なほとんどの変更は、XSLTで処理されます。(サンプル作成時、最初はいくつかのDOM操作を手動で行いましたが、XSLTのほうがより効率がよく、維持できました)
IDMLコンテンツをXSLTで生成したり処理するときに効果を発揮する、いくつかのパターンです。
- テンプレート
- XSLTスタイルシートには、静的なコンテンツと動的なコンテンツがコンビで含まれています。スタイルシートは、テンプレートとして使われ、いくつかの新しいIDMLコンテンツに拡張されます。サンプルPage BuilderとICML Builderにこの例があります。
- 変換
- XSLTスタイルシートには、既存のIDMLファイルを処理するための指示が含まれています。この例では、出力形式はIDMLファイルです。スタイルシートには重要な静的コンテンツはありません。代わりに、IDMLファイルを変換する指示が含まれています。ほとんどの場合、1回かそれ以上の変換では同一変換になります。他のサンプルでこのパターンを使っています。サンプルConditional Textは良い例です。
- ハイブリッド
- いくつかのソリューションでは、テンプレートと変換パターンの両方を求められます。サンプルAdd Catalog Pagesはその例です。変換パターンはdesignmap.xmlファイルを更新するために使用され、これは新規スプレッドと新規ストーリーを追加するために必要です。新規スプレッドと新規ストーリーファイルの生成は、テンプレートのパターンはに従います。
- パラメータ
- XSLTに基づいた柔軟なソリューションでは、様々な入力を扱えなければなりません。XSLTでは、<xsl:param>エレメントでデータをスタイルシートに受け渡しています。ほぼすべてのサンプルでは、パラメータをIDMLに渡しています。IDのような情報は書き出しから書き出しを経て変更されることがあるので、特に重要です。典型的なパターンは、JavaでIDMLファイルの情報を見つけて、パラメータを使ってスタイルシートに渡すという使い方です。PackageInspectorとXmlUtilsクラスには、IDMLファイル内で情報を見つけるためのコードが含まれており、FileTransformerクラスにはパラメータの特定と、変換を実行するためのサポートが含まれています。
- 複数の出力
- IDMLファイルにはたくさんのファイルがあるため、いくつかのテンプレートごとに分けることは有効です。xsl:ドキュメントエレメントは複数の出力ファイルを作成するときに使われます。サンプルPage Builderを参照してください。
- 複数の入力
- 1つのIDMLファイルを、別の変換のための入力として使用する必要が時としてあります。XSLTではdocument()関数で行います。サンプルCopy Styleで、この関数を使ってソースドキュメントのスタイルを、変換されたドキュメントにコピーしています。
Javaの役割
サンプルでは、XLSLTで容易ではない処理をJavaを使って行っています。他のプログラミング言語でも可能です。サンプルIDMLToolsで、Javaは下記のように使われています。
- コマンドラインからの入力を許可
- ZIPファイルの圧縮と解凍(Packageクラス参照)
- テンポラリーファイルとフォルダの管理(FileUtilsクラス参照)
- パッケージの詳細をとらえ、特定のパッケージの場所を見つける(PackageXmlLocator参照)
- XSLとパッケージ内のXMLファイルのマッチング(PackageXslLocator参照)
- XSLT変換の開始(FileTransformerクラスとPackageTransformerクラス参照)
- JavaバリデータライブラリのJINGを呼び出す(Validatorクラス参照)
- 既存のIDMLファイルからデータを見つける(PackageInspectoryクラスとXmlUtilsクラス参照。または次項に詳細)
Javaを使ってデータを見つける
IDMLToolsには、IDMLパッケージ内でデータを見つけるクラスが2つあります。高レベルのPackageInspectorクラスは、IDMLパッケージから情報を抽出するたくさんのメソッドを含んでいます。例えば、ページの高さ、幅、ページ数を知りたいときは、単純にIDMLファイルまたは抽出されたIDMLファイルを含むディレクトリへのパスから、PackageInspectorを構成し、GetPageHeight()やGetPageWidth()、またはGetPageCount()メソッドを呼び出します。
PackageInspector inspector = new PackageInspector(tempDir); double pageHeight = inspector.GetPageHeight();
PackageInspectorは、JavaとXPATHを結合してパッケージから情報を抽出するための、より強力なXmlUtilsクラスにとって、本当に便利なラッパクラスです。次項は、XmlUtilsを使ってデータを見つける方法の例です。
名前からレイヤーIDを得る方法
XmlUtilsを使うと、IDMLファイルから簡単に属性を抽出できます。この例では、(スキーマから)データがdesignmap.xmlファイルにあることがわかっています。既知のXMLファイルからデータを得るには、1つのファイルパスとXPATHステートメントでXmlUtils.getAttributeのバージョンを呼び出します。XPATHステートメントはデータの場所を特定します。この例では、レイヤーオブジェクトのSelf属性は、Documentエレメントにあります。パスは、Name属性が「text」のレイヤーを探していることを示します。
「text」という名前のレイヤーを抽出するには、次を実行します。
XmlUtils.getAttribute(xmlLoc.getDesignMapFilePath(),
"/Document/Layer[@Name = 'text']/@Self");
xmlLoc(PackageXmlLocatorのインスタンス)が、stringでdesignmap.xmlファイルのパスの特定に使われています。
名前からマスタースプレッドのIDを得る方法
XmlUtilsは、XMLファイルのセットからひとつの属性を見つけることもできます。この例では、マスタースプレッドのXMLファイルの集まりがあります。次の呼び出しで、Name属性が「D-catalog」であるマスタースプレッドのSelf属性を見つけます。
String masterSpreadID = XmlUtils.getAttribute(xmlLoc.getMasterSpreadXmlFiles(), "/idPkg:MasterSpread/MasterSpread[@Name = 'D-catalog']/@Self");
XPATHステートメントが1つの属性以外のものを返すと、PackageExceptionが投げられます。
複数の属性を得る方法
XmlUtilsには、属性のArrayListを返すメソッドもあります。これらのメソッドは、上述と似ていますが、単一の文字列ではなくArrayListを返します。単一ファイルと、ファイルのArrayListの両方で操作するバージョンがあります。
名前またはIDを値にマップするHashTableを得る方法
XmlUtilsには、getAttributePairsForElement()というメソッドがあり、Selfなどのユニークな属性と他の属性をマップするHashTableを作成します。PackageInspector.GetObjectStyleIDNamePairs()に、この例があります。
ワークフローのカスタマイズ
IDMLの読み込み/書き出しによるカスタムデータのラウンドトリップ
- ソリューション
- スクリプティングで強化したスクリプトラベル機能を使う。
IDMLの読み込みと書き出しでデータをラウンドトリップさせたいとき、任意のエレメントと属性を、意図的に追加することはできません。認識されないコンテンツはなくなり、IDML読み込み時に削除されてしまいます。Adobe Creative Suite 4では、2つの方法があります。1つめは、プラグインを作成し、データにスクリプティングシステムを追加する方法です。これはかなりの労力が要るので、次のオプションをお勧めします。スクリプトラベル機能を使う方法です。
スクリプトラベルは、テキストを任意のブロックでスクリプト対象にすることができます。UIではテキストのブロックを1つしか対照にできないので、スクリプトラベルはより強力です。スクリプティングとIDMLで、キーと値の組を追加できます。UIでは、ラベルキーに相当する値しか使用できません。
<Label><KeyValuePair Key="FirstLabel" Value="First label."/><KeyValuePair Key="SecondLabel" Value="Second label."/><KeyValuePair Key="ThirdLabel" Value="Third label."/><KeyValuePair Key="Label" Value="This shows up in the UI."/></Label>
スクリプトラベルはスクリプティングで使用できます。例えば、次のJavaScriptでFirstLabelキーの値を得ます。
app.documents[0].textFrames[0].extractLabel("FirstLabel");
次のスクリプトは、キーと値の組を挿入します。
app.documents[0].textFrames[0].insertLabel(
"TestLabel", "Second label. Will this make the round trip?"
);
IDML書き出し時にストーリー、スプレッドおよびマスタースプレッドのファイル名をコントロールする
- ソリューション
- スクリプティングとidmlComponentNameプロパティで書き出すファイルをファイル名で指定する。このプロパティの設定で、拡張子.xmlファイルのファイル名の一部をコントロールする。
例えば、次のコードではMyStory.xmlという名前のストーリーファイルを作っています。
myStory.idmlComponentName = "MyStory";
- ディスカッション
- IDML書き出しでは、最終的にオブジェクトタイプとInDesignデータベースのUID(ユニークID)に基づいた独自の命名規則で、ストーリーとスプレッドのファイル名を作成します。これらのファイル名は、オブジェクトが同じUIDを持ち続けられないため、読み込みと再書き出し時に変更されてしまいます。
C++の場合、このデータへは次のBossクラスのIIDMLComponentNameインターフェースでアクセスできます。
- kTextStoryBoss
- kSpreadBoss
- kMasterPageBoss
データを変更するには、kSetIDMLComponentNameCmdBossを使います。
Note:読み込まれたストーリーファイルが非標準的な名前だと、IDML読み込みはidmlComponentNameプロパティを設定します。
