GroupDocs.Conversion for .NET v26.6 is now available. This release adds richer conversion event support, custom image handling for PDF‑to‑Markdown, RTL auto‑detection for DOCX, and multiple stability improvements.

What’s new in this release

Key Category Summary
CONVERSIONNET-7934 Feature PDF to Markdown: allow custom image extraction and placeholder insertion
CONVERSIONNET-8286 Feature Introduce ConversionEvents aggregator with per-call/global handler precedence
CONVERSIONNET-8314 Feature Add OnFontSubstituted conversion event
CONVERSIONNET-8263 Improvement NuGet Package Split
CONVERSIONNET-8280 Improvement Auto-detect RTL direction for DOCX with missing/incorrect bidi markup
CONVERSIONNET-8325 Improvement Spreadsheet to PDF conversions with SkipEmptyRowsAndColumns overlap text when the sheet has form controls
CONVERSIONNET-7912 Bug Corrupted characters in JPEG/TIFF output
CONVERSIONNET-8281 Bug Converting a particular XFA PDF to image hangs and does not produce any result
CONVERSIONNET-8321 Bug Problem converting publisher - Unable to load Aspose.PDF

Public API changes

⚠️ Breaking changes

  • Event names have been renamed and the event aggregation model has changed. Existing per‑result event properties and fluent chain methods are obsolete and will be removed in v26.9.
  • ConverterSettings.Listener and the IConverterListener interface are obsolete; they are replaced by lifecycle events on ConversionEvents.
  • The old OnConversionCompleted per‑document event has been renamed to OnDocumentConverted. The same name is now used for the pipeline‑lifecycle event that fires once at the end of a conversion run.

1. New font‑substitution event

API Description
ConversionEvents.OnFontSubstituted Fires when a font required by the source document is missing and a substitute is used (either automatically or via a user‑defined rule).
FontSubstitutionContext Provides details about the substitution: SourceFileName, OriginalFontName, SubstituteFontName, Reason.
FontSubstitute Represents a user‑supplied substitution rule (e.g., FontSubstitute.Create("MissingFont", "Arial")).

Reference:

Classic API example

using GroupDocs.Conversion;
using GroupDocs.Conversion.Contracts;
using GroupDocs.Conversion.Options.Convert;

var events = new ConversionEvents
{
    OnFontSubstituted = ctx =>
    {
        var detail = ctx.OriginalFontName != null
            ? $"{ctx.OriginalFontName} -> {ctx.SubstituteFontName}"
            : ctx.Reason;
        Console.WriteLine($"Font substituted in '{ctx.SourceFileName}': {detail}");
    }
};

using var converter = new Converter(
    "source.docx",
    () => new ConverterSettings(),
    () => events);

converter.Convert("output.pdf", new PdfConvertOptions());

Fluent API example

FluentConverter
    .WithEvents(e => e.OnFontSubstituted = ctx =>
        Console.WriteLine($"Font substituted: {ctx.Reason ?? ctx.OriginalFontName}"))
    .Load("source.docx")
    .ConvertTo("output.pdf")
    .WithOptions(new PdfConvertOptions())
    .Convert();

Substitution rule example (Word‑processing / Spreadsheet / PDF)

using GroupDocs.Conversion.Options.Load;

using var converter = new Converter(
    "source.docx",
    _ => new WordProcessingLoadOptions
    {
        FontSubstitutes = new List<FontSubstitute>
        {
            FontSubstitute.Create("MissingFont", "Arial")
        }
    },
    () => new ConverterSettings(),
    () => events);

converter.Convert("output.pdf", new PdfConvertOptions());

2. Unified event