Определить координаты для визуального элемента в 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

Другие вопросы по тегам