Version 26.10 tightens how documents load the resources they reference. Code compiles unchanged, but a conversion that relied on the earlier rules can produce different output or fail. With the default SkipExternalResources = true:
Before 26.10
Since 26.10
What to do
Local files outside the document’s folder loaded
They are skipped
Add their folder to WhitelistedResources as a file: prefix, such as file:///C:/assets/, or copy the files next to the document
UNC paths (\\server\share) loaded while SkipExternalResources was false
They never load, whatever the options
Copy the files to a local folder, or serve them over https and whitelist that prefix
WhitelistedResources entries matched as fragments of the URL, such as jpg or example.com
Each entry must be an absolute URI prefix; any other entry makes the load fail with InvalidLoadOptionsException
Set ExecuteScripts = true on WebLoadOptions or SvgLoadOptions for documents you trust
SVG and SVGZ documents converted without load options used PageDescriptionLanguageLoadOptions, which has no resource control
They use SvgLoadOptions, which skips external resources
Pass SvgLoadOptions with a whitelist, or with SkipExternalResources = false
XBRL and iXBRL taxonomies loaded from any location
A taxonomy outside the document’s folder makes the load fail with InvalidLoadOptionsException
Pass FinanceLoadOptions with SkipExternalResources = false
3D material libraries, textures and buffers loaded from any location
They load only from the model’s own folder, and never from a remote location
Add their folder to ThreeDLoadOptions.WhitelistedResources as a file: prefix
The same rules now also apply where they did not before: images outside the document’s folder are no longer embedded when HTML or e-mail is converted to a spreadsheet format, Markdown documents no longer fetch remote images, and XML converted through an XSL-FO stylesheet no longer loads external images.
For example, an XBRL filing that references a remote taxonomy converts again with:
WithOptions(...) in the fluent API now returns IConversionHandlersStage (or IConversionByPageHandlersStage for page-by-page conversion). Chained calls such as .WithOptions(...).OnConversionCompleted(...).OnConversionFailed(...).Convert() compile unchanged; only code that stores an intermediate result in a variable of one of the removed interface types needs the new type.
On .NET 6 and later, the exception classes in GroupDocs.Conversion.Exceptions no longer declare the legacy serialization constructor (SerializationInfo, StreamingContext) or override GetObjectData; on .NET Framework they are unchanged. This only affects code that derives from these exception types and calls the serialization constructor.
Migrating to ConversionEvents (v26.6)
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 obsolete surfaces are removed in version 26.9 — see Migrating to 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:
ConverterSettings.Listener and the IConverterListener interface were obsolete from v26.6 and are removed 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.