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.Listenerand theIConverterListenerinterface are obsolete; they are replaced by lifecycle events onConversionEvents.- The old
OnConversionCompletedper‑document event has been renamed toOnDocumentConverted. 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());