Work in progress — this reference is being written in the open. Unfinished pages are excluded from search engines.
Paged · IDML Reference
Geometry & coordinates

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.

Intermediate· reference

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 + ty

So 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 / valuesSupportNotes
anumberSupportedX scale factor (and part of any rotation/shear). 1 for no horizontal scaling.
bnumberSupportedVertical shear of the X axis (part of rotation). 0 when upright.
cnumberSupportedHorizontal shear of the Y axis (part of rotation). 0 when upright.
dnumberSupportedY scale factor (and part of any rotation/shear). 1 for no vertical scaling.
txnumber (pt)SupportedHorizontal translation, in points.
tynumber (pt)SupportedVertical 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 carriersType / valuesSupportNotes
Spread / MasterSpreada b c d tx tyParsed, not yet renderedMaps 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.
Pagea b c d tx tySupportedMaps the page’s inner space into the spread. Identity for single-page-size layouts.
Page · MasterPageTransforma b c d tx tySupportedPositions master-page items on this specific page (the Master Page Overlay).
Groupa b c d tx tySupportedThe group transform is composed into each member’s effective transform; the un-composed value is also retained.
page itemsa b c d tx tySupportedTextFrame / 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.

On this page