Translation5:Cookbook contents/ja
From IDMLWiki
はじめに
このドキュメントは、InDesign Markup Language (IDML)と呼ばれる、Adobe InDesign CS5用マークアップ言語の使用方法についてまとめたものです。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を使わずに容易に行えるよう設計されています。JavaとActionScript 3.0/Airで書かれた、IDMLをInDesignを使わずに使用する例がSDKに多数あります。Javaがほとんどですが、どちらの言語でもIDMLファイルを操作できます。これらの言語は、異なるアプローチでもたいてい同じ結果になります。それらの差異はサンプル中でハイライト表示されています。
IDMLToolsって何?
IDMLToolsには、サンプルコード、ツール、再利用できるJavaクラスがあります。スキーマを有効にしたり、パッケージを検査、圧縮、解凍したりする、単独のツールもあります。IDMLToolsのサンプルコードで、データの収集や抽出、変更、追加でIDMLを生成する、デモを体験できます。これらのサンプルコードのほとんどはXSLTが使われ、一般的なJavaクラスのセットでビルドされています。
IDMLToolsのサンプルコードはどこにあるの?
IDMLToolsのサンプルコードは、InDesign CS5 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」を実行したら、パッケージをみてみましょう。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="7.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="7.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="7.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形式の書き出しは今バージョンからなくなりました。ですが、INX形式のファイルを読み込むことは可能です。
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と呼ばれる共通のファイルが含まれす。このファイルは両スキーマにおいて同等で、共通のデータ型を定義します。
非パッケージ用スキーマは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ファイルを検証するのですか?
注意:SDKにはActionscript/Airを使用したIDMLファイル検証の例はありません。
解決方法:IDMLTools内に用意してある validation tool を使う。
- IDMLTools ReadMe file の説明に従い、IDMLToolsをセットアップする。
- 「どうやってスキーマを生成するのですか?」を参照して2つのスキーマを生成する。
- <IDMLTOOLS>/binにある、プラットフォームに適したスクリプトを実行する。
IDMLToolsにはJingベースの検証ツールがあります。Jingは、RELAX NG のcompact形式をサポートしたJavaベースのオープンソース、スキーマ検証パッケージです。IDMLToolsスキーマ検証ツールはcom.adobe.idml.Validatorクラスの中で実装されています。それはJavaもしくはコマンドラインから実行することができます。
非パッケージのIDMLファイルの検証は技術的にとても単純です。単体のXMLファイルを検証するのと同じ事です。Jingだけで実行できます。Validatorクラスを使ったほうが本当にメリットとなるのは、パッケージファイルを扱うときです。検証ツールは、自動的にパッケージファイルをテンポラリーディレクトリーに解凍し、解凍されたそれぞれのファイルを検証します。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...]
Tools
IDMLの作業のための外部ツールは何が推奨ですか?
IDMLで仕事をするためにはZIPソフトウェアが必要になります。WinZipのような市販のZIPアプリケーションでも良いですが、The InDesign CS4 Products SDKにIDMLパッケージの圧縮・解凍をするためのフリーのJavaベースのライブリーとアプリケーションがあります。
IDMLの作業をするにあたり、便利なXMLエディターを用意することが重要です。とても効率的なエディターとしてOxygen XML Editorをご紹介します。Compact RELAX NG schemaをサポートし、さらにIDMLをZIPファイルに圧縮した後に、IDMLパッケージの中を直接見ることができます。このZIPファイルサポートでIDMLのテストがより容易になります。IDMLパッケージの中のファイルを直接見て、編集することができます。ファイルが保存されたると、パッケージが更新されます。
“Eclipse Zip Editor”というEclipse用のオープンソースのプラグインがあります。このプラグインは製品版のOxygenと同じZIP機能ができます。
メモ:ZIPアーカイブのサポートはOxygen version 9.3で追加されました。Oxygenを購入するなら、定期的に新しい機能を追加してくれるようなメンテナンスパックを購入すると良いでしょう。
SDKにはどんなツールが入っていますか?
The InDesign Products SDK はJavaBaseのツールやソースコード、IDMLでの作業に役立つサンプルが入っています。これらのコードをまとめて「IDMLTools」と呼び、次のディレクトリーに格納されています。
<SDK>/devtools/sdktools/idmltools
IDMLToolsを使う前に、次のセットアップ作業を終えてください。
- IDMLToolsを、ハードドライブの任意の場所にコピーする。
- 環境設定のPATHに<IDMLTOOLS>/binを追加する。
- 環境設定に、IDMLToolsのディレクトリーのパスを記述したIDMLTOOLS_HOMEを追加する。
これらのセットアップ作業の詳細は、IDMLToolsの Readmeファイルにあります。
<IDMLTOOLS>/InDesign CS5 IDML ReadMe.pdf
Javaのコードの構成(Javaのライブラリーを使うためのAPIのリファレンス)はJavaDocsに記述されています。JavaDocsを手に入れるには次のファイルを解凍してください。
<IDMLTOOLS>/docs.zip
そして、いくつかのサンプルプロジェクトファイルは次のディレクトリーにあります。
<IDMLTOOLS>/samples
InDesign Prodects SDKにはActionScriptベースのサンプルもあります。
<SDK>/idml flex samples
IDMLファイルのスキーマチェックが合格しているのに、期待どうりに動かなかったらどうすればよいでしょうか?
解決方法:サンプルINXErrorLoggingを使って、エラーレポートを確認する。
INXのように、IDMLは予想外のデータやスクリプトエラーはそのまま無視するように設計されています。これは古いバージョンや見当たらないプラグインがあってもファイルを開くことができるようにしているからです。しかしながら、この寛大な挙動はIDMLファイルのデバッグ作業を困難なものにしています。ですが、プラグインを使ってエラーを見つけることができます。INXErrorHandler interfaceの実装によって提供されています。サンプルのINXErrorLoggingに、このインターフェイスとエラーログのファイル書き出しの方法が説明されています。適切なデバッギングツールを見つけられるでしょう。
INXErrorLoggingプラグインは、InDesign、InCopy、それからInDesign Serverの間で互換性のある唯一のプラグインです。次のようにスクリプトで制御します。次のJavaScriptはOSに依存しないファイルパス形式でログファイルの保存場所の指定を可能にします。
app.inxerrlogOn = true; app.inxerrlogPath = File("/c/temp.txt");
無効にするには:
app.inxerrlogOn = false;
添付のユーザーインターフェイス・プラグインである INXErrorLoggingUIもあります。InDesignのメニュー経由で INXErrorLoggingを有効・無効にします (Plug-Ins -> SDK -> INXErrorLoggingUI -> Install INX Error Handler[US])。メニューでログ機能を有効にするときはログファイルを選択するためのダイアログが表示されます。エラー情報にアクセスする方法を得ることは、IDMLファイルのデバッギングをする時にとても便利です。スキーマによる検証と平行して、あなたが作成したIDMLファイルに含まれる問題点をデバッギングするのに役立ちます。INXErrorLoggingは InDesign CS5 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パッケージを生成するにはどうすればいいですか?
解決方法:(IDMLToolsにある)com.adobe.idml.Packageクラスか、他の圧縮ツールを使う。
IDMLパッケージについては「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.「IDML Language Specification」にあるように、ファイルのディレクトリーはアーカイブのトップレベルの階層に存在していなければならない(よくある間違いはサブディレクトリーに入れたファイルの圧縮)。例えば、 mimetype META-INF/container.xml 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サポートを使った圧縮・解凍の実演をするコードが入っています。パッケージの取り扱い方はcom.adobe.idml.Packageクラスを見て理解してください。コマンドライン版のJavaクラスはスクリプトで使うことができます。これらのツールのセットアップと使い方がIDML ReadMe file に解説してあります。
- InDesignはファイルシステム上にあるファイルからパッケージを作るためのスクリプティングサポートも提供しています。
- ActionScript 3.0/Airでパッケージの圧縮・解凍ができます。例はActionScriptサンプルのCompressionUtils.asクラスを参照してください。
- WinZipのような、市販のZIP規格に準拠し入手が容易なソフトウェアを使うことができます。WinZipはInDesignとの互換性はありますが、階層をコントロールしながらアーカイブに個々のファイルを圧縮していくことは、他に比べて面倒です。この問題に対処するには、最初に圧縮されていないmimetypeファイルだけを含むZIPファイルを生成し、そこに残ったファイルを追加してください。
もし単純にファイルをInDesignへ送り込むだけなら、これらはすべて必要ないと思われがちですが、Adobe Bridgeで正しくXMPメタデータを表示させてAdobe Bridgeを使いこなしたいのなら、これらのルールには従わなくてはいけません。
(以下 項目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ではスプレッドに複数の画像を追加します。Java Replace ImagesとActionScript/Air Replace Images、Flex Air IDML Content Editorでは、画像の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ファイルにあるもの」の「Hello World」サンプルを参照のこと。このストーリーには、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="7.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="7.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外部で完全に同じように行うデモです。
JavaとXSLTを使ったプログラミング
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:document>エレメントは複数の出力ファイルを作成するときに使われます。サンプルPage Builderを参照してください。
- 複数の入力
- 1つのIDMLファイルを、別の変換のための入力として使用する必要が時としてあります。XSLTではdocument()関数で行います。サンプルCopy Styleで、この関数を使ってソースドキュメントのスタイルを、変換されたドキュメントにコピーしています。
Javaの役割
サンプルでは、XSLTでは容易でない処理をJavaを使って行っています。他のプログラミング言語でも可能です。サンプルIDMLToolsで、Javaは下記のように使われています。
- コマンドラインからの入力を許可
- ZIPファイルの圧縮と解凍(Packageクラス参照)
- テンポラリーファイルとフォルダの管理(FileUtilsクラス参照)
- パッケージの詳細をとらえ、特定のパッケージの場所を見つける(PackageXmlLocator参照)
- XSLとパッケージ内のXMLファイルのマッチング(PackageXslLocator参照)
- XSLT変換の開始(FileTransformerクラスとPackageTransformerクラス参照)
- JavaバリデータライブラリのJINGを呼び出す(Validatorクラス参照)
- 既存のIDMLファイルからデータを見つける(PackageInspectorクラスと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()に、この例があります。
ActionScript/Airを使ったプログラミング
ActionScript/Airを使うと、自己完結型のアプリケーションをビルドできるので、開く、変更する、IDMLファイルで保存するといった作業で他のテクノロジーが不要になります。スクリプティングやプログラミング言語でIDMLを処理するには、ファイルシステムとの連動やファイルの圧縮・解凍、XMLファイルを変更する機能を別途用意しなければなりませんが、ActionScript/Airならば、それだけで対処できます。
IDMLファイルの圧縮・解凍
ActionScriptはネイティブでは圧縮操作をサポートしていません。ファイルの圧縮・解凍は、David Changによるnochumpというサードパーティのライブラリを使います。SDKサンプルにあります。(ActionScript/Airサンプルプロジェクトのlibフォルダ内にあるZip.swcファイルを参照)このライブラリと相互作用する関数のある全てのActionScript/Airサンプルに、CompressionUtilsクラスがあります。
E4Xを使ってXMLファイルを変更する
ActionScript 3.0はXSLTをサポートしていません。IDMLパッケージ内のXMLファイルを個別に変更するにはE4Xを使います。E4Xによって、ActionScript 3.0は少ない行でXMLファイルの読み込みや変更ができるようになります。E4Xに関しては、たくさんの資料が印刷物やWebで提供されています。E4Xを使った便利なIDML関連のタスクの例をいくつか下記に示します。
スクリプトラベルに関連付けられたストーリーのIDを得る
このコードは、Spreadsディレクトリ内の1つのXMLファイルにある、「Sample Script Label」というスクリプトラベルの付いたテキストフレームのストーリーIDを探します。このスクリプトでは、スクリプトラベルは全て一意であると仮定しています。一意でないときは、最初に名前がマッチしたスクリプトラベルが返されます。Spreadsフォルダに複数スプレッドのXMLファイルがある場合のために、このコードはマッチするスクリプトラベルが見つかるまで各ファイル間で繰り返されます。
//The relative directory path from the extracted IDML files
//to the Spreads XML files.
public static const SPREADS_DIR:String = "Spreads";
//Iterate through the spread XML files in the Spreads directory.
for each (var xmlFile:File in
idmlDir.resolvePath(SPREADS_DIR).getDirectoryListing())
{//Read the XML file into an XML object.
var xml:XML = readXmlFromFile(xmlFile);
//Use E4X to find the Story ID associated with the script label
//"Sample Script Label."
storyID = xml..TextFrame.(Properties.Label.KeyValuePair.@Value ==
"Sample Script Label").@ParentStory;
//Break the for loop if a matching storyID was found.
if (storyID != "")
{break;
}
}
画像を更新する
このコードはE4Xを使ってリンク画像のLinkResourceURI属性を更新します。このリンク画像の子のImageエレメントには「Sample Self ID」というSelf属性があります。この属性を新しいパスに更新して、InDesignドキュメントのリンク画像を更新します。
xml..Image.(@Self == "Sample Self ID").Link.@LinkResourceURI = "New Image Path";
マスタースプレッドのIDをName属性で特定して得る
E4Xを使うと、XMLファイルのセットから1つの属性だけを見つけることができます。この例では、複数のマスタースプレッドXMLファイルの集合があり、そこから「「Sample Master ID」というName属性を持つマスタースプレッドのSelf属性を探します。
xml..MasterSpread.(@Name == "Sample Master ID").@Self
XMLオブジェクトにXMLファイルを読み込む
E4Xを使ってXMLドキュメントを処理するには、ファイルをXMLオブジェクト内に読み込む必要があります。
private static function readXmlFromFile(xmlFile:File):XML
{var fs:FileStream = new FileStream();
fs.open(xmlFile, FileMode.READ);
var xml:XML = XML(fs.readUTFBytes(fs.bytesAvailable));
fs.close();
return xml;
}
<source lang="xml" line start=1 >===ワークフローのカスタマイズ===
====IDMLの読み込み/書き出しによるカスタムデータのラウンドトリップ====
;解決方法:スクリプティングで強化したスクリプトラベル機能を使う。
IDMLの読み込みと書き出しでデータをラウンドトリップさせたいとき、任意のエレメントと属性を、意図的に追加することはできません。認識されないコンテンツはなくなり、IDML読み込み時に削除されてしまいます。Adobe Creative Suite 5では、2つの方法があります。1つめは、プラグインを作成し、データにスクリプティングシステムを追加する方法です。これはかなりの労力が要るので、次のオプションをお勧めします。スクリプトラベル機能を使う方法です。
スクリプトラベルは、テキストを任意のブロックでスクリプト対象にすることができます。UIではテキストのブロックを1つしか対照にできないので、スクリプトラベルはより強力です。スクリプティングとIDMLで、キーと値の組を追加できます。UIでは、ラベルキーに相当する値しか使用できません。
<source lang="xml" line start=1 ><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?"
);
スクリプトラベルを使ってコンテンツをマークする例は、ActionScript/Air IDML Content Editorサンプルを参照してください。
IDML書き出し時にストーリー、スプレッドおよびマスタースプレッドのファイル名をコントロールする
- ソリューション
- スクリプティングとidmlComponentNameプロパティで書き出すファイルをファイル名で指定する。このプロパティの設定で、拡張子.xmlファイルのファイル名の一部をコントロールする。
例えば、次のコードではMyStory.xmlという名前のストーリーファイルを作っています。
myStory.idmlComponentName = "MyStory";
- ディスカッション
- IDML書き出しでは、最終的にオブジェクトタイプとInDesignデータベースのUID(ユニークID)に基づいた独自の命名規則で、ストーリーとスプレッドのファイル名を作成します。これらのファイル名は、オブジェクトが同じUIDを持ち続けられないため、読み込みと再書き出し時に変更されてしまいます。
C++の場合、このデータへは次のBossクラスのIIDMLComponentNameインターフェースでアクセスできます。
- kTextStoryBoss
- kSpreadBoss
- kMasterPageBoss
データを変更するには、kSetIDMLComponentNameCmdBossを使います。
Note:読み込まれたストーリーファイルが非標準的な名前だと、IDML読み込みはidmlComponentNameプロパティを設定します。
