OfficeIMO.IWork 3.4.5

Prefix Reserved
dotnet add package OfficeIMO.IWork --version 3.4.5
                    
NuGet\Install-Package OfficeIMO.IWork -Version 3.4.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="OfficeIMO.IWork" Version="3.4.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="OfficeIMO.IWork" Version="3.4.5" />
                    
Directory.Packages.props
<PackageReference Include="OfficeIMO.IWork" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add OfficeIMO.IWork --version 3.4.5
                    
#r "nuget: OfficeIMO.IWork, 3.4.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package OfficeIMO.IWork@3.4.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=OfficeIMO.IWork&version=3.4.5
                    
Install as a Cake Addin
#tool nuget:?package=OfficeIMO.IWork&version=3.4.5
                    
Install as a Cake Tool

OfficeIMO.IWork - Apple iWork readers and native Keynote creation for .NET

OfficeIMO.IWork reads modern Apple Pages, Numbers, and Keynote packages and creates native Keynote presentations without running iWork or executing embedded content. It owns ZIP, directory-bundle, nested Index.zip, Snappy-framed IWA, protobuf-envelope, package-resource, and source-record preservation. Word, Excel, and PowerPoint remain the owners of editable destination documents.

Reference from a source checkout

For source-based development, reference the bounded reader and the opt-in adapter you need:

<ItemGroup>
  <ProjectReference Include="../OfficeIMO.IWork/OfficeIMO.IWork.csproj" />
  <ProjectReference Include="../OfficeIMO.Excel.IWork/OfficeIMO.Excel.IWork.csproj" />
</ItemGroup>

Use OfficeIMO.Word.IWork for Pages or OfficeIMO.PowerPoint.IWork for Keynote in place of the Excel adapter. Keep all project references on the same checkout so their coordinated API and package contracts stay aligned.

Create a native Keynote presentation

using OfficeIMO.IWork;

var presentation = IWorkKeynoteDocument.Create(); // 960 × 540 points
var slide = presentation.AddSlide("E6F2FF");
slide.AddText("Zażółć gęślą jaźń\nA😀B — café", 60, 100, 840, 260,
    fontName: "Arial", fontSizePoints: 40, color: "003366");
presentation.AddSlide(); // blank white slide
presentation.Save("created.key"); // rejects an existing destination
byte[] package = presentation.SaveBytes();

The writer generates its own native object graph, protobuf archives, Snappy frames and deterministic ZIP package. It needs no seed file, OOXML conversion or installed Apple application. Slides have opaque six-digit sRGB backgrounds. Text boxes have one font, size and opaque color throughout, left and top alignment, zero internal padding and no automatic fitting. Frames must lie within the canvas. CR and CRLF normalize to LF; other control characters and invalid UTF-16 are rejected. Fonts are requested by name and are not embedded. Wrapping, fallback glyphs and appearance depend on the receiving application's fonts.

IWorkKeynoteWriteOptions limits slides, total text boxes, UTF-16 text length and package/intermediate archive size. Save operations accept cancellation. Encoding and validation finish before stream copying or file staging. Stream saves leave the caller's stream open and can leave partial data after cancellation or an I/O failure during copying. Path saves use the shared atomic file-commit owner; failed staging preserves the existing destination. Use overwrite: true to replace an existing file. Creation instances are not thread safe.

The native creation evidence records independent graph decoding and Keynote 15.4 open, PDF export, text edit, save and reopen for a three-slide fixture with Arial, Times New Roman and multilingual text. This qualifies that fixture and font environment. Other native versions, rich runs, images, tables, transitions, builds and editing loaded packages remain outside the creation contract. Native Pages and Numbers writing is unsupported.

Read and inspect a source

using OfficeIMO.IWork;

IWorkSourceDocument source = IWorkSourceDocument.Open("report.pages");
IWorkPagesProjection pages = source.ReadPages();

Console.WriteLine(source.Kind);                 // Pages
Console.WriteLine(source.ContainerKind);        // ZipPackage, DirectoryBundle, or nested Index.zip
Console.WriteLine(string.Join(", ", source.BuildVersions));
Console.WriteLine(pages.Paragraphs.Count);

IWorkConversionReport report = pages.CreateConversionReport(
    IWorkProjectionKind.EditableReconstruction);
