Aspose.Words for Java 19.5 Release Notes

Major Features

  • Jdk1.6 build option is added for customers that request it.
  • Docx-to-Pdf Performance optimization: cold start time decreased from 20% to 3 times depending on the application.
  • Docx-to-Pdf Performance optimization: warm tests time improved from 2 to 10 times depending on the application.
  • Mailmerge performance is raised up to 50% for tasks of particular types.
  • Removed obsolete properties and methods related to font substitution settings in FontSettings class.
  • Implemented StreamFontSource class which allows loading fonts from a stream.
  • Implemented TOC to logical structure export when rendering PDF.
  • Implemented proper rendering of embedded fonts in PDF when different font subsets have the same internal name.
  • Text in the format “x….” in the string values of the series category of DrawingML chart is now rendered as a string corresponding to the specified character code.
  • Improved rendering of metafiles to XPS.
  • Fixed a bug that caused an exception when rendering complex gradient fills to PDF.
  • Fixed a bug causing the loss of shapes if 3D effects and the Soft Edge effect were applied at the same time when rendering.
  • Fixed a bug with exception when rendering DrawingML chart with grid lines.

Full List of Issues Covering all Changes in this Release

Key Summary Category
WORDSNET-14297 Provide a method to check if particular Dml text effect is applied New Feature
WORDSNET-16739 Provide StreamFontSource similar to the FileFontSource New Feature
WORDSNET-16734 Add feature to get font leading/metrics of Run node New Feature
WORDSNET-18436 Provide API to identify Style Separator Paragraph New Feature
WORDSNET-17843 Generate <TOC> tags for Table of contents in PDF New Feature
WORDSNET-18440 Add new 3D parameters to ExtrusionParameters and their processing New Feature
WORDSJAVA-1866 Run out of Java Heap Space while saving an image with a mismatched number of color components to Pdf. Bug
WORDSJAVA-2010 The time consumption in conversion DOCX to PDF Bug
WORDSJAVA-2012 The time consumption for mail merge Bug
WORDSJAVA-2039 Missed ImageBytes in WML document with corrupted base64 String. Bug
WORDSJAVA-2059 Aspose.Words for Java 19.3 and JDK 1.6 throws an exception Bug
WORDSJAVA-2063 Table/Image in header disappears and Textbox partially visible in converted DOCX Bug
WORDSJAVA-2079 Aspose.Words 19.4  OutputStream object is empty after signing .doc file. Bug
WORDSJAVA-2080 Fail to load Word 6 or Word 95 format when DOC_PRE_WORD_60 is used as an argument. Bug
WORDSNET-11952 Performance issue while converting Html to Pdf Bug
WORDSNET-18097 A picture in XML occasionally renders as Red Cross in PDF Bug
WORDSNET-13463 Start number of list level is changed after joining RTF files Bug
WORDSNET-18332 Chart x-scale has font problem in PDF Bug
WORDSNET-18444 An exception raises while loading MHTML file Bug
WORDSNET-17401 Saving to pdfA1a does not support TOC and TOC Item (TOCI) tags Bug
WORDSNET-18355 System.NotSupportedException is thrown while importing MHTML Bug
WORDSNET-18512 Foreign language converts a document with tables out of order of original document Bug
WORDSNET-18446 DOCX to PDF - hyphenation not same Bug
WORDSNET-18380 Document.UpdateFields throws System.InvalidOperationException Bug
WORDSNET-7452 Aspose.Words hangs during rendering Text file to Pdf Bug
WORDSNET-7588 AW hangs upon loading MHTML file produced with Aspose.Email Bug
WORDSNET-18395 Tables get joined in PDF output Bug
WORDSNET-18386 IndexOutOfRangeException while converting RTF to PDF Bug
WORDSNET-17383 FontSettings.SetFontSubstitutes does not substitute the font Bug
WORDSNET-10368 Performance issue while converting Docx to Pdf Bug
WORDSNET-10867 Document.Save method takes time to convert Docx to Pdf Bug
WORDSNET-3738 Rendering takes a long time if the document consists of only one paragraph with lots of line breaks Bug
WORDSNET-18171 System.NotSupportedException is thrown while loading MHTML Bug
WORDSNET-18237 Mathematical formula label mi will become italic Bug
WORDSNET-18357 Introduce Field.DisplayResult property to obtain the fake result Bug
WORDSNET-17407 The right edge of the table not rendered in HTML correctly Bug
WORDSNET-18307 “Not a legal OleAut date” Exception Occurs upon DOCX to DOC or PDF Conversions Bug
WORDSNET-12431 Wrong spacing for a header in saving Word as Pdf Bug
WORDSNET-18448 List of Tables adds continuation entries in PDF after calling UpdateFields Bug
WORDSNET-12539 Table of contents is misplaced in the output PDF Bug
WORDSNET-13691 A paragraph with a right tab wraps to the next line because of right indent Bug
WORDSNET-13788 Conversion from Word to PDF has some problems with header/footer Bug
WORDSNET-17971 Tab space is increased after comparing document Bug
WORDSNET-18302 Document.Save throws System.IndexOutOfRangeException Bug
WORDSNET-15086 Document.Save method takes time to save Word document to Pdf Bug
WORDSNET-18519 Document.AcceptAllRevisions() throws NullReferenceException Bug
WORDSNET-18175 Columns widths and heights are not maintained in the table during HTML to DOCX Bug
WORDSNET-16818 Squares appear between Korean characters in PDF Bug
WORDSNET-18426 DOCX to PDF conversion issue with chart rendering Bug
WORDSNET-18329 Aspose.Words.FileCorruptedException is thrown while loading MHTML Bug
WORDSNET-17336 The text content in PDF output is mixed and the font is changed Bug
WORDSNET-18525 After opening and saving DOCX, the file fails to open Bug
WORDSNET-17980 HTML Ordered List incorrectly numbered when DOCX saved as PDF Bug
WORDSNET-18278 Tabs are incorrectly interpreted in PDF output. Bug
WORDSNET-18430 Low performance in some text wrapping tests Bug
WORDSNET-6208 Aspose.Words hangs during rendering Bug
WORDSNET-18470 Aspose.Words.Document.UpdateFields() causes a System.ArgumentException() Bug
WORDSNET-9277 Performance is slow when converting to PDF Bug
WORDSNET-18467 DoNotVertAlignInTxbx is incorrectly read from WordML document. Bug
WORDSNET-18228 Append Document Destroys Lists Bug
WORDSNET-18534 FileFormatUtil.LoadFormatToExtension() throws on LoadFormat.DocPreWord60 Bug
WORDSNET-18475 DOCX to PDF conversion issue with list labels Bug
WORDSNET-18396 The PDF output is different than MS Word output Bug
WORDSNET-18270 Text position of SVG is changed when the document is exported to DOCX/PDF Bug
WORDSNET-18196 Arrow shapes are lost after conversion from DOCX to PDF Bug
WORDSNET-17475 Incorrect Page break import export during Word-HTML-Word roundtrips Bug
WORDSNET-18399 Incorrect rendering of Decimal number in PDF Bug
WORDSNET-3512 Aspose.Words hangs during rendering. Bug
WORDSNET-18479 Calling of UpdateFields method corrupts some TOC entries in PDF output Bug
WORDSNET-18268 Aspose.Words.FileCorruptedException is thrown while loading width of an HTML cell Bug
WORDSNET-18486 Incorrect emf rendering in XPS Bug
WORDSNET-18030 Remove obsolete font substitution API Bug
WORDSNET-13891 Converting Word to PDF results in indent problem Bug
WORDSNET-18309 Document.UpdatePageLayout changes the list numbers in output PDF Bug
WORDSNET-17471 DOCX to PDF conversion issue with OpenType font. Bug
WORDSNET-17651 Content pushed down in rendered PDF Bug
WORDSNET-17729 Author and Subject are incorrectly imported when converting from MOBI to DOCX Bug
WORDSNET-17750 Fail to save a specific word document to pdf Bug
WORDSNET-17877 PageSetup.PaperSize returns Letter for TXT document Bug
WORDSNET-17978 The colored border is not rendered properly during DOCX to PDF conversion Bug
WORDSNET-18184 Ink annotations disappear Bug
WORDSNET-18267 System.NotSupportedException is thrown while loading MHTML with a “text/plain” part Bug
WORDSNET-18289 Horizontal lines width increases in PDF Bug
WORDSNET-18327 Incorrect shape positions in AW pdf output Bug
WORDSNET-18356 System.NotSupportedException is thrown while importing MHTML Bug
WORDSNET-18336 System.ArgumentException is thrown while saving DOCX to PDF Bug
WORDSNET-18361 Check Boxes are not rendered in output PDF Bug

Public API and Backward Incompatible Changes

This section lists public API changes that were introduced in Aspose.Words 19.4. 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 existing behavior is especially important and is documented here.

Added a new overloaded AppendDocument() method with additional ImportFormatOptions parameter

Related issue: WORDSNET-18228.

Added a new overloaded AppendDocument() method into a Document class:

/// <summary>
/// Appends the specified document to the end of this document.
/// </summary>
/// <param name="srcDoc">The document to append.</param>
/// <param name="importFormatMode">Specifies how to merge style formatting that clashes.</param>
/// <param name="importFormatOptions">Allows to specify options that affect formatting of a result document.</param>
public void AppendDocument(Document srcDoc, ImportFormatMode importFormatMode, ImportFormatOptions importFormatOptions)

It allows to specify an additional options that affect the formatting of a result document.

See additional information under added a new ImportFormatOptions class for more flexible control over importing tasks at Aspose.Words for Java 19.4 Release Notes.

UseCase:

Document srcDoc = new Document("source.docx");
Document dstDoc = new Document("destination.docx");
ImportFormatOptions options = new ImportFormatOptions();

// Specify that if numbering clashes in source and destination documents, then a numbering from the source document will be used.
options.KeepSourceNumbering = true;
dstDoc.AppendDocument(srcDoc, ImportFormatMode.UseDestinationStyles, importFormatOptions)

Added a new public property Paragraph.BreakIsStyleSeparator

Related issue: WORDSNET-18436.

Added a new public property BreakIsStyleSeparator into a Paragraph class.

/// <summary>
/// True if this paragraph break is a Style Separator. A style separator allows one
/// paragraph to consist of parts that have different paragraph styles.
/// </summary>
public bool BreakIsStyleSeparator

It allows to identify Style Separator Paragraph.

UseCase:

Paragraph paragraph;
if (paragraph.BreakIsStyleSeparator)
{
  // Do smth..
}

Added feature to get font leading (line spacing)

Related to WORDSNET-16734.

The line spacing of a font is the vertical distance between the baselines of two consecutive lines of text. Thus, the line spacing includes the blank space between lines along with the height of the character itself.

The following property was introduced in the Font class to obtain this value:

/// <summary>
/// Returns line spacing of this font (in points).
/// </summary>
public double LineSpacing { get; }

UseCase:

DocumentBuilder builder = new DocumentBuilder(new Document());
builder.Font.Name = "Calibri";
builder.Writeln("qText");

// Obtain line spacing.
Font font = builder.Document.FirstSection.Body.FirstParagraph.Runs[0].Font;
Console.WriteLine($"lineSpacing = {font.LineSpacing}");

Added Field.DisplayResult property to obtain the fake result

Related issue: WORDSNET-18357

Inspired by WORDSNET-18165, we have decided to add a property that would allow customers to obtain the field’s result for fields that do not have a field separator node. We call this “fake result” or display result; MS Word displays it in the document by calculating the field’s value on the fly, but there is no such value in the document model

/// <summary>
/// Gets the text that represents the displayed field result.
/// </summary>
/// <remarks>
/// The <see cref="Words.Document.UpdateListLabels"/> method must be called to obtain correct value for the
/// <see cref="FieldListNum"/>, <see cref="FieldAutoNum"/>, <see cref="FieldAutoNumOut"/> and <see cref="FieldAutoNumLgl"/> fields.
/// </remarks>
public string DisplayResult

Usage:

List<Field> fields = FieldExtractor.ExtractToCollection(document, false);
Assert.AreEqual("111", fields[0].DisplayResult);
Assert.AreEqual("222", fields[1].DisplayResult);
Assert.AreEqual("Multi\rLine\rText", fields[2].DisplayResult);
Assert.AreEqual("%", fields[3].DisplayResult);
Assert.AreEqual("Macro Button Text", fields[4].DisplayResult);
Assert.AreEqual(string.Empty, fields[5].DisplayResult);
document.UpdateListLabels();
Assert.AreEqual("1)", fields[5].DisplayResult);

Added new StreamFontSource class

Related issue: WORDSNET-16739

Added new StreamFontSource class which allows loading fonts from the stream:

    /// <summary>
    /// Base class for user-defined stream font source.
    /// </summary>
    /// <remarks>
    /// <para>In order to use the stream font source you should create a derived class from the <see cref="StreamFontSource"/>
    /// and provide implementation of the <see cref="OpenFontDataStream"/> method.</para>
    /// 
    /// <para><see cref="OpenFontDataStream"/> method could be called several times. For the first time it will be called 
    /// when Aspose.Words scans the provided font sources to get the list of available fonts. Later it may be called if the
    /// font is used in the document to parse the font data and to embed the font data to some output formats.</para>
    /// 
    /// <para><see cref="StreamFontSource"/> may be useful because it allows to load the font data only when it is required
    /// and not to store it in the memory for the <see cref="FontSettings"/> lifetime.</para>
    /// </remarks>
    public abstract class StreamFontSource : FontSourceBase, IFontData
    {
        /// <summary>
        /// Ctor.
        /// </summary>
        protected StreamFontSource()
        {
        }
		
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="priority">Font source priority. See the <see cref="FontSourceBase.Priority"/> property description for more information.</param>
        protected StreamFontSource(int priority)
            : base(priority)
        {
        }
		
        /// <summary>
        /// Returns the type of the font source.
        /// </summary>
        public sealed override FontSourceType Type
        {
            get { return FontSourceType.FontStream; }
        }
		
        /// <summary>
        /// This method should open the stream with font data on demand.
        /// </summary>
        /// <returns>Font data stream.</returns>
        /// <remarks>
        /// Aspose.Words will close the stream after reading. There is no need to close it explicitly.
        /// </remarks>
        public abstract Stream OpenFontDataStream();       
    }

UseCase:

class ResourceSteamFontSourceExample : StreamFontSource
{
    public override Stream OpenFontDataStream()
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceStream("resourceName");
    }
}
FontSettings.DefaultInstance.SetFontsSources(new FontSourceBase[] {new SystemFontSource(), new ResourceSteamFontSourceExample()});

Obsolete property DefaultFontName was removed from FontSettings class. Please use SubstitutionSettings.DefaultFontSubstitution instead. Obsolete property EnableFontSubstitution was removed from FontSettings class. Please use SubstitutionSettings.FontInfoSubstitution instead. Obsolete methods GetFontSubstitutes, SetFontSubstitutes, AddFontSubstitutes was removed from FontSettings class. Please use SubstitutionSettings.TableSubstitution instead.

WORDSNET-14297 - Provide a method to check if particular Dml text effect is applied

Font.HasDmlEffect() method have been added to check if particular Dml text effect is applied to the Run.

/// <summary>
/// Checks if particular Dml text effect is applied.
/// </summary>
/// <param name="dmlEffectType">Dml text effect type.</param>
/// <returns>True if particular Dml text effect is applied.</returns>
public bool HasDmlEffect(TextDmlEffect dmlEffectType)

UseCase:

RunCollection runs = doc.FirstSection.Body.FirstParagraph.Runs;
Font runFont = runs[1].Font;

// One run might have several Dml text effects applied.
Debug.WriteLine(runFont.HasDmlEffect(TextDmlEffect.Shadow));
Debug.WriteLine(runFont.HasDmlEffect(TextDmlEffect.Effect3D));
Debug.WriteLine(runFont.HasDmlEffect(TextDmlEffect.Reflection));
Debug.WriteLine(runFont.HasDmlEffect(TextDmlEffect.Outline));
Debug.WriteLine(runFont.HasDmlEffect(TextDmlEffect.Fill));