我需要处理Indesign Idml文件,生成图像,并在html中的某些元素上覆盖其他元素。
给定一个Indesign Idml文件(它是一个压缩的xml包),并在该文件中指定一个可视元素(通过xml中的标签)。有没有办法找到视觉元素落在图像上的坐标?
发布于 2012-09-19 15:56:23
IDML文档中图像容器的层次结构如下:
文档包含>跨页> PageItem > PlacedImage。页面不用作容器,PageItems存储在展开坐标中,因此我们可以忽略文档和页面元素。如果可以在展开坐标中找到置入的图像,并将这些坐标调整为使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"...and您需要考虑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。
发布于 2012-09-19 05:00:42
页面上的每个<PageItem>都使用ItemTransform属性相对于其包含的元素(从技术上讲,PageItem XML元素不存在,但可以是矩形、椭圆等元素)对自身进行缩放、旋转、剪切和变换。
在<PageItem>中,它的形状由<PathGeometry>元素及其包含的元素决定( IDML reference通过示例详细描述了这一点),也参考了JcFx的回答。
基于IDML规范的重校正答案:归功于JcFx
https://stackoverflow.com/questions/12481502
复制相似问题