foreach (IWorkArchiveRecord record in report.PreservedRecords) {
    Console.WriteLine($"{record.EntryPath}: {record.MessageType}");
}
foreach (IWorkSourceUnitCount count in report.SourceUnitCounts) {
    Console.WriteLine($"{count.Kind}: {count.ReconstructedCount} reconstructed, {count.OmittedCount} omitted, {count.UnassessedCount} unassessed");
}
foreach (IWorkSourceReferenceIssue issue in report.SourceReferenceIssues) {
    Console.WriteLine($"{issue.Owner.RecordIdentifier}/{issue.FieldPath}[{issue.ReferenceIndex}]: {issue.Kind}, target {issue.TargetIdentifier}");
}
foreach (IWorkSourceDeclarationIssue issue in report.SourceDeclarationIssues) {
    Console.WriteLine($"{issue.Owner.RecordIdentifier}/{issue.FieldPath}: {issue.Kind}, outer values {issue.DeclaredValueCount}");
}

Pages body runs expose qualified drawable attachments through IWorkTextRun.InlineObject. The attachment keeps its original zero-based UTF-16 CharacterOffset, native attachment identity, and referenced drawable identity. Marker-only runs have empty Text; use InlineObject to distinguish them from ordinary text. Supported zero-offset image and standalone-table placement is described in the support matrix.

Selected modern cell styles expose IWorkTableCell.Fill, including supported solid colors and explicit no-fill overrides. Selected styles also expose Padding in points and VerticalAlignment. A declared empty padding message resets all four sides to zero. Empty cells carrying supported fills, padding or alignment remain in Cells with Kind == Empty and count toward the materialized-cell budget. Filter by Kind when counting value cells. Missing or unsupported selected fills retain source diagnostics; conditional fills, borders and complete cell styling remain outside this qualified subset.

Shared tables expose explicit RowHeights and ColumnWidths as read-only maps keyed by one-based positions, measured in points. GetRowHeight(row) and GetColumnWidth(column) return an explicit size or the table default. Native zero-size entries use the default. MaximumTableDimensionEntries bounds dimension headers and bucket references across the source. Unsupported sizing records remain in source evidence and emit a diagnostic.

Positive native hidden/filtered row or column counts, and malformed count declarations, emit IWORK_TABLE_VISIBILITY_UNASSESSED and require explicit partial conversion for editable output. Partial output and Reader can include content hidden in the source. Counts do not identify which positions are hidden and can be zero even when native hidden-state records select content.

Qualified base user-hidden states resolve UUIDs through a complete, unambiguous table position map. IWorkTable.HiddenRows and HiddenColumns expose sorted one-based positions; cells remain in the model. Excel preserves these positions as hidden rows and columns. Reader includes their content with IWORK_READER_HIDDEN_TABLE_CONTENT_INCLUDED. Word and PowerPoint require the partial policy because their table output keeps those positions visible.

Unresolved base selections, summary states, filtering, pivot hiding, collapsed groups, other unqualified extents and unreadable visibility envelopes emit IWORK_TABLE_HIDDEN_STATES_UNASSESSED. Empty extents, false selectors and disabled filters retain the editable path; disabled rules are not traversed. MaximumTableDimensionEntries also bounds hidden-state declarations, selected UUID maps and filter references. The independent corpus qualifies native hidden columns with empty cells; positive rows and populated hidden cells have synthetic format-boundary proof. Apple export/render equivalence remains unqualified.

Path and stream entry points use the same bounded parser. Stream and byte-array overloads detect the application kind from bounded package content. Pass an expected IWorkDocumentKind when the caller already knows the route and wants a mismatch rejected:

using FileStream stream = File.OpenRead("budget.numbers");
IWorkSourceDocument source = IWorkSourceDocument.Open(
    stream,
    new IWorkReadOptions {
        MaximumPackageBytes = 64 * 1024 * 1024,
        MaximumArchiveReferenceCount = 1_000_000,
        MaximumMaterializedCells = 1_000_000,
        MaximumTableCatalogEntries = 100_000,
        MaximumImageMetadataEntries = 16_384,
        MaximumFormulaRenderingOperations = 64L * 1024 * 1024
    });

IWorkNumbersProjection workbook = source.ReadNumbers();

The verifying form is IWorkSourceDocument.Open(stream, IWorkDocumentKind.Numbers, options).

IWorkTable.FillStyles exposes supported body, header-row, header-column and footer-row fills, plus BandedBody for every second body row after the headers. table.GetFill(row, column) resolves a one-based position without materializing unstored cells. Selected fills override region defaults, including explicit no-fill; unresolved selected fills stay null. Header and footer rows take precedence over header columns. Banding applies only to body cells. Unsupported or unresolved banding suppresses fill defaults and produces IWORK_TABLE_FILL_DEFAULTS_UNSUPPORTED; selected cell fills remain available. The support matrix defines the native Numbers export evidence and remaining appearance limits.

Table text formatting is separate from typed values. IWorkTable.TextStyles exposes applicable region defaults, IWorkTableCell.ParagraphStyle exposes a selected text style, and table.GetParagraphStyle(row, column) resolves the supported style for a one-based position, including an unstored empty cell. Selected styles override region defaults; an unresolved selected style stays null and produces IWORK_TABLE_TEXT_STYLE_UNSUPPORTED. The support matrix defines the qualified fields and limits.

