Version 26.6 introduces the ConversionEvents aggregator — a single typed object that replaces three previously separate registration paths: the per-handler properties on ConverterSettings, the IConverterListener assigned to ConverterSettings.Listener, and the fluent chain methods placed after WithOptions(...) or Compress(...). The old surfaces continue to work but are obsolete and planned for removal in v26.9.
Per-result events were renamed at the same time — the noun moved from “Conversion” to “Document” or “Page” so the pipeline-lifecycle group could reuse “Conversion”:
Old name
New name
OnConversionCompleted (per-document)
OnDocumentConverted
OnConversionFailed (per-document)
OnDocumentFailed
OnConversionByPageCompleted
OnPageConverted
OnConversionByPageFailed
OnPageFailed
OnCompressionCompleted
(unchanged)
The OnConversionCompleted name is reused for the new lifecycle event (Action, no parameters, fires once at pipeline end). The old per-document variant is now OnDocumentConverted.
Classic API
Before — handlers were set as individual properties on ConverterSettings:
The chain method continues to work in v26.6 — the IConversionCompressResultCompleted interface that declares it is marked obsolete and is planned for removal in v26.9.
Pipeline lifecycle — replacing IConverterListener
Before — implement IConverterListener and assign the instance to ConverterSettings.Listener:
ConverterSettings.Listener continues to forward Started / Progress / Completed callbacks into the internal events bag in v26.6 — both ConverterSettings.Listener and the IConverterListener interface are marked obsolete and are planned for removal in v26.9.
Per-call vs global precedence
Handlers registered through ConversionEvents are global and fire on every Convert(...) call. The Convert(...) overloads that accept an Action<ConvertedContext> register a per-call handler that wins over the global OnDocumentConverted for that single call only — the precedence rule is (perCall ?? global)?.Invoke(...). Between consecutive runs on the same converter, only the per-call slot is reset; the global events bag is preserved.