我需要處理Indesign Idml文件,生成圖像並將其他元素覆蓋在html中的某些元素上。識別idml中視覺元素的座標
給定一個Indesign Idml文件(它是一個壓縮的xml包)並給出該文件中的可視元素(通過xml中的標記)。有沒有辦法找到圖像上視覺元素落在什麼座標上?
我需要處理Indesign Idml文件,生成圖像並將其他元素覆蓋在html中的某些元素上。識別idml中視覺元素的座標
給定一個Indesign Idml文件(它是一個壓縮的xml包)並給出該文件中的可視元素(通過xml中的標記)。有沒有辦法找到圖像上視覺元素落在什麼座標上?
容器的一種用於圖像的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。
每個<PageItem>
頁面上使用ItemTransform
屬性來縮放,旋轉,剪切,和相對變換本身包含的元素(技術上的PageItem XML元素不存在,但可以是矩形,橢圓形等元件) 。
在<PageItem>
之內,其形狀由<PathGeometry>
元素及其包含的元素決定(IDML reference用示例詳細描述),也參考JcFx的答案。
重校正答案基於IDML規範:由於JcFx
所以,我不知道如何應用這些知識。我有一個idml文件,我將發送給最終返回圖像的獨立服務器。你是說我應該生成一個腳本,並再次往返於服務器? –
我不確定你想要完成什麼。你是說你想通過轉換一個IDML文件來生成一個圖像(矢量圖)?是否存在您正在修改的預先存在的圖像?你是從頭開始創建一個圖像嗎? –
@Josh Voigts - PageItems在IDML中以Spread座標存儲,所以Page GeometricBounds沒有多大幫助。不幸的是,圖像本身不會有任何幾何邊界(至少不是像IDML那樣存儲的) - 請參閱下面的完整答案。 – JcFx