IWorkKeynoteSlide.HasBackgroundFill indicates a recovered slide-style background. BackgroundColor contains its opaque RGB color; a null color with HasBackgroundFill = true denotes explicit no-fill. Selected style inheritance and unsupported-fill diagnostics are described in the background contract.

Keynote IWorkTextBox.Layout exposes selected inherited margins in points, VerticalAlignment and ShrinkToFit; a null layout means those frame properties were not recovered. IWorkTextParagraph.ListLayout exposes qualified character-marker indentation in points, text indentation relative to font size and marker scale. These immutable source properties let callers inspect layout without constructing a destination. The support matrix defines the bounded PPTX mapping and other destination limits.

Cancellation

Path, stream, and byte-array Open overloads accept a CancellationToken after the read options. The token governs loading and all later semantic projections and conversions from that source. Use source.WithCancellation(newToken) for an independently cancellable projection or conversion without rereading the package. The view shares loaded bytes and parsed messages and replaces the previous token; CancellationToken.None permits reuse after the opening token is cancelled. Caller-owned streams remain open when loading succeeds or is cancelled.

using var cancellation = new CancellationTokenSource();
IWorkSourceDocument source = IWorkSourceDocument.Open(
    "budget.numbers", IWorkDocumentKind.Numbers, options: null,
    cancellationToken: cancellation.Token);
IWorkNumbersProjection workbook = source.ReadNumbers();

The destination adapters also accept a token after their read and conversion options. Cancellation is cooperative during loading, projection, and destination construction; saving uses the destination owner's separate save API. These APIs do not establish a fixed cancellation latency or memory budget.

The bounded NativeAOT contract covers source projections, shared Reader extraction, editable DOCX/XLSX/PPTX conversion and native Keynote creation on macOS arm64, Linux x64 and Windows x64 under .NET 8 and 10. Hash-pinned fixtures require complete editable reconstruction, save/reopen and selected Numbers recalculation; the native creator emits the same independently decoded, Apple-accepted package on all six host/runtime combinations. Rendering, complete fidelity and Apple sandbox/device acceptance remain separate qualification requirements.

Opt in to an Office destination adapter

Install only the adapter for the destination format you need. The Word, Excel, and PowerPoint packages do not depend on iWork.

Each adapter README owns its conversion API and example. The source reader remains useful on its own for inspection, extraction, and application-owned projection workflows.

This is extended semantic reconstruction rather than plain-text extraction:

  • Pages recovers rich paragraphs, source-proven list levels and explicit marker fonts mapped to native Word numbering, page layout, section-specific headers/footers, positioned and sized accessible rich-text boxes, images, rich-text table cells, and merges for editable Word projection.
  • Numbers recovers sparse typed cells, rich-text cell runs, supported formulas with cached values, merges, table metadata, and default sizing for editable Excel projection. Each source table receives its own worksheet so table-local formulas and column sizing remain stable; sheet-level text receives a separate worksheet when present. Coordinate-backed single-cell, same-target endpoint ranges and finite rectangular cross-table references resolve unique native identities among selected tables. Their source Formula uses quoted sheet/table labels, such as =SUM('Sheet'::'Table'::$A$1:$B$2); the Excel adapter renders the retained expression with actual worksheet names. Table-local and cross-table whole-axis references, including header-named rows and columns, retain coordinate source expressions. The Excel adapter writes the current body extent and reports IWORK_NUMBERS_TABLE_BODY_RANGE_APPROXIMATED because named labels and automatic expansion are not preserved. Missing or ambiguous identities and ambiguous body metadata remain incomplete with valid caches retained.
  • IWorkNumbersSheet.Drawables retains tables and text shapes in their shared source order. The separate Tables and TextBoxes lists remain available for type-specific access.
  • Keynote recovers slide size, order and names, positioned rich text with explicit inline breaks and source-proven list labels, levels and explicit marker fonts, shape/run and presenter-note hyperlinks, notes, images, rich-text table cells, positioned and rotated tables, and merges for editable PowerPoint projection.

Advanced charts, vector effects, animations, non-cell comments/change tracking, masks/crops, and other application-only structures remain available in source records. Reachable unsupported structures produce conversion diagnostics; preserved records alone do not establish a field-level fidelity assessment. Keynote measurements finer than PPTX's integral EMU grid stay editable and emit IWORK_KEYNOTE_PPTX_PRECISION when they are quantized to the nearest destination unit.

IWorkReadOptions bounds decoded text characters, text items and attribute boundaries, cross-record style inheritance, projected sheets/slides/tables/images, repeated encoded destination-image bytes, merged ranges, source-wide table catalogs, materialized cells, and ArchiveInfo references in addition to the package/IWA byte limits.

