识别idml中可视元素的坐标

时间:2012-09-18 16:49:50

标签: adobe-indesign idml

我需要处理Indesign Idml文件,生成图像,并在html中的某些元素上叠加其他元素。

给出一个Indesign Idml文件(这是一个压缩的xml包)并在该文件中给出一个可视元素(通过xml中的标签)。有没有办法找到视觉元素落在图像上的坐标?

2 个答案:

答案 0 :(得分:11)

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空间转换到另一个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坐标都是分数。如果要以像素为单位得到结果,则需要将所有值除以72除以屏幕的PPI。

答案 1 :(得分:1)

页面上的每个<PageItem>使用ItemTransform属性相对于其包含元素进行缩放,旋转,剪切和变换(从技术上讲,PageItem XML元素不存在但可以是Rectangle ,椭圆形等元素)。

<PageItem>中,其形状由<PathGeometry>元素及其包含的元素决定(IDML reference通过示例详细描述),也请参考JcFx的答案。

基于IDML规范严格更正的答案:感谢JcFx