2012-09-18 13 views
5

Devo elaborare i file Ides di Indesign, generare un'immagine e sovrapporre altri elementi su determinati elementi in html.Identificare le coordinate per un elemento visivo in idml

Dato un file Idm Indesign (che è un pacchetto di xml zippato) e fornito un elemento visivo in quel file (tramite un tag nell'xml). C'è un modo per trovare a quali coordinate dell'immagine l'elemento visivo cade?

risposta

10

La gerarchia di contenitori per un'immagine in un documento IDML è la seguente:

documento [contiene]> Diffusione> PageItem> PlacedImage . Le pagine non vengono utilizzate come contenitori e gli oggetti di pagina vengono archiviati in coordinate distribuite, quindi possiamo dimenticare gli elementi di documento e pagina. se riesci a trovare un'immagine posizionata in coordinate di diffusione e rebase a quelle coordinate in modo che 0,0 sia nella parte superiore sinistra dello schermo, puoi posizionare un'immagine come era nel documento InDesign.

Un elemento della pagina (che contiene un'immagine) non ha limiti geometrici in IDML. I suoi limiti sono memorizzati come un array di oggetti PathPointType all'interno del tag PathGeometry, in questo modo:

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

è possibile calcolare il limite voi stessi abbastanza semplice da ottenere i valori punto più basso/più grandi, assumendo il bordo intorno al vostro elemento della pagina è un rettangolo. Poi si passa alla voce di trasformare,

ItemTransform="1 0 0 1 509.27559055100005 -123.76377952749999" 

... ed hai bisogno per consentire, dove IDML pensa 0,0 è (che è l'origine della trasformazione).

Nell'asse X, 0 sarà la posizione di rilegatura (che è variabile - in un documento di una singola pagina di solito è il lato sinistro dello spread, ma in un documento di due pagine potrebbe essere il centro dello spread) . Questo è dove avrai bisogno di pagine. BindingLocation è espresso come un numero intero (0 per prima della prima pagina, 1 per tra primo e secondo, ecc.). Puoi trovare le corde di questo aggiungendo il ItemTransforms delle pagine precedenti.

Nel asse Y, per ragioni note solo a Adobe, 0 è il centro verticale della diffusione (non sia superiore o inferiore, come ci si potrebbe aspettare).

I documenti IDML hanno esempi di coordinate: http://www.photoshopelementsmac.com/devnet/indesign/documentation.html compresa la conversione da uno spazio coord all'altro.

Inoltre, all'interno di un elemento della pagina (che dà i limiti geometrici), un'immagine inserita ha una propria serie di limiti grafici, che possono compensare ulteriormente, così come la sua propria ItemTransform

Quindi, per rispondere alla tua domanda, si avrebbe bisogno di decomprimere il file zip IDML, trovare l'immagine nel XML, poi fare un qualcosa di simile somma:

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

Ah, ancora una cosa: tutte le coordinate IDML sono in punti. Avrai bisogno di dividere tutti i valori del 72 diviso per il PPI dello schermo, se si desidera ottenere risultati in pixel.

1

Ogni <PageItem> su una pagina utilizza l'attributo ItemTransform per ridimensionare, ruotare, taglio e trasformarsi rispetto al suo elemento contenitore (tecnicamente l'elemento PageItem XML non esiste ma può essere un rettangolo, ovale, ecc elemento) .

Nel <PageItem>, la sua forma è determinata dall'elemento <PathGeometry> ei suoi elementi di contenimento (il IDML reference descrive in dettaglio con esempi), vedi anche la risposta di JcFx.

risposta fortemente corretta basate sulle specifiche IDML: Grazie a JcFx

+0

Quindi, io non sono sicuro di come applicare questa conoscenza. Ho un file IDML che Spedisco fuori per InDesign Server che alla fine restituisce un'immagine. Stai dicendo che dovrei generare una sceneggiatura e fare un altro round trip sul server indesign? –

+0

Non sono sicuro di cosa esattamente si sta cercando di realizzare. Stai dicendo che stai provando a generare un'immagine (grafica vettoriale) trasformando un file IDML? Esiste un'immagine preesistente che stai modificando? Stai creando un'immagine da zero? –

+0

@Josh Voigts - Gli oggetti di pagina sono archiviati in IDML in coordinate di diffusione, quindi i GeometricBound di pagina non sono di grande aiuto. Sfortunatamente l'immagine stessa non avrà alcun limite geometrico (almeno non memorizzato come tale in IDML) - vedi la mia risposta più completa qui sotto. – JcFx

Problemi correlati