All conversion modes use the same bounded semantic source read, so package and projection limits are enforced before the destination representation is chosen. Auto prefers editable semantic reconstruction. EditableOnly fails when supported editable structure cannot be recovered. VisualOnly selects the package's raster preview for the destination and reports VisualFallback; it does not erase or bypass the semantic ReadPages, ReadNumbers, or ReadKeynote projection. RequireCompleteVisualCoverage defaults to true, so incomplete or unknown preview coverage is rejected. Set it to false explicitly on a result API to retain and inspect preview output. Value-only adapter APIs require complete editable reconstruction and reject partial or preview results even under permissive options. AllowPartialEditableReconstruction = true retains bounded recoverable objects and exposes IsPartialEditableReconstruction; source and destination limits still apply.

A raster preview is classified as first-page or composite coverage. An embedded PDF has unknown coverage: its path and structural validity do not establish that it matches the current complete source. Coverage is exposed on IWorkPreviewAsset. Embedded PDF inspection accepts bounded classic cross-reference tables and rejects unvalidated cross-reference streams.

IWorkTextParagraph.ListMarkerKind distinguishes native image, literal-text and numbered markers. A text marker such as 1. stays a literal DOCX bullet and an unordered Reader list; it does not become a counter. PPTX retains single-character text bullets and reports unsupported multi-character markers through destination fallback. Image markers remain unassessed, retain declaration evidence at the selected list-style field 11, and require explicit partial reconstruction for editable output. Native numbered markers expose the qualified initial format; counters, restarts and continuation remain unqualified.

IWorkTextParagraph.ListFontName retains an explicit inherited list-marker font independently of the paragraph and run fonts. A cleared or unspecified font is null. DOCX and PPTX adapters preserve explicit marker fonts; Reader reports their omission from Markdown. Rejected child marker-font declarations clear the inherited value and retain source-declaration evidence at list-style field 22 or 23. Font availability and native rendered glyph equivalence require separate platform qualification.

Preservation and authoring boundary

Projected documents, sheets, slides, tables, images, and text expose SourceIdentity with the native IWA identifier, message type, entry path, and payload position. Adapter reports retain these identities in SourceUnits and summarize them by kind in SourceUnitCounts, even when source payload preservation is disabled. The inventory counts identified units selected by the semantic projection: text storages are counted once, auxiliary table models and tiles are excluded, and inactive template records are excluded. Explicitly dropped selected units are reported as omitted. Selected unsupported drawables and Numbers sheet references with unsupported native types retain their identities under UnsupportedObject when no recognized kind applies. A preview leaves individual unit coverage unassessed. Unresolved references and content paths that the projection has not assessed remain outside this inventory. A reconstructed unit can still contain omitted, approximated, or unassessed fields.

SourceReferenceIssues separately records failed declared reference occurrences in assessed content paths: Pages body, stacking-order, decoded floating-canvas, shape text-storage, section, declared header/footer template and header/footer storage references; Numbers sheets, sheet drawables and shape text-storage references; and Keynote show, slide-tree nodes, slides, slide drawables, selected drawable text-storage and presenter-note references. Each issue retains the owning record, protobuf field path, one-based occurrence and readable target identifier. Missing targets, malformed references and readable siblings in a rejected set are distinct. Existing targets whose native type is unsupported by the selected path use UnexpectedTargetType. This covers decoded paragraph, list, character and hyperlink attribute references, traversed style parents, and applicable table style, role and selected cell-style references. Character attributes accept both character and paragraph styles. Typed structural links also cover Pages body/shape storage, section and header/footer dependencies, Numbers sheets and shape storage, the Keynote show/slide-node/slide chain, direct and nested drawable text storage, presenter-note wrappers and note storage, selected inline attachment/drawable, table-model, validated tile, sizing-bucket, rich-text catalog/wrapper/storage, selected cell-style and number-format catalog, and qualified root-comment catalog/record/author references. Rejected repeated sets keep their readable siblings classified as unselected; wrong-type targets in an otherwise accepted set retain their physical positions without being counted as missing objects. Unselected catalog values and inapplicable roles remain outside this assessment. Repeated occurrences within a source field remain separate; selecting a shared archive several times does not multiply its evidence. These occurrences do not identify distinct omitted objects, and preview output does not resolve them. Selected tables also assess table-info/model, tile, row/column sizing-bucket, string/formula/rich-text catalog, selected rich-text wrapper and wrapper/storage references. Tile paths retain physical entry positions; entries rejected before their target is read remain unassessed. Declared unresolved or malformed string/formula catalog links prevent complete editable reconstruction while valid cell caches remain recoverable through the explicit partial-conversion policy. Unreferenced templates, unused storage fallbacks and unparseable graph containers remain outside this assessment. MaximumSourceReferenceIssues defaults to 100,000 and bounds the cumulative occurrences inspected in distinct fields with failures, including readable siblings, before evidence is materialized. Adapter reports classify this evidence as Unassessed through IWORK_SOURCE_REFERENCES_UNRESOLVED.

