Find Text & Replace it with Content of another Word Document Containing Tables Text Images etc using Java

Hi Team,

I am analysing Aspose.Words Java for my requirements.

I want to find & replace #text# with all the content present in another word document. Content can be table/text/para/multiple paras/paras with table, etc. with formatting.

Please Help.

Thanks & Regards
Kunal Gupta

@kunalgupta,

Please refer to the following section of documentation:

Also, please check the following Java code. Hope, this helps.

Document doc = new Document("E:\\sample\\mainDocument.docx");
Document doc1 = new Document("E:\\sample\\subDocument.docx");

Pattern pattern = Pattern.compile("#text#", Pattern.CASE_INSENSITIVE);
FindReplaceOptions opts = new FindReplaceOptions();
opts.setDirection(FindReplaceDirection.BACKWARD);
opts.setReplacingCallback(new ReplaceEvaluator(doc1));

doc.getRange().replace(pattern, "", opts);

doc.save("E:\\sample\\awjava-20.3.docx");

static class ReplaceEvaluator implements IReplacingCallback {
    Document doc1;

    public ReplaceEvaluator(Document d) {
        doc1 = d;
    }

    public int replacing(ReplacingArgs e) throws Exception {
        // This is a Run node that contains either the beginning or the complete match.
        Node currentNode = e.getMatchNode();

        // 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.getMatchOffset() > 0)
            currentNode = splitRun((Run) currentNode, e.getMatchOffset());

        ArrayList runs = new ArrayList();

        // Find all runs that contain parts of the match string.
        int remainingLength = e.getMatch().group().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.getNextSibling();
            } while ((currentNode != null) && (currentNode.getNodeType() != 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);
        }

        //// to insert Document
        DocumentBuilder builder = new DocumentBuilder((Document) e.getMatchNode().getDocument());
        builder.moveTo((Run) runs.get(runs.size() - 1));

        builder.insertDocument(doc1, ImportFormatMode.USE_DESTINATION_STYLES);

        for (Run run : (Iterable<Run>) 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 Run splitRun(Run run, int position) throws Exception {
        Run afterRun = (Run) run.deepClone(true);
        afterRun.setText(run.getText().substring(position));
        run.setText(run.getText().substring((0), (0) + (position)));
        run.getParentNode().insertAfter(afterRun, run);
        return afterRun;
    }
}