Spreads and pages
The IDML Spread and Page elements — the attributes that position a spread on the pasteboard and a page within its spread, and how the parser reads each one.
A Spread is the outer coordinate frame of a layout, and each Page maps its own inner coordinates into that spread.
In short: In IDML, a Spreads/Spread_*.xml part wraps a single <Spread>
element, and that spread contains one or more <Page> elements followed by the
page items that sit on them. The spread is the outer coordinate frame onto the
document's pasteboard; each page carries its own rectangle and an
ItemTransform that places it within the spread. This is how the two pages of a
facing-pages opening end up side by side. This page is the attribute reference
for both elements as the parser actually reads them.
The Spread element
The parser opens the spread and reads two things off the opening tag — its
Self id and its ItemTransform — and otherwise treats the spread as a
container it walks for pages and page items. The remaining spread-level
attributes (binding, page count, flattener settings) are part of the format but
are not consulted while building the document.
| Attribute · Spread | Type / values | Support | Notes |
|---|---|---|---|
| Self | string id | Supported | The spread id, e.g. "uspread". Used to identify the spread. |
| ItemTransform | list of doubles [a b c d tx ty] | Parsed, not yet rendered | Maps the spread's inner coords onto the document pasteboard. Read and stored; per-page rendering does not need it, so a non-identity value is not yet applied. |
| PageCount | int | Not yet parsed | How many pages the spread declares. The parser counts the Page elements it actually finds instead. |
| BindingLocation | int | Not yet parsed | Which edge the spread binds on. Not read. |
| AllowPageShuffle | boolean | Not yet parsed | Whether pages may move between spreads on repagination. Not read. |
| ShowMasterItems | boolean | Parsed, not yet rendered | Whether master items display on this spread's pages. The current pass stamps master items per page regardless; see Master spreads. |
| FlattenerOverride | enum | Not yet parsed | Transparency-flattener preset for the spread. Not read. |
ItemTransform is stored on the spread but, in practice, InDesign limits it to
translation plus rotation in 90° steps, and each page already carries its own
transform into spread space — so per-page output is correct even while a rotated
whole-spread pasteboard is still on the roadmap. Parsed, not yet renderedSpread ItemTransform
The Page element
A <Page> is where the model gets specific. The parser requires a parseable
GeometricBounds — a page with no bounds is skipped entirely — and from that one
attribute it derives the page rectangle. The rest of the attributes position the
page, link it to a master, and record any master-item overrides.
| Attribute · Page | Type / values | Support | Notes |
|---|---|---|---|
| Self | string id | Supported | The page id, e.g. "upage". |
| GeometricBounds | four numbers "y1 x1 y2 x2" (pt) | Supported | The page rectangle in the page's own inner coords. REQUIRED by the parser — a Page without it is dropped. Order is top left bottom right. |
| ItemTransform | list of doubles [a b c d tx ty] | Supported | Maps the page's inner coords into the spread. Absent ⇒ identity, so the page sits at the spread origin. This is how the two pages of a spread end up side by side. |
| AppliedMaster | string id (master Self) | Supported | The Self id of the master spread applied to this page. Resolved to a MasterSpread when master items are stamped. |
| MasterPageTransform | list of doubles [a b c d tx ty] | Parsed, not yet rendered | Positions the master overlay on this specific page. The translation part is applied when stamping master items; the full matrix is parsed but only the offset is currently used. |
| OverrideList | space-separated ids | Supported | Self ids of master items this page has overridden. The named master items are not stamped onto the page. See Override resolution. |
| Name | string | Supported | The user-visible page label as InDesign rendered it ("1", "iii", "A-3", …). Substituted for auto-page-number markers; falls back to the 1-based body-page index when absent. |
Why GeometricBounds and ItemTransform are a pair
GeometricBounds describes the page rectangle in the page's own coordinate
system, and ItemTransform carries that rectangle into the spread. For a
single-page-per-spread layout the transform is identity, so the bounds are the
spread-space bounds — which is why simple fixtures behave even if they omit the
transform. The moment a spread holds two pages, the left page's ItemTransform
translates it to the left of the binding while the right page sits at the spread
origin. The full coordinate story — units, axis direction, and how a frame's
points compose with these transforms — lives under
Geometry & coordinates.
Name and page numbering
Name is the label InDesign already resolved for the page, including any
section-driven style (Roman numerals, prefixed labels, and so on). The renderer
substitutes it directly for auto-page-number markers. When a page omits Name,
the renderer falls back to a naive 1-based body-page index — InDesign <Section>
elements are not parsed, so section-driven numbering is only honored to the
extent it has already been baked into each page's Name.
Section numbering proper is covered under Sections, numbering & variables.
Frequently asked questions
What is the difference between a spread and a page in IDML?
A <Spread> is the outer container — the coordinate frame that sits on the
document's pasteboard and holds the pages of one opening. A <Page> is a bounded
rectangle within that spread, described by its own GeometricBounds and carried
into spread space by its ItemTransform. One spread can hold several pages.
Why does a Page need both GeometricBounds and ItemTransform?
GeometricBounds gives the page rectangle in the page's own coordinate system,
while ItemTransform places that rectangle within the spread. For a single page
per spread the transform is identity, so the bounds are also the spread-space
bounds; once a spread holds two pages, each page's transform is what sets them
side by side.
What happens if a Page has no GeometricBounds?
The parser requires a parseable GeometricBounds to derive the page rectangle, so
a <Page> without one is skipped entirely. Every other page attribute is
optional, but bounds are not.
Layout model
IDML's layout model is the nest of containers that places content — a document of spreads, each holding pages, each filled by page items, with master spreads supplying repeating layout.
Page items and stacking
What an IDML spread contains, and how the document order of its page items becomes back-to-front z-order at render time.