SourceDeclarationIssues records unreadable, rejected or unsupported declarations separately from failed references and identified objects. Each item retains its owner, protobuf path, failure kind and known outer field-value count. A whole payload uses $ and has no outer count; nested repeated entries use one-based positions. These counts do not reveal nested reference totals or omitted content. Coverage includes selected document roots, Pages body/shape/section/header/footer records and stacking/floating graph envelopes, Numbers sheet/plain-text record failures, Keynote show/tree/node/slide/drawable/note record failures, table-info/model/store/tile-list and row-header containers, selected string/formula/rich-text catalog envelopes and entry keys, plain-string values and formula-message envelopes, row/column sizing-bucket payloads and header metadata, selected merge-owner/store/pair/formula declarations, selected rich-text wrapper/storage records, decoded rich-text attribute containers and invalid entry positions, unreadable styles or style-parent envelopes actually traversed for text, and invalid values in supported character and paragraph properties, list label/type/indent vectors, style names and selected hyperlink text. Inactive records and unused rich-text value traversal are excluded. Other unsupported fields and remaining unmaterialized cell storage beyond the selected modern-row evidence remain coverage gaps. Shared paths report once per projection. MaximumSourceDeclarationIssues defaults to 100,000 and bounds distinct retained paths; evidence survives disabled source-payload preservation and visual fallback, with category Unassessed through IWORK_SOURCE_DECLARATIONS_UNASSESSED. Configured protobuf field, repeated-value and depth limits remain fatal; text-budget failures propagate rather than being reported as malformed declarations.

Modern row selection retains InvalidValue evidence at tile paths 5[n]/2 for a malformed, ambiguous or inconsistent declared cell count, and 5[n]/6 for a non-empty modern buffer with no selected offsets. A readable count is compared with selected physical cell records, including unformatted empty records that need no destination cell. An absent count remains supported. These paths describe outer field values, not missing-cell totals; no cell coordinates or formula presence are inferred from unselected bytes. Recoverable cells remain available through explicit partial conversion, while IWORK_TABLE_ROW_STORAGE_UNASSESSED reports Unassessed fidelity. Empty buffers with no selected offsets remain valid. Legacy companion buffers are not treated as unselected modern content when modern storage is present. Shared paths use the existing declaration budget and report once per projection. Selected cells end at the next declared physical record, including bounded offsets outside the table; truncated values and formula caches cannot consume that record's bytes. Populated out-of-table offsets and oversized offset envelopes retain InvalidSelectionMetadata at 5[n]/7. Envelopes exceeding the larger of the declared column count and 256 slots are rejected before slot inspection; readable sibling rows remain recoverable without inferred cells or formulas from the rejected row. Supported tables wider than 256 columns remain readable. Every inspected offset slot, including empty trailing slots, consumes MaximumTableDimensionEntries across the source. Invalid offsets beyond the buffer do not discard a preceding complete cell.

IWorkTableCell.UnsupportedFeatures identifies selected modern conditional-style, applied-rule, unresolved or unsupported comment and scalar-format fields after the complete cell storage has been decoded. These flagged fields remain unassessed. Qualified root comments are exposed separately through IWorkTableCell.Comment. None does not establish complete cell fidelity. Cells with these features, including otherwise empty cells, remain materialized under MaximumMaterializedCells. NumericFormat retains each cell whose selected numeric or currency format cannot be resolved or qualified, including blank cells; catalog-level diagnostics remain available alongside this cell-level evidence. Their row buffer retains UnsupportedField declaration evidence at tile path 5[n]/6, deduplicated under the existing declaration budget; its outer count is not a cell, rule or comment count. IWORK_TABLE_CELL_FEATURES_UNASSESSED reports the number of affected selected cells as Unassessed and requires the existing partial-conversion policy to retain editable values. Reader retains the warning. Truncated cells keep decode-failure evidence instead of assessed feature presence. Unused feature catalogs, conditional-rule contents, controls, suggestions, formula-error details and import-warning selectors stay outside this inventory.

