Indesign Idmlファイルを処理し、画像を生成し、他の要素をhtmlの特定の要素にオーバーレイする必要があります。
Indesign Idmlファイル(zip形式のxmlのパッケージ)が与えられ、そのファイルに視覚要素が(xmlのタグを介して)与えられます。視覚要素が落ちる画像のどの座標で見つける方法はありますか?
Indesign Idmlファイルを処理し、画像を生成し、他の要素をhtmlの特定の要素にオーバーレイする必要があります。
Indesign Idmlファイル(zip形式のxmlのパッケージ)が与えられ、そのファイルに視覚要素が(xmlのタグを介して)与えられます。視覚要素が落ちる画像のどの座標で見つける方法はありますか?
IDML ドキュメント内のイメージのコンテナーの階層は次のとおりです。
ドキュメント [含む] > スプレッド > PageItem > PlacedImage。ページはコンテナーとして使用されず、PageItems はスプレッド座標に格納されるため、Document 要素と Page 要素については忘れることができます。スプレッド座標で配置された画像を見つけ、それらの座標をリベースして 0,0 が画面の左上になるようにすると、InDesign ドキュメントにあったように画像を配置できます。
ページ アイテム (画像を含む) には、IDML の幾何学的境界がありません。その境界は、次のように PathGeometry タグ内に PathPointType オブジェクトの配列として格納されます。
<Properties>
<PathGeometry>
<GeometryPathType PathOpen="false">
<PathPointArray>
<PathPointType Anchor="-32.04 -35.04" LeftDirection="-32.04 -35.04" RightDirection="-32.04 -35.04" />
<PathPointType Anchor="-32.04 35.04" LeftDirection="-32.04 35.04" RightDirection="-32.04 35.04" />
<PathPointType Anchor="32.04 35.04" LeftDirection="32.04 35.04" RightDirection="32.04 35.04" />
<PathPointType Anchor="32.04 -35.04" LeftDirection="32.04 -35.04" RightDirection="32.04 -35.04" />
</PathPointArray>
</GeometryPathType>
</PathGeometry>
</Properties>
ページアイテムの周囲の境界線が長方形であると仮定すると、最小/最大のポイント値を取得することで、境界を簡単に計算できます。次に、アイテムの変換が必要です。
ItemTransform="1 0 0 1 509.27559055100005 -123.76377952749999"
...そして、IDML が 0,0 と考える場所 (変換の起点) を考慮する必要があります。
X 軸では、0 がとじ位置になります (これは可変です。通常、1 ページのドキュメントでは見開きの左端ですが、2 ページのドキュメントでは見開きの中央になる場合があります)。これは、ページが必要な場所です。BindingLocation は整数として表されます (最初のページの前は 0、最初と 2 番目の間は 1 など)。前のページの ItemTransforms を合計することで、これの座標を見つけます。
Y 軸では、アドビに最もよく知られている理由により、0 はスプレッドの垂直方向の中心です (ご想像のとおり、上でも下でもありません)。
IDML ドキュメントには座標の例があります: http://www.photoshopelementsmac.com/devnet/indesign/documentation.html ある座標空間から別の座標空間への変換を含みます。
また、ページ アイテム (幾何学的な境界を与える) 内では、配置された画像には、独自の ItemTransform だけでなく、さらにオフセットできるグラフィック境界の独自のセットがあります。
したがって、あなたの質問に答えるには、IDML zip ファイルを解凍し、XML で画像を見つけて、次のように合計する必要があります。
// Pseudo-code:
// Calculate PageItem GeometricBounds First as noted above
X: (Spread.BindingLocation) + Spread.ItemTransform.tx + PageItem.itemTransform.tx + PageItem.GeometricBounds.Left + PlacedImage.ItemTransform.tx + PlacedImage.GraphicBounds.Left
Y: (Half Spread Height) + Spread.ItemTransform.ty + PageItem.itemTransform.ty + PageItem.GeometricBounds.Top+ PlacedImage.ItemTransform.ty + PlacedImage.GraphicBounds.Top
ああ、もう 1 つ: すべての IDML 座標はポイント単位です。結果をピクセルで取得したい場合は、すべての値を 72 で割り、画面の PPI で割る必要があります。
<PageItem>
ページ上の各要素は、ItemTransform
属性を使用して、それ自体を含む要素に対してスケーリング、回転、せん断、および変換します(技術的には、PageItem XML要素は存在しませんが、Rectangle、Ovalなどの要素にすることができます)。
内では<PageItem>
、その形状は<PathGeometry>
要素とそれに含まれる要素によって決定されます(IDMLリファレンスではこれについて例を挙げて詳しく説明しています)。JcFxの回答も参照してください。
IDML仕様に基づいて大幅に修正された回答: JcFxに感謝します