Browse our Products

Aspose.Words for .NET 24.8 Release Notes

Major Features

There are 51 improvements and fixes in this regular monthly release. The most notable are:

  • Chart Customization: Precise control over chart axis tick label orientation and rotation.
  • Font Management: Expanded font information with EmbeddingLicensingRights property.
  • Document Structure: Efficiently clear section headers and footers while preserving watermarks.
  • Format Compatibility: Improved HTML and XAML export with backward compatibility for backslash and yen sign.
  • PDF Functionality: Enhanced PDF export with support for using SDT tags as form field names.
  • Document Conversion: Introduced a new LowCode.Converter class, designed to provide a set of methods for converting various types of documents with a single line of code.
  • Digital Signatures: Enabled digital signing of XPS documents using XpsSaveOptions.

Full List of Issues Covering all Changes in this Release

Expand to view the full list of issues.
KeySummaryCategory
WORDSNET-26787Provide a way to specify UpdateCreatedTimeProperty,UpdateLastPrintedProperty and UpdateLastSavedTimeProperty options while using Document.RenderToSize and Document.RenderToScale methodsNew Feature
WORDSNET-27203Add property to specify axis labels orientationNew Feature
WORDSNET-27202Add property to specify axis labels rotationNew Feature
WORDSNET-27222Consider using Title or Tag of SDT as a name of form field in PDFNew Feature
WORDSNET-27063Export control form tag or alias as form ID in PDFNew Feature
WORDSNET-26552Consider adding an option into Section.ClearHeadersFooters to keep watermarksNew Feature
WORDSNET-25369Implement low-code public API for direct conversion between fixed page formatsNew Feature
WORDSNET-26686Provide an option to check “Print and Preview” flag for fonts embedded into documentNew Feature
WORDSNET-26848Support watermarks in output XSLX documentsNew Feature
WORDSNET-27184Implement Bibliography edit APINew Feature
WORDSNET-10750Provide Table.ConvertToText method in Aspose.WordsNew Feature
WORDSNET-27201Section breaks move to the next page and create blank pages when converting to PDFBug
WORDSNET-27188Providing sign document option in XpsSaveOptionsBug
WORDSNET-27166Text positioning issue in list after converting PDF to DOCXBug
WORDSNET-27163Extra spaces between “THE” and “REGULAR”.Bug
WORDSNET-27213Incorrect wrapping boundaries reported for a text box with auto widthBug
WORDSNET-25012InvalidOperationException is thrown upon comparing documentBug
WORDSNET-27067EQ field is rendered improperlyBug
WORDSNET-26785Incorrect korean backslash symbol after converting to PDFBug
WORDSNET-26346Extra page while document saving to PDFBug
WORDSNET-26466Barcode generated by CustomBarcodeGenerator example has incorrect sizeBug
WORDSNET-27122Unneeded footnote continuation notice on conversion to PDFBug
WORDSNET-27169Remove obsolete API from IStructuredDocumentTagBug
WORDSNET-26698Table row w14:paraId are duplicated after cloning rowBug
WORDSNET-27045Second level items are not included in TOCBug
WORDSNET-27059Delta symbol in OfficeMath is rendered as missed characterBug
WORDSNET-26646horizontal axis labels are rendered improperly after building reportBug
WORDSNET-27098Italic text in OfficeMath is rendered as regularBug
WORDSNET-26400Incorrect font for Chinese characters inside SDT on conversion to PDFBug
WORDSNET-27159FileCorruptedException while loading mht filesBug
WORDSNET-27199Style of footnote mark is lost after open/save RTF documentBug
WORDSNET-27144Chart axis crossing value changed after re-savingBug
WORDSNET-26864Wrong layout when converting particular DOC to PDFBug
WORDSNET-27196pdf-online tool reports that PDF produced by Aspose.Words does not conform PDF 1.7 specBug
WORDSNET-22807Reference to the Microsoft Forms 2.0 Object Library is lost after setting SourceCodeBug
WORDSNET-27119Export to XLSX produces document with broken tables layout which can not be re-savedBug
WORDSNET-27050Chinese characters are rendered as missed charactersBug
WORDSNET-26905Comment discrepancies after mappingBug
WORDSNET-26986Form fields are not updated after calling Document.UpdateFieldsBug
WORDSNET-26519Skatter chart is rendered improperlyBug
WORDSNET-27140EQ-field matrix. Incorrect heightBug
WORDSNET-27161Image loss after converting PDF to DOCXBug
WORDSNET-26639Axis boundaries are incorrect after building reportBug
WORDSNET-26892Converting DOCX to RTF text disappearsBug
WORDSNET-27158Bookmarks are not preserved in HtmlFixedBug
WORDSNET-27157Incorrect text wrapping when converting RTF to PDFBug
WORDSNET-26828Hyperlink Breakage in Aspose.Words PDF ConversionBug
WORDSNET-27136Wrong content alignment after conversion to HTMLBug
WORDSNET-26643Skype SILK is detected by Aspose.Words as TXTBug
WORDSNET-8602Improve export of paragraphs with borders to HTML with embedded CSSBug
WORDSNET-6189Provide syntax analysis of text inside Html to auto-detect encodingBug

Public API and Backward Incompatible Changes

This section lists public API changes that were introduced in Aspose.Words 24.8. It includes not only new and obsoleted public methods, but also a description of any changes in the behavior behind the scenes in Aspose.Words which may affect existing code. Any behavior introduced that could be seen as regression and modifies the existing behavior is especially important and is documented here.

Added ability to set orientation and rotation of chart axis tick labels

Related issue: WORDSNET-27202

The new properties Orientation and Rotation have been added to the AxisTickLabels class:

/// <summary>
/// Gets or sets the orientation of the tick label text.
/// </summary>
/// <remarks>
/// The default value is ShapeTextOrientation.Horizontal.
/// Note that some ShapeTextOrientation values do not affect the orientation of tick label text in value axes.
/// </remarks>
public ShapeTextOrientation Orientation { get; set; }

/// <summary>
/// Gets or sets the rotation of the tick labels in degrees.
/// </summary>
/// <remarks>
/// The range of acceptable values is from -180 to 180 inclusive. The default value is 0.
/// </remarks>
public int Rotation { get; set; }

This use case explains how to to set orientation and rotation of axis tick labels:

Added EmbeddingLicensingRights property to FontInfo and PhysicalFontInfo

Related issue: WORDSNET-26686

Added EmbeddingLicensingRights property to FontInfo and PhysicalFontInfo classes:

/// <summary>
/// Represents embedding licensing rights for the font.
/// </summary>
/// <remarks>
/// To learn more, visit the
/// <a href="https://learn.microsoft.com/en-us/typography/opentype/spec/os2#fstype">OpenType specification section</a>
/// on Microsoft Typography portal.
/// </remarks>
public class FontEmbeddingLicensingRights
{
    /// <summary>
    /// Usage permissions.
    /// </summary>
    public FontEmbeddingUsagePermissions EmbeddingUsagePermissions { get; }

    /// <summary>
    /// Indicates the "No subsetting" restriction.
    /// </summary>
    /// <remarks>
    /// When this flag is set, the font must not be subsetted prior to embedding. Other embedding restrictions
    /// also apply.
    /// </remarks>
    public bool NoSubsetting { get; }

    /// <summary>
    /// Indicates the "Bitmap embedding only" restriction.
    /// </summary>
    /// <remarks>
    /// When this bit is set, only bitmaps contained in the font may be embedded. No outline data may be embedded.
    /// If there are no bitmaps available in the font, then the font is considered unembeddable and the embedding
    /// services will fail. Other embedding restrictions also apply.
    /// </remarks>
    public bool BitmapEmbeddingOnly { get; }
}

/// <summary>
/// Represents the font embedding usage permissions.
/// </summary>
public enum FontEmbeddingUsagePermissions
{
    /// <summary>
    /// The font may be embedded, and may be permanently installed for use on a remote systems, or for use by
    /// other users.
    /// </summary>
    Installable,
    /// <summary>
    /// The font must not be modified, embedded or exchanged in any manner without first obtaining explicit
    /// permission of the legal owner.
    /// </summary>
    RestrictedLicense,
    /// <summary>
    /// The font may be embedded, and may be temporarily loaded on other systems for purposes of viewing or
    /// printing the document.
    /// </summary>
    /// <remarks>
    /// Documents containing Preview & Print fonts must be opened “read-only”; no edits may
    /// be applied to the document.
    /// </remarks>
    PrintAndPreview,
    /// <summary>
    /// The font may be embedded, and may be temporarily loaded on other systems.
    /// </summary>
    /// <remarks>
    /// As with Preview & Print embedding, documents containing Editable fonts may be opened for reading.
    /// In addition, editing is permitted, including ability to format new text using the embedded font, and
    /// changes may be saved.
    /// </remarks>
    Editable
}

public class FontInfo
{
    /// <summary>
    /// Gets the embedded font licensing rights.
    /// </summary>
    /// <remarks>
    /// <para>The value may be null if font is not embedded.</para>
    /// </remarks>
    public FontEmbeddingLicensingRights EmbeddingLicensingRights { get; }
}

public class PhysicalFontInfo
{
    /// <summary>
    /// Embedding licensing rights for the font.
    /// </summary>
    public FontEmbeddingLicensingRights EmbeddingLicensingRights { get; }
}

This use case explains how to use EmbeddingLicensingRights:

Added new public method Section.ClearHeadersFooters(preserveWatermarks)

Related issue: WORDSNET-26552

A new ClearHeadersFooters(bool preserveWatermarks) public method has been added to Section class:

/// <summary>
/// Clears the headers and footers of this section.
/// </summary>
/// <remarks>
/// <p>The text of all headers and footers is cleared, but <see cref="HeaderFooter"/> objects themselves are not removed.</p>
/// <p>This makes headers and footers of this section linked to headers and footers of the previous section.</p>
/// </remarks>
/// <param name="preserveWatermarks">True if the watermarks shall not be removed.</param>
public void ClearHeadersFooters(bool preserveWatermarks)

This use case explains how to clear Headers and Footers but preserve the Watermarks:

Added ReplaceBackslashWithYenSign backward compatibility options to HtmlSaveOptions and XamlFlowSaveOptions

Related issue: WORDSNET-26785

Added ReplaceBackslashWithYenSign property to HtmlSaveOptions and to XamlFlowSaveOptions. It designed for keep backward compatibility with previous versions of Aspose.Words and allows to replace a backslash character with Yen sign in generated HTML and XAML documents.

/// <summary>
/// Specifies whether backslash characters should be replaced with yen signs.
/// Default value is <c>false</c>.
/// </summary>
/// <remarks>
/// By default, Aspose.Words mimics MS Word's behavior and doesn't replace backslash characters with yen signs in
/// generated HTML documents. However, previous versions of Aspose.Words performed such replacements in certain
/// scenarios. This flag enables backward compatibility with previous versions of Aspose.Words.
/// </remarks>
public bool ReplaceBackslashWithYenSign { get; set; }
/// <summary>
/// Specifies whether backslash characters should be replaced with yen signs.
/// Default value is <c>false</c>.
/// </summary>
/// <remarks>
/// By default, Aspose.Words mimics MS Word's behavior and doesn't replace backslash characters with yen signs in
/// generated XAML documents. However, previous versions of Aspose.Words performed such replacements in certain
/// scenarios. This flag enables backward compatibility with previous versions of Aspose.Words.
/// </remarks>
public bool ReplaceBackslashWithYenSign { get; set; }

This use case explains how to replace a backslash character with Yen sign in generated HTML document:

This use case explains how to replace a backslash character with Yen sign in generated XAML document:

Added UseSdtTagAsFormFieldName property to PdfSaveOptions

Related issue: WORDSNET-27063

Added UseSdtTagAsFormFieldName property to PdfSaveOptions. It allows to use StructuredDocumentTag.Tag as a PDF form field name instead of StructuredDocumentTag.Id. Also now StructuredDocumentTag.Title field is exported as PDF form field user name.

/// <summary>
/// Specifies whether to use SDT control Tag or Id property as a name of form field in PDF.
/// </summary>
/// <remarks>
/// <p>The default value is <c>false</c>.</p>
/// <para>When set to <c>false</c>, SDT control Id property is used as a name of form field in PDF.</para>
/// <para>When set to <c>true</c>, SDT control Tag property is used as a name of form field in PDF.</para>
/// <para>If set to <c>true</c> and Tag is empty, Id property will be used as a form field name.</para>
/// <para>If set to <c>true</c> and Tag values are not unique, duplicate Tag values will be altered to build
/// unique PDF form field names.</para>
/// </remarks>
public bool UseSdtTagAsFormFieldName
{
    get { return mUseSdtTagAsFormFieldName; }
    set { mUseSdtTagAsFormFieldName = value; }
}

This use case explains how to use UseSdtTagAsFormFieldName property:

Introduced a new LowCode.Converter class, designed to provide a set of methods for converting various types of documents with a single line of code

Related issue: WORDSNET-24092

Introduced a new LowCode.Converter class, designed to provide a set of methods for converting various types of documents with a single line of code.

The class includes the following methods:

/// <summary>
/// Converts the given input document into the output document using specified input output file names and its extensions.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name.</param>
public static void Convert(string inputFile, string outputFile)

/// <summary>
/// Converts the given input document into the output document using specified input output file names and the final document format.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name.</param>
/// <param name="saveFormat">The save format.</param>
public static void Convert(string inputFile, string outputFile, SaveFormat saveFormat)

/// <summary>
/// Converts the given input document into the output document using specified input output file names and save options.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name.</param>
/// <param name="saveOptions">The save options.</param>
public static void Convert(string inputFile, string outputFile, SaveOptions saveOptions)

/// <summary>
/// Converts the given input document into a single output document using specified input and output streams.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <param name="outputStream">The output stream.</param>
/// <param name="saveFormat">The save format.</param>
public static void Convert(Stream inputStream, Stream outputStream, SaveFormat saveFormat)

/// <summary>
/// Converts the given input document into a single output document using specified input and output streams.
/// </summary>
/// <param name="inputStream">The input streams.</param>
/// <param name="outputStream">The output stream.</param>
/// <param name="saveOptions">The save options.</param>
public static void Convert(Stream inputStream, Stream outputStream, SaveOptions saveOptions)

/// <summary>
/// Converts the input file pages to images.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name used to generate file name for page images using rule "outputFile_pageIndex.extension"</param>
public static void ConvertToImages(string inputFile, string outputFile)

/// <summary>
/// Converts the input file pages to images.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name used to generate file name for page images using rule "outputFile_pageIndex.extension"</param>
/// <param name="saveFormat">Save format. Only image save formats are allowed.</param>
public static void ConvertToImages(string inputFile, string outputFile, SaveFormat saveFormat)

/// <summary>
/// Converts the input file pages to images.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="outputFile">The output file name used to generate file name for page images using rule "outputFile_pageIndex.extension"</param>
/// <param name="saveOptions">Image save options.</param>
public static void ConvertToImages(string inputFile, string outputFile, ImageSaveOptions saveOptions)

/// <summary>
/// Converts the input file pages to images.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="saveFormat">Save format. Only image save formats are allowed.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(string inputFile, SaveFormat saveFormat)

/// <summary>
/// Converts the input file pages to images.
/// </summary>
/// <param name="inputFile">The input file name.</param>
/// <param name="saveOptions">Image save options.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(string inputFile, ImageSaveOptions saveOptions)

/// <summary>
/// Converts the input stream pages to images.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <param name="saveFormat">Save format. Only image save formats are allowed.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(Stream inputStream, SaveFormat saveFormat)

/// <summary>
/// Converts the input stream pages to images.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <param name="saveOptions">Image save options.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(Stream inputStream, ImageSaveOptions saveOptions)

/// <summary>
/// Converts the document pages to images.
/// </summary>
/// <param name="doc">The input document.</param>
/// <param name="saveFormat">Save format. Only image save formats are allowed.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(Document doc, SaveFormat saveFormat)

/// <summary>
/// Converts the document pages to images.
/// </summary>
/// <param name="doc">The input document.</param>
/// <param name="saveOptions">Image save options.</param>
/// <returns>Returns array of image streams. The streams should be disposed by the enduser.</returns>
public static Stream[] ConvertToImages(Document doc, ImageSaveOptions saveOptions)

This use case explains how to convert the given input document into the output document using specified input output file names, save format or save options:

The ConvertToImages group of methods are designed to transform documents into images, with each page being converted into a separate image file. These methods also convert PDF documents directly to fixed-page formats without loading them into the document model (using our pdf2word plugin), which enhances both performance and accuracy.

Using ImageSaveOptions.PageSet, you can specify a particular set of pages to convert into images.

Provided sign document option in XpsSaveOptions

Related issue: WORDSNET-27188

Added new public property to Aspose.Words.Saving.XpsSaveOptions class:

/// <summary>
/// Gets or sets <see cref="Aspose.Words.Saving.DigitalSignatureDetails"/> object used to sign a document.
/// </summary>
public DigitalSignatureDetails DigitalSignatureDetails { get; set; }

This use case explains how to specify signature options while saving XPS document:

Removed obsolete API from IStructuredDocumentTag

Related issue: WORDSNET-27169

The obsolete public methods IsRanged() and StructuredDocumentTagNode() have been removed from IStructuredDocumentTag interface and all its implementations.

Please note that the removed IsRanged() is equivalent to IsMultiSection property, and the removed StructuredDocumentTagNode() is equivalent to Node property. Please use these properties instead.