Selected date/time format 261 exposes IWorkNumberFormat.DateTimeFormat.SourcePattern for the five complete patterns dd/MM/y, dd/MM/y HH:mm, HH:mm:ss, h:mm a and d MMM yyyy. They map to invariant XLSX formats and the shared calendar formatter for Word, PowerPoint and Reader tables. Four-digit calendar years, abbreviated English month names and lowercase day periods follow the independent parser display evidence. Typed dates and original formula caches remain unchanged; XLSX pre-1900 and precision guards still apply. IWORK_NUMBERS_DATE_DISPLAY_APPROXIMATED reports locale, calendar, timezone and punctuation limits. Other patterns, true suppression settings, ambiguous declarations or extra metadata retain DateFormat evidence and the partial policy. The date-format evidence checks 89 selected cells in five unchanged sources. The paired Numbers 14.5 export uses localized punctuation and refreshed volatile caches, so it does not establish source/native cache or appearance equivalence.

The explicit duration format 268, abbreviated style 1, largest unit 4 (hours), smallest unit 8 (minutes) and automatic units false exposes IWorkNumberFormat.DurationFormat and maps to [h]"h" m"m". A fixed day-only range (largest and smallest unit 2) exposes IWorkDurationUnit.Day and maps to 0"d" on numeric day serials. Signs, raw source seconds and formula caches are retained; text tables use the same shared numeric or elapsed formatter as XLSX previews. Whole-day values match the independent duration-range evidence, including negative durations. Fractional days follow destination numeric rounding, which can differ from source truncation; the underlying value is unchanged. Week/day/hour decomposition remains unassessed because a native XLSX number format has no equivalent elapsed week/day tokens. IWORK_NUMBERS_DURATION_DISPLAY_APPROXIMATED and text-display diagnostics retain spacing and rounding limits. Other ranges, styles, automatic units, missing settings or extra metadata retain DurationFormat evidence and the existing partial policy. The paired duration evidence agrees with the existing Numbers 14.5 XLSX code and cache; broader native rendering and locale equivalence remain unqualified. Selected text and Boolean formats resolve the existing format catalog only after complete cell decoding. A unique native text format (260) or Boolean format (1) with no additional settings preserves the editable default. Explicitly Text-formatted blank cells expose IWorkNumberFormatKind.Text and preserve XLSX Text format (@) after save/reopen, matching the nine blank Text cells in the Numbers 14.5 native export. Dormant text catalogs do not apply a format; custom text settings remain unassessed. Missing, ambiguous, malformed or other format declarations retain TextFormat or BooleanFormat evidence and require the existing partial policy. Recoverable text, Boolean, date/time and duration values remain typed; this assessment does not apply other custom format settings. Catalog and row evidence share existing reference/declaration budgets, and parser limits remain fatal. The independent scalar-format corpus retains 15 representative declarations and selector counts from four unchanged native packages; it does not qualify Apple exports or appearance.

Selected style-value failures use InvalidValue with their physical property path, such as 11/3 for font size, 11/7 or 11/26 for an unresolved foreground/background color value, 12/1 for alignment, 1/1 for a style name and 2 for hyperlink text. Counts describe that property’s outer values, including zero for missing required hyperlink text. Ambiguous Boolean values and clear-font/color selectors do not replace qualified inherited values. Rejected list vectors retain qualified parent metadata rather than removing invalid entries and shifting later levels. List evidence uses root fields 11 for label types, 13 for indents and 16 for labels; a packed label-type field counts as one outer value rather than its decoded element count.

Catalog keys are indexed before values are trusted. A malformed value with a readable, distinct key leaves healthy sibling values recoverable. Duplicate keys remain unresolved, including when a duplicate value is malformed; an unreadable entry or key leaves uniqueness unassessed and prevents resolving any catalog value. Formula cells retain valid caches when their expressions cannot be resolved. Catalog evidence uses 3[n] for an unreadable physical entry, 3[n]/1 for key metadata, 3[n]/3 for invalid plain-string values (InvalidValue), and 3[n]/5 for rejected or unreadable formula messages. The catalog-entry budget includes unreadable entries. Rich-text value, wrapper, storage and style traversal stays limited to entries selected by decoded cells.

Sizing-bucket evidence uses 2[n] for unreadable physical headers, /1 for invalid or duplicate indexes, /2 for invalid sizes, and /3 for unsupported visibility values. InvalidValue covers size and visibility failures. An unknown index or unresolved bucket makes overrides on that axis untrusted, including overrides in other selected buckets; the other axis remains recoverable. Invalid values at readable, distinct indexes leave healthy sibling sizes available. Native zero continues to select the table default. Repeated bucket references retire their readable indexes while retaining unrelated overrides, and are reported at model path 4/1/2; shared physical header paths report once. Explicit partial conversion retains recovered sizes using each destination owner's existing default and geometry rules.

