Justify does not work properly with <br \> tags

I saw a similar post from 1.5 years ago:
https://forum.aspose.com/t/justified-paragraph-issue-in-aspose-words/86848/3
Has this been resolved?
I am inserting HTML text that has
tags for hard returns with no
tags.
paragraph one kljdfa la alkdjfa ldkfajfas lfdkasdf alkdf alkdfajs dlfaskdasj dfalk dflakd falkdf asldf last line of paragraph

paragraph two aslkd aldkfaj dlfakj aslkfdj alkd faslfkj kl dfas
The problem is that it fully justifies everying, including the last line of the “paragraph.”
Help please.

This message was posted using Aspose.Live 2 Forum

Additional question:
If this is something that hasn’t been resolved, then my thought was to do a search and replace. I have proved that this works in concept by performing a search and replace from MS Word on the document. I search for “^l” and replace with “^p”
These are manual line break and paragraph mark. The problem with this is that all of the posts I am reading says that Aspose does not allow replacing special characters. Please confirm this or guide me on how to do this if there is no resolution for my first post.
Thanks.

Hi
Thanks for your request. Unfortunately, the issue is still unresolved. You are right, as a workaround, you should replace line breaks in your document with paragraph breaks. And you are right, Aspose.Words does not allow replacing special characters. However, using IReplacingCallback, you can replace line break with paragraph break. You should use code like the following:

[Test]
public void Test001()
{
    Document doc = new Document(@"Test001\in.doc");
    doc.Range.Replace(new Regex("\v"), new ReplacingCallbackReplaceLineBreakWithParagraphBreak(), false);
    doc.Save(@"Test001\out.doc");
}
private class ReplacingCallbackReplaceLineBreakWithParagraphBreak: IReplacingCallback
{
    ///
    /// This method is called by the Aspose.Words find and replace engine for each match.
    /// This method highlights the match string, even if it spans multiple runs.
    ///
    ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e)
    {
        // This is a Run node that contains either the beginning or the complete match.
        Node currentNode = e.MatchNode;
        // The first (and may be the only) run can contain text before the match,
        // in this case it is necessary to split the run.
        if (e.MatchOffset> 0)
            currentNode = SplitRun((Run) currentNode, e.MatchOffset);
        // This array is used to store all nodes of the match for further removing.
        ArrayList runs = new ArrayList();
        // Find all runs that contain parts of the match string.
        int remainingLength = e.Match.Value.Length;
        while ((remainingLength> 0) &&
            (currentNode != null) &&
            (currentNode.GetText().Length <= remainingLength))
        {
            runs.Add(currentNode);
            remainingLength = remainingLength - currentNode.GetText().Length;
            // Select the next Run node.
            // Have to loop because there could be other nodes such as BookmarkStart etc.
            do {
                currentNode = currentNode.NextSibling;
            }
            while ((currentNode != null) && (currentNode.NodeType != NodeType.Run));
        }
        // Split the last run that contains the match if there is any text left.
        if ((currentNode != null) && (remainingLength> 0))
        {
            SplitRun((Run) currentNode, remainingLength);
            runs.Add(currentNode);
        }
        // Create Document Buidler and insert paragraph break.
        DocumentBuilder builder = new DocumentBuilder(e.MatchNode.Document as Document);
        builder.MoveTo((Run) runs[runs.Count - 1]);
        builder.Writeln();
        // Now remove all runs in the sequence.
        foreach(Run run in runs)
        run.Remove();
        // Signal to the replace engine to do nothing because we have already done all what we wanted.
        return ReplaceAction.Skip;
    }
    ///
    /// Splits text of the specified run into two runs.
    /// Inserts the new run just after the specified run.
    ///
    private static Run SplitRun(Run run, int position)
    {
        Run afterRun = (Run) run.Clone(true);
        afterRun.Text = run.Text.Substring(position);
        run.Text = run.Text.Substring(0, position);
        run.ParentNode.InsertAfter(afterRun, run);
        return afterRun;
    }
}

If you are building your documents from HTML, you can just replace tags with tags. This should resolve the problem.
Hope this helps.
Best regards,

I validated that this work-around solves the problem.
Thank you for providing the code for the work around.

The issues you have found earlier (filed as WORDSNET-2253) have been fixed in this .NET update and this Java update.

This message was posted using Notification2Forum from Downloads module by aspose.notifier.
(2)

The issues you have found earlier (filed as ) have been fixed in this update. This message was posted using BugNotificationTool from Downloads module by MuzammilKhan