5

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

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

4

2 回答 2

13

IDML 文档中图像的容器层次结构如下:

文档 [包含] > 传播 > PageItem > PlacedImage。Pages 不用作容器,PageItems 存储在展开坐标中,因此我们可以忘记 Document 和 Page 元素。如果您可以在展开坐标中找到已放置的图像,并将这些坐标重新设置基数,使 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 轴上,出于 Adob​​e 最熟悉的原因,0 是展开的垂直中心(不是您可能期望的顶部或底部)。

IDML 文档有坐标示例:http ://www.photoshopelementsmac.com/devnet/indesign/documentation.html 包括从一个坐标空间到另一个坐标空间的翻译。

此外,在页面项目(给出几何边界)中,放置的图像有自己的一组图形边界,可以进一步偏移它,以及它自己的 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。

于 2012-09-19T07:56:22.883 回答
1

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

在 中<PageItem>,其形状由<PathGeometry>元素及其包含的元素确定(IDML 参考通过示例对此进行了详细描述),另请参阅 JcFx 的答案。

基于 IDML 规范的大量更正答案:感谢 JcFx

于 2012-09-18T21:00:41.953 回答