Merged-range evidence uses model paths 47 and 47/2 for rejected or unreadable owner/store messages, 47/2/3[n] for unreadable physical pairs, and 47/2/3[n]/2 for formula declarations with unsupported bounds or conflicts. Counts describe the outer field at that path. Conflicting rectangles are all retired; disjoint, valid merges remain recoverable through explicit partial conversion. A decoded out-of-bounds rectangle disqualifies only intersecting merges and is never exported as a clipped merge. Exact valid duplicates normalize to one merge; every physical alias retains evidence when that merge conflicts. An unreadable range can conceal any overlap, so cells remain recoverable without applying merges. Configured pair, syntax-node, protobuf and evidence limits remain fatal. Destination guards still protect populated covered cells.

Selected native table tiles retain unreadable payloads as $, rejected row sets as 5, and unreadable or invalid rows as 5[n] using their physical one-based positions. Tile-list selection failures retain model paths 4/3/1[n]. Invalid row indices, modern buffer/offset metadata and unsupported legacy storage retain row-level evidence without inventing cell counts. Readable sibling rows survive malformed entries; the table remains incomplete and requires explicit partial reconstruction for editable output. Shared tile paths report once per projection. Rejected envelope/count bounds are checked before nested rows are parsed; configured parser limits remain fatal on content actually parsed.

Pages body, shape, header/footer, Keynote drawable/note and selected table-cell rich text also report failed references in decoded paragraph, list, character-style and hyperlink tables, plus parent references in styles traversed for that text. Each valid-offset decoded attribute entry is assessed, including end-of-text declarations; its path preserves the physical table-entry position. Unused style records are not traversed. Malformed attribute containers and entries with invalid offsets remain unassessed. Numbers shape text is decoded as plain text, so its formatting references remain outside this evidence. Table rich-text catalogs index all declared entries under the catalog budget, preserving structural and duplicate-key checks. Text, styles and wrapper/storage references are resolved when a decoded cell selects a catalog entry; aliases share storage decoding while each cell use consumes its text budget. Unused rich-text entries do not consume text budgets or add reference evidence. Unparseable table containers and unsupported table dependency fields remain unassessed.

SourceCellIssues identifies materialized selected cells whose storage or value could not be decoded, with table identity, one-based coordinates and the decoding message. IWorkTableCell.HasDecodeError distinguishes these failures from recovered native #ERROR markers; it does not assess every field of a successfully decoded cell. The inventory survives visual fallback and disabled record preservation, stays within the source-wide materialized-cell budget and reports Unassessed through IWORK_SOURCE_CELLS_UNDECODED. Undecoded formula cells also retain their separate formula/cache assessment. Unreadable rows, rejected storage and inactive tables do not establish cell coordinates and add no guessed cell counts. These source assessments do not describe destination cell retention.

Qualified cross-table cell and rectangular-range references remain incomplete until their native table identities can be resolved. Endpoint pairs require the same target identity; other reference node families remain unqualified. Their typed cached values stay available; dropping a table qualifier never produces a complete local expression. A merge qualifier must identify its owning table through the qualified four-word UUID representation; references to another table and ambiguous declarations retain source evidence instead of defining a local merge.

FormulaCells identifies source formula declarations by table identity and one-based coordinates. ExpressionIsAssessed distinguishes reconstructed or unresolved expressions from undecoded cell contents. Cache status is complete, partial, missing, approximate for a high-precision decimal or generic error marker, or Unassessed when the cell cannot be decoded. A supported version-5 header with the formula flag establishes SourceFormulaIsDeclared, even if later value decoding fails; the cell keeps its existing error output. Unsupported versions and unreadable headers do not establish formula presence. FormulaSummary includes separate unassessed expression and cache counts. These source assessments survive visual fallback and disabled record preservation; they do not establish destination formula retention or cache freshness. The inventory remains bounded by materialized-cell limits and excludes inactive tables.

Every package entry and every decoded IWA payload remains available as defensive bytes on IWorkSourceDocument. Import reports expose source payloads through PreservedRecords when PreserveSourceRecords is enabled. PreservedRecordCount counts source payloads regardless of that detail setting. UnassessedRecordCount includes consumed and auxiliary records whose field-level fidelity has not been assessed; it is not an omission count. IWORK_RECORD_FIDELITY_UNASSESSED uses OfficeConversionLossKind.Unassessed, so strict no-loss policies reject it without claiming those records are missing content. The destination DOCX, XLSX, or PPTX contains the supported reconstruction or visual fallback; it is not a lossless iWork package rewrite.

Loaded Pages, Numbers and Keynote packages remain read-only. Native Keynote creation uses the separate IWorkKeynoteDocument model; it does not provide save-back or preservation of edited source packages.

See the iWork support matrix for the version corpus, limits, semantic coverage, and known boundaries.

