ItemTransform
ItemTransform is the six-number affine matrix (a b c d tx ty) that maps a page item's inner coordinate space onto the page, encoding translation, scale, rotation, and shear.
ItemTransform is the six-number affine matrix that maps a page item's inner space onto the page.
In short: ItemTransform is the attribute that answers "where does this
shape actually go?" A page item is authored in its own inner coordinate space —
usually with its outline starting at (0, 0) — and ItemTransform maps that
whole space into its parent's space: the page, an enclosing Group, or the
spread. The value is six whitespace-separated numbers, a b c d tx ty, the free
entries of a 2D affine matrix that together encode translation, scale, rotation,
and shear. The identity transform, which places a shape with no change, is
1 0 0 1 0 0.
The six-tuple
The value is six whitespace-separated numbers:
ItemTransform="a b c d tx ty"These are the six free entries of a 2D affine transformation matrix. The parser
reads exactly six numbers; anything else is rejected and the transform is treated
as absent (identity). Applied to an inner point (x, y), the result is:
x' = a·x + c·y + tx
y' = b·x + d·y + tySo a and d scale, b and c shear/rotate, and tx / ty translate. The
identity transform — the one that places a shape with no change — is
1 0 0 1 0 0: leave X and Y alone, move by nothing.
| Attribute · ItemTransform (a b c d tx ty) | Type / values | Support | Notes |
|---|---|---|---|
| a | number | Supported | X scale factor (and part of any rotation/shear). 1 for no horizontal scaling. |
| b | number | Supported | Vertical shear of the X axis (part of rotation). 0 when upright. |
| c | number | Supported | Horizontal shear of the Y axis (part of rotation). 0 when upright. |
| d | number | Supported | Y scale factor (and part of any rotation/shear). 1 for no vertical scaling. |
| tx | number (pt) | Supported | Horizontal translation, in points. |
| ty | number (pt) | Supported | Vertical translation, in points. Positive moves down (Y grows downward). |
Where it appears
ItemTransform is read off every page item the parser handles — TextFrame,
Rectangle, Oval, GraphicLine, Polygon — and also off the structural
elements above them:
| Attribute · ItemTransform carriers | Type / values | Support | Notes |
|---|---|---|---|
| Spread / MasterSpread | a b c d tx ty | Parsed, not yet rendered | Maps the spread into the pasteboard. Per-page rendering does not need it (each page already lives in spread space); it is parsed for whole-document fidelity. |
| Page | a b c d tx ty | Supported | Maps the page’s inner space into the spread. Identity for single-page-size layouts. |
| Page · MasterPageTransform | a b c d tx ty | Supported | Positions master-page items on this specific page (the Master Page Overlay). |
| Group | a b c d tx ty | Supported | The group transform is composed into each member’s effective transform; the un-composed value is also retained. |
| page items | a b c d tx ty | Supported | TextFrame / Rectangle / Oval / GraphicLine / Polygon. |
Transforms compose
When a shape sits inside one or more Group elements, its placement is the
composition of the group transforms with its own. The parser walks the stack of
enclosing group transforms outermost-first and composes each one, then composes
the item's own ItemTransform last, so the value stored on the item is already
the full inner-to-page mapping. A bare top-level item — no groups — just keeps its
own transform unchanged.
Composition follows the usual rule: applying A ∘ B to a point means apply B
first, then A. So the item's own transform acts before the group's, which is
what you want — the shape is positioned within the group, then the group is
positioned on the page.
A shape at the origin, placed by its transform
The cleanest way to see ItemTransform at work is a shape whose outline is
authored at (0, 0) and moved entirely by its translation. The rectangle below
has a 300 × 120 outline starting at the origin and an ItemTransform of
1 0 0 1 150 200 — no scale, no rotation, just slide it 150 pt right and 200 pt
down.
A rectangle authored at the origin, then placed on the page by its translation.
Spreads/Spread_uspread.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<idPkg:Spread xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="20.0">
<Spread Self="uspread" PageCount="1" BindingLocation="0" ShowMasterItems="true" AllowPageShuffle="true" ItemTransform="1 0 0 1 0 0">
<Page Self="upage" Name="1" AppliedMaster="umaster" ItemTransform="1 0 0 1 0 0" GeometricBounds="0 0 841.89 595.276" MasterPageTransform="1 0 0 1 0 0"/>
<Rectangle Self="urect" ItemTransform="1 0 0 1 150 200" FillColor="Color/Red" StrokeColor="Swatch/None" StrokeWeight="0">
<Properties>
<PathGeometry>
<GeometryPathType PathOpen="false">
<PathPointArray>
<PathPointType Anchor="0 0" LeftDirection="0 0" RightDirection="0 0"/>
<PathPointType Anchor="0 120" LeftDirection="0 120" RightDirection="0 120"/>
<PathPointType Anchor="300 120" LeftDirection="300 120" RightDirection="300 120"/>
<PathPointType Anchor="300 0" LeftDirection="300 0" RightDirection="300 0"/>
</PathPointArray>
</GeometryPathType>
</PathGeometry>
</Properties>
</Rectangle>
<TextFrame Self="uframe" ParentStory="ustory" PreviousTextFrame="n" NextTextFrame="n" ContentType="TextType" AppliedObjectStyle="ObjectStyle/$ID/[None]" Visible="true" Name="$ID/" ItemTransform="1 0 0 1 57.638 145.8237" FillColor="Swatch/None" StrokeColor="Swatch/None" StrokeWeight="0">
<Properties>
<PathGeometry>
<GeometryPathType PathOpen="false">
<PathPointArray>
<PathPointType Anchor="0 0" LeftDirection="0 0" RightDirection="0 0"/>
<PathPointType Anchor="0 400" LeftDirection="0 400" RightDirection="0 400"/>
<PathPointType Anchor="480 400" LeftDirection="480 400" RightDirection="480 400"/>
<PathPointType Anchor="480 0" LeftDirection="480 0" RightDirection="480 0"/>
</PathPointArray>
</GeometryPathType>
</PathGeometry>
</Properties>
</TextFrame>
</Spread>
</idPkg:Spread>
Edit the tx / ty numbers and the red rectangle moves; edit a or d away
from 1 and it scales. The outline anchors never change — only the transform
that carries them onto the page.
Frequently asked questions
What do the six numbers in ItemTransform mean?
They are the free entries a b c d tx ty of a 2D affine matrix. Applied to an
inner point (x, y), the result is x' = a·x + c·y + tx and y' = b·x + d·y + ty — so a and d scale, b and c shear or rotate, and tx / ty
translate (with positive ty moving down, since Y grows downward).
What is the identity ItemTransform?
The identity transform is 1 0 0 1 0 0: it leaves X and Y unchanged and moves by
nothing. The parser requires exactly six numbers, and any value it cannot read as
six is treated as absent, which is equivalent to applying this identity.
How do nested Group transforms combine with an item's own transform?
When a shape sits inside one or more Group elements, the parser composes the
enclosing group transforms (outermost-first) and then the item's own transform
last, so the value stored on the item is already the full inner-to-page mapping.
Composition follows A ∘ B order — the item's own transform acts first, then the
group's — so the shape is positioned within the group and the group is then
positioned on the page.
Units & origin
IDML geometry is measured in points (1/72 inch) from an origin at the page's top-left, with Y growing downward instead of upward.
GeometricBounds
GeometricBounds is the axis-aligned bounding box of an IDML page item, given as four points in the surprising y-before-x order y1 x1 y2 x2 (top, left, bottom, right).