We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

Replacing line break with paragraph break

Hi !!

I need to change all the line break to paragraph break. I will not save the changes. I need this changes for doing some other processing.

Is there any solution in Java?

Regards.



Thanks for your request. Please try using the following code:

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

// Open document

Document doc = new Document("C:\\Temp\\in.docx");

doc.getRange().replace(new asposewobfuscated.rn(ControlChar.LineBreak), new LineBreakReplacer(), false);

doc.save("C:\\Temp\\out.docx");

public static class LineBreakReplacer implements IReplacingCallback

{

public int replacing(ReplacingArgs e) {

// Get MatchNode, this is Run node where matched word starts

// The word can consist of more than one run,

// in this case MatchNode will represent only part of the word

Run matchRun = (Run)e.getMatchNode();

// We will store all parts of the word in the list

ArrayList mainTextNodes = new ArrayList();

// Get match word

String word = e.getMatch().getValue();

// The run can contain whole match word or part of the word

// When run contains only part of the word IndexOf will return negative value

int index = matchRun.getText().lastIndexOf(word);

int wordLength = word.length();

while (index < 0)

index = matchRun.getText().lastIndexOf(word.substring(0, wordLength--));

// Match Run can contain text before match word, so we should split the Run

if (index > 0) {

// Clone match run to preserve formating

Run beforeRun = (Run)matchRun.deepClone(true);

// Split text betwee two runs

beforeRun.setText(matchRun.getText().substring(0, index));

matchRun.setText(matchRun.getText().substring(index));

matchRun.getParentNode().insertBefore(beforeRun, matchRun);

}

// If the word is spanned to several Run nodes, we should find all runs that represent whole word

int currentIdx = word.length();

while (currentIdx > 0) {

if (matchRun.getText().length() > currentIdx) {

break;

}

else {

mainTextNodes.add(matchRun);

currentIdx = currentIdx - matchRun.getText().length();

// If there is no next nodes, we should stop while loop

Node currentNode = matchRun.getNextSibling();

if (currentNode == null) {

break;

}

else {

// The next node could be not Run node (BookmarkStart or BookmarkEnd for instance)

// in this case we should move to the next node

while (currentNode != null) {

if (currentNode.getNodeType() == NodeType.RUN) {

matchRun = (Run)currentNode;

break;

}

currentNode = currentNode.getNextSibling();

}

}

}

}

// Now we should split the latest run in the sequence that represents whole word,

// if there is text after match word

if (matchRun != null) {

if (matchRun.getText().length() == currentIdx) {

mainTextNodes.add(matchRun);

}

else {

Run lastRun = (Run)matchRun.deepClone(true);

lastRun.setText(matchRun.getText().substring(0, currentIdx));

matchRun.setText(matchRun.getText().substring(currentIdx));

matchRun.getParentNode().insertBefore(lastRun, matchRun);

mainTextNodes.add(lastRun);

}

}

// Move DocumentBuilder cursor to the run with line break ans insert a paragraph break.

DocumentBuilder builder = new DocumentBuilder((Document)e.getMatchNode().getDocument());

builder.moveTo((Node)mainTextNodes.get(0));

builder.writeln();

// Remove run(s) with line break

for(int i=0; i<mainTextNodes.size(); i++ )

{

Run currentRun = (Run)mainTextNodes.get(i);

currentRun.remove();

}

return ReplaceAction.SKIP;

}

}

Best regards,


Do you have a c# / .net Example ?
Where does asposewobfuscated come from ?

Hi Boas,


Thanks for your request. I have converted the above Java code to C#:

// Open document
Document
doc = new Document(“C:\Temp\in.docx”);
doc.Range.Replace(new Regex(ControlChar.LineBreak), new
LineBreakReplacer(), false);
doc.Save(“C:\Temp\out.docx”);

---------------------------------------------------------

public class LineBreakReplacer
: IReplacingCallback
{
ReplaceAction
IReplacingCallback.Replacing(ReplacingArgs e)
{
// MatchNode,
this is Run node where matched word starts
// The word
can consist of more than one run,
// in this
case MatchNode will represent only part of the word
Run
matchRun = (
Run)e.MatchNode;

// We will
store all parts of the word in the list
ArrayList
mainTextNodes =
new ArrayList();

// Get match
word
String
word = e.Match.Value;

// The run
can contain whole match word or part of the word
// When run
contains only part of the word IndexOf will return negative value
int
index = matchRun.Text.LastIndexOf(word);
int
wordLength = word.Length;
while
(index < 0)
index =
matchRun.Text.LastIndexOf(word.Substring(0, wordLength–));

// Match Run
can contain text before match word, so we should split the Run
if
(index > 0)
{
// Clone
match run to preserve formating
Run
beforeRun = (
Run)matchRun.Clone(true);

// Split
text betwee two runs
beforeRun.Text =
(matchRun.Text.Substring(0, index));
matchRun.Text =
matchRun.Text.Substring(index);
matchRun.ParentNode.InsertBefore(beforeRun,
matchRun);
}

// If the
word is spanned to several Run nodes, we should find all runs that represent
whole word
int
currentIdx = word.Length;
while
(currentIdx > 0)
{
if
(matchRun.Text.Length > currentIdx)
{
break;
}
else
{
mainTextNodes.Add(matchRun);
currentIdx = currentIdx -
matchRun.Text.Length;

// If
there is no next nodes, we should stop while loop
Node
currentNode = matchRun.NextSibling;
if
(currentNode ==
null)
{
break;
}
else
{
//
The next node could be not Run node (BookmarkStart or BookmarkEnd for instance)
//
in this case we should move to the next node
while
(currentNode !=
null)
{
if (currentNode.NodeType == NodeType.Run)
{
matchRun = (Run)currentNode;
break;
}
currentNode =
currentNode.NextSibling;
}
}
}
}

// Now we
should split the latest run in the sequence that represents whole word,
// if there
is text after match word
if
(matchRun !=
null)
{
if
(matchRun.Text.Length == currentIdx)
{
mainTextNodes.Add(matchRun);
}
else
{
Run
lastRun = (
Run)matchRun.Clone(true);
lastRun.Text =
matchRun.Text.Substring(0, currentIdx);
matchRun.Text =
matchRun.Text.Substring(currentIdx);
matchRun.ParentNode.InsertBefore(lastRun, matchRun);
mainTextNodes.Add(lastRun);
}
}
// Move
DocumentBuilder cursor to the run with line break ans insert a paragraph break.
DocumentBuilder
builder =
new DocumentBuilder((Document)e.MatchNode.Document);
builder.MoveTo((Node)mainTextNodes[0]);
builder.Writeln();

// Remove run(s) with line break
for (int i = 0; i < mainTextNodes.Count; i++)
{
Run
currentRun = (
Run)mainTextNodes[i];
currentRun.Remove();
}

return ReplaceAction.Skip;
}
}

I hope, this will help.

Best Regards,