2012-09-18 11 views
5

Potrzebuję przetwarzać pliki Idml programu Indesign, generować obraz i nakładać inne elementy na pewne elementy w html.Identyfikowanie współrzędnych elementu wizualnego w idml

Biorąc pod uwagę plik Indesign Idml (który jest paczką spakowanego xml) i otrzymał element wizualny w tym pliku (poprzez znacznik w xml). Czy istnieje sposób na określenie, na jakie współrzędne obrazu spada element wizualny?

Odpowiedz

10

heirarchy pojemników na obrazie w dokumencie IDML jest następująca:

Dokument [Zawiera]> Rozprzestrzenianie> PageItem> PlacedImage . Strony nie są używane jako kontenery, a strony są przechowywane we współrzędnych rozłożonych, więc możemy zapomnieć o dokumencie i elementach strony. Jeśli możesz znaleźć współrzędne rozmieszczonego obrazu w rozkładaniu i zmienić te współrzędne, tak aby w lewym górnym rogu ekranu znajdowało się 0,0, możesz umieścić obraz tak, jak był w dokumencie InDesign.

Element strony (zawierający obraz) nie ma granic geometrycznych w IDML. Jej granice są przechowywane w postaci tablicy obiektów PathPointType w tagu PathGeometry, tak:

<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> 

Można obliczyć granice siebie wystarczy po prostu poprzez uzyskanie najniższych/największe wartości punktowe, zakładając granicę wokół przedmiot strona jest prostokąt. Następnie trzeba element transformacji

ItemTransform="1 0 0 1 509.27559055100005 -123.76377952749999" 

... i trzeba umożliwić gdzie IDML myśli 0,0 to (co jest początkiem transformacji).

w osi X 0 zostanie położenie wiązania (co jest zmienna - w jednym dokumencie strony jest to zwykle lewej krawędzi rozprzestrzeniania, lecz w dokumencie dwie strony może to być środek spread) . Tutaj będą potrzebne strony. BindingLocation jest wyrażone jako liczba całkowita (0 dla pierwszej strony, 1 dla pierwszej i drugiej itd.). Możesz znaleźć współrzędne tego, dodając ItemTransforms z poprzednich stron.

W osi Y, z przyczyn najlepiej znanych firmie Adobe, 0 jest pionowym środkiem rozsiewu (ani górną ani dolną, jak można się było spodziewać).

Dokumenty IDML mają przykłady współrzędnych: http://www.photoshopelementsmac.com/devnet/indesign/documentation.html, w tym tłumaczenie z jednej przestrzeni współrzędnych na drugą.

Również wewnątrz elementu strony (co daje geometryczne granic), umieszczony obraz ma swój własny zestaw granice graficznych, które mogą go offsetowych dalej, a także własnej ItemTransform

Tak więc, aby odpowiedzieć na Twoje pytanie, trzeba by rozpakować plik zip IDML, znajdź obraz w formacie XML, a następnie zrobić to suma coś takiego:

// 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 

Aha, jeszcze jedno: wszystkie koordy IDML są w punktach. Będziesz musiał podzielić wszystkie wartości przez 72 podzielone przez PPI ekranu, jeśli chcesz uzyskać wyniki w pikselach.

1

Każdy <PageItem> na stronie używa atrybutu ItemTransform skalować, obracać, ścinanie i przekształcić się w stosunku do jego elementu zawierającego (technicznie element PageItem XML nie istnieją, ale mogą być prostokątne, owalne, itp element) .

W <PageItem>, jego kształt jest określony przez element <PathGeometry> i jego elementów zawierających (The IDML reference opisano to szczegółowo w przykładach), patrz również odpowiedź JcFx'S.

Mocno poprawiona odpowiedź oparte na specyfikacji IDML: Dzięki JcFx

+0

Więc nie jestem pewien, jak zastosować tę wiedzę. Mam plik idml, który wysyłam do indesign serwera, który ostatecznie zwraca obraz. Mówisz, że powinienem wygenerować skrypt i zrobić kolejną podróż w obie strony do serwera indesign? –

+0

Nie jestem pewien, co dokładnie próbujesz osiągnąć. Czy mówisz, że próbujesz wygenerować obraz (grafika wektorowa), przekształcając plik IDML? Czy istnieje wcześniejszy obraz, który modyfikujesz? Czy tworzysz obraz od podstaw? –

+0

@Josh Voigts - Elementy strony przechowywane są w IDML we współrzędnych rozrzutu, więc Page GeometricBounds nie są zbyt pomocne. Niestety, sam obraz nie będzie mieć żadnych granic geometrycznych (przynajmniej nie zapisanych jako takie w IDML) - zobacz moją pełniejszą odpowiedź poniżej. – JcFx

Powiązane problemy