2012-09-18 69 views
5

我需要處理Indesign Idml文件,生成圖像並將其他元素覆蓋在html中的某些元素上。識別idml中視覺元素的座標

給定一個Indesign Idml文件(它是一個壓縮的xml包)並給出該文件中的可視元素(通過xml中的標記)。有沒有辦法找到圖像上視覺元素落在什麼座標上?

回答

10

容器的一種用於圖像的IDML文檔中的層次結構如下:

文獻[包含]>傳播> PageItem> PlacedImage 。頁面不用作容器,而PageItems存儲在擴展座標中,所以我們可以忘記Document和Page元素。如果您可以在Spread座標中找到放置圖像,並重新綁定這些座標,以便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將是綁定位置(這是可變的 - 在單個頁面文檔中它通常是展開的左側邊緣,但是在兩頁文檔中它可能是展開的中心) 。這是你需要頁面的地方。 BindingLocation用整數表示(0表示第一頁之前,1表示第一和第二之間,等等)。您可以通過將前面頁面的ItemTransforms相加來找到這些座標。

在Y軸上,由於Adobe最爲人所知的原因,0是傳播的垂直中心(不是頂部或底部,如您所期望的那樣)。

IDML文檔包含coord示例:http://www.photoshopelementsmac.com/devnet/indesign/documentation.html包括從一個coord空間轉換爲另一個。

此外,頁面項目(這給幾何邊界),置入的圖像都有自己的一套圖形的邊界,這可以進一步抵消它,以及它自己的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 

哦,還有一兩件事:所有IDML COORDS是點。如果您想以像素爲單位獲得結果,則需要將所有值除以72,除以屏幕的PPI。

1

每個<PageItem>頁面上使用ItemTransform屬性來縮放,旋轉,剪切,和相對變換本身包含的元素(技術上的PageItem XML元素不存在,但可以是矩形,橢圓形等元件) 。

<PageItem>之內,其形狀由<PathGeometry>元素及其包含的元素決定(IDML reference用示例詳細描述),也參考JcFx的答案。

重校正答案基於IDML規範:由於JcFx

+0

所以,我不知道如何應用這些知識。我有一個idml文件,我將發送給最終返回圖像的獨立服務器。你是說我應該生成一個腳本,並再次往返於服務器? –

+0

我不確定你想要完成什麼。你是說你想通過轉換一個IDML文件來生成一個圖像(矢量圖)?是否存在您正在修改的預先存在的圖像?你是從頭開始創建一個圖像嗎? –

+0

@Josh Voigts - PageItems在IDML中以Spread座標存儲,所以Page GeometricBounds沒有多大幫助。不幸的是,圖像本身不會有任何幾何邊界(至少不是像IDML那樣存儲的) - 請參閱下面的完整答案。 – JcFx