IWorkTableCell.NumberFormat exposes supported modern number, percentage, currency, and scientific semantics: decimal places (null for automatic), digit grouping, and negative-value style. Scientific formats support the default minus style without grouping; decimal places describe the mantissa. Currency metadata also exposes the three-letter uppercase source CurrencyCode and UseAccountingStyle; the code does not imply a symbol or locale. It does not change Value, DisplayText, or CachedDisplayText. The Excel adapter applies this metadata to numeric XLSX cells; the Word and PowerPoint adapters apply supported invariant display text and red format color while reporting approximation for locale, automatic precision and source appearance. Cells whose display cannot be safely formatted retain raw text and report omission. Unsupported selected numeric formats retain source diagnostics and physical catalog-declaration evidence when a declaration can be identified.

Fraction formats expose Kind == IWorkNumberFormatKind.Fraction and FractionAccuracy: one-, two-, or three-digit denominators, or fixed halves, quarters, eighths, sixteenths, tenths, and hundredths. DecimalPlaces is null for fractions and does not mean automatic decimal formatting. The qualified subset uses minus negatives without grouping; other controls remain unsupported. The Excel adapter uses mixed-fraction formats and reports IWORK_NUMBERS_FRACTION_DISPLAY_APPROXIMATED for rounding, normalization, and spacing differences.

Finite Decimal128 values remain numeric even when their coefficient exceeds fifteen significant digits. Such cells set NumericValueIsApproximate, retain the exact normalized source value in SourceNumberText, and emit IWORK_TABLE_NUMERIC_VALUE_APPROXIMATED with Approximation fidelity. Formula caches receive the same metadata and approximate cache assessment. The retained text counts toward projection text limits. Nonfinite, noncanonical, overflowing, and nonzero underflowing values remain decode failures.

Target frameworks and dependencies

OfficeIMO.IWork targets .NET Standard 2.0, .NET 8, .NET 10, and .NET Framework 4.7.2 on Windows. The source reader depends only on OfficeIMO.Core; its IWA, Snappy, protobuf-envelope, and package readers are first-party implementations. Destination projection is opt-in through OfficeIMO.Word.IWork, OfficeIMO.Excel.IWork, or OfficeIMO.PowerPoint.IWork.

Table-cell comments

IWorkTableCell.Comment exposes qualified root comments with exact plain Text, display Author, UTC CreationDateUtc, and native comment/author record identities. Comments on empty cells remain materialized and use the existing cell, catalog-entry and text budgets. Catalog, comment and author records are traversed only when selected by a fully decoded cell. Unresolved selectors, replies, invalid timestamps and unsupported record shapes retain UnsupportedFeatures.Comment and source diagnostics.

Numbers-to-XLSX conversion writes qualified roots through the Excel threaded-comment owner and retains text, author, timestamp and cell address after reopening. DOCX and PPTX table conversion require explicit partial reconstruction to omit cell comments. Reader reports their omission from its grid. Author colors, collaboration identifiers, native UUID mapping, replies, Apple export equivalence and rendered comment appearance are outside this contract.

Pages section headers and footers

Pages section projections distinguish stored header/footer templates (HasFirstPageTemplate, HasEvenPageTemplate, HasDefaultPageTemplate) from their selection settings (DifferentFirstPage, DifferentOddAndEvenPages, HideFirstPageHeadersAndFooters). Stored alternate templates may be inactive. SelectedHeaderContents and SelectedFooterContents expose the semantic inventory selected by those settings. Reader extraction and conversion-report counts use that inventory; it does not establish how many rendered pages use each template.

Generated capability summary

This table is generated from the package-neutral OfficeIMO operation catalog. The detailed source contracts remain authoritative for feature-level behavior and limitations.

Operation Supported Partial Preserved Rejected Unsupported Not applicable
Create 1 0 0 0 1 0
Read 1 0 0 0 0 0
Edit 0 0 0 0 1 0
Preserve 0 0 0 0 1 0
Inspect 1 0 0 0 0 0

The complete rows for OfficeIMO.IWork are published in the generated operation contract.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on OfficeIMO.IWork:

Package Downloads
OfficeIMO.PowerPoint.IWork

Opt-in Apple Keynote to OfficeIMO PowerPoint conversion adapter with bounded source and loss reports.

OfficeIMO.Word.IWork

Opt-in Apple Pages to OfficeIMO Word conversion adapter with bounded source and loss reports.

OfficeIMO.Excel.IWork

Opt-in Apple Numbers to OfficeIMO Excel conversion adapter with bounded source and loss reports.

OfficeIMO.Reader.IWork

Apple iWork adapter for OfficeIMO.Reader modular ingestion.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.4.5 611 10/10/2026
3.4.4 394 9/27/2026
3.4.3 353 9/12/2026
3.4.2 282 9/9/2026
3.4.1 288 9/7/2026
3.4.0 228 9/6/2026
3.3.0 218 9/2/2026