paged.publish and paged.pdf — the format lanes

IDML and PDF in, IDML out

The format lanes: IDML written back in InDesign's own spelling with untouched parts kept verbatim, and PDFs opened as editable text, vector and image frames.

MPL-2.0 OR PMEL·canary — usable, moving fast·0.1.0-canary.0·github.com/paged-media/plugin-publish ↗

20.0.1
InDesign version the IDML spelling is measured against
verbatim
untouched package entries, original bytes
3
frame kinds from a PDF: text, vector, image
1
writer for both .idml and .paged
paged.publish — IDML, read and written back

Patch the package, never regenerate it

Open an .idml and the engine reads the whole package: layers, sections, hyperlinks and text variables; swatches, gradients and every kind of style; pages, master spreads, frames, shapes, groups and guides; stories with tables, footnotes and anchored frames.

Export does not rebuild the package from the model — that would lose everything the parser did not read. It takes the original package, copies every untouched entry with its original bytes, and patches only what changed: edited items and text, new pages, stories, swatches and styles, guides, text wrap and image links.

The Paged Annual, page 111: the opener of Imposition & Proof, the chapter about exits — what the press needs, what the container carries, and what every exit admits it cannot take.
The Paged Annual, page 111: the opener of Imposition & Proof, the chapter about exits — what the press needs, what the container carries, and what every exit admits it cannot take.
An unmutated package already in InDesign’s spelling comes back byte for byte.

With two stated exceptions: a story no frame references is dropped, and Fonts.xml gains every applied face it does not declare.

Oracle — what InDesign actually reads

Written the way InDesign 20.0.1 reads it

Sections, hyperlinks, bookmarks, conditions and fonts are written in the spelling InDesign 20.0.1 was measured to read. The exporter’s rules for document-level resources are each a measured fact, not a guess; a source in an older spelling is rewritten on export.

The same writer produces the .paged container. A .paged file is a structurally valid IDML package at all times: plugin content and the native model ride along as extra entries the designmap does not reference.

The Paged Annual, page 110: the Part III opener — the press pass, the container opened part by part, and the loss ledger of what each exit can carry.
The Paged Annual, page 110: the Part III opener — the press pass, the container opened part by part, and the loss ledger of what each exit can carry.
paged.pdf — a PDF opened as a document

Open a PDF and edit what is on the page

The PDF importer reads a file and opens a native document with one page per PDF page: text frames with their size and fill colour, vector shapes with fill, stroke and stroke width, and placed images. When the editable path cannot run, each page opens as one full-page image instead.

Text
One text frame per line segment, one paragraph per frame. Size and colour are kept; family, bold and italic are not set yet.
Vectors
Fill, stroke and stroke width. Curves become straight polygon segments; gradients, patterns, clipping and dashes are not read.
Images
Placed in the box of their transform; rotation and skew are lost.
Page caps
Up to 12 pages on the editable path and 20 as page images.

PDF export is not a plugin: it lives in the engine, which writes PDF from the same display list it paints — see the core.

Live — the full editor

Bring an IDML or a PDF

the paged editor
Open a PDF or an IDML from the File menuopen full screen ↗
Spec sheet — from the registry, not from marketing

paged.publish features

Plugin · pdf · 6
Editable text reconstruction — positioned glyphs → paragraphs of styled runs
plugin-pdf.editable-text
experimental· 14 tests
Editable vectors + PDF colours mapped to document swatches
plugin-pdf.editable-vector
stable· 2 tests
Non-JPEG image import — PDFium bitmap decode for every filter chain
plugin-pdf.image-filters
stable· untested
crates/pdf-import writes the native `.paged` OCF the engine load path expects
plugin-pdf.native-ocf-writer
stable· 4 tests
Open/read PDF files in the editor (.pdf importer → native document)
plugin-pdf.pdf-import
experimental· 6 tests
PDFium is the reader engine (pdf.js dropped)
plugin-pdf.pdfium-reader
stable· untested
Plugin · publish (IDML/PDF interchange) · 5
Corpus byte-identity sweep — 99/99 packages identical, and what it does NOT measure
plugin-publish.byte-identity-sweep
stable· untested
IDML interchange adapter (idml-import + idml-export crates, re-homed to plugin-publish)
plugin-publish.idml-adapter-crates
stable· 3 tests
.idml exporter — the outbound half of the bundle (media.paged.publish.exporter.idml)
plugin-publish.idml-exporter
stable· untested
.idml importer via host.nativeDocument (@paged-media/publish bundle)
plugin-publish.idml-importer
stable· 6 tests
Save-path defect class — nine defects between a parsed document and its bytes
plugin-publish.save-back-defects
stable· untested
Round-tripping · 5
Batch operations (atomic, rollback-on-error, $created sentinel)
round-tripping.batch-atomicity
stable· 2 tests
Gesture transaction channel (begin/update/commit/cancel)
round-tripping.gesture-transactions
stable· 4 tests
Re-serialize a PARSED document to IDML (save back)
round-tripping.idml-reserialization
stable· 17 tests
Native document round-trip (self-owning .paged model, no source parse)
round-tripping.native-reserialization
stable· 2 tests
Undo / redo (invertible operation log)
round-tripping.undo-redo
stable· 22 tests

16 features · commit-pinned snapshot · the same rows the team plans by