Определить координаты для визуального элемента в idml
Мне нужно обработать файлы Indesign Idml, сгенерировать изображение и наложить другие элементы на определенные элементы в html.
Имеется файл Indesign Idml (который представляет собой упакованный файл xml) и задан визуальный элемент в этом файле (с помощью тега в xml). Есть ли способ узнать, по каким координатам на изображении падает этот визуальный элемент?
2 ответа
Иерархия контейнеров для изображения в документе IDML выглядит следующим образом:
Документ [Содержит] > Распространение> PageItem > PlacedImage. Страницы не используются в качестве контейнеров, а PageItems хранятся в координатах разворота, поэтому мы можем забыть об элементах Document и Page. Если вы можете найти Помещенное изображение в координатах Распространения и перебазировать эти координаты, чтобы 0,0 находилось в верхнем левом углу экрана, вы можете расположить изображение так, как оно было в документе InDesign.
Элемент страницы (который содержит изображение) не имеет геометрических границ в IDML. Его границы хранятся в виде массива объектов PathPointType в теге PathGeometry, например:
<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 имеют примеры координат: http://www.photoshopelementsmac.com/devnet/indesign/documentation.html включая перевод из одного пространства координат в другое.
Кроме того, в элементе страницы (который дает геометрические границы) размещенное изображение имеет свой собственный набор графических границ, которые могут смещать его дальше, а также собственный ItemTransform.
Итак, чтобы ответить на ваш вопрос, вам нужно будет распаковать zip-файл IDML, найти изображение в 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 в точках. Вам нужно будет разделить все значения на 72, деленные на PPI вашего экрана, если вы хотите получить результаты в пикселях.
Каждый <PageItem>
на странице использует ItemTransform
Атрибут масштабировать, поворачивать, сдвигать и преобразовывать себя относительно содержащего его элемента (технически элемент XML PageItem не существует, но может быть элементом Rectangle, Oval и т. д.).
В пределах <PageItem>
его форма определяется <PathGeometry>
element и его содержащие элементы ( ссылка на IDML подробно описывает это с помощью примеров), также обращайтесь к ответу JcFx.
Сильно исправленный ответ, основанный на спецификации IDML: благодаря JcFx