首页 文章

Aspose.Words - 在特定位置合并两个文档

提问于
浏览
-1

使用ASPOSE.WORDS(.Net)我试图在另一个内合并两个RTF文档 .

我想让整个文档替换第二个文档中的一串文本 .

到目前为止,我已经能够连接两个文档,但这并不是我所追求的 .

const string BOOKMARK = @"UNIQUE_STRING"; //UNUSED at the moment

Aspose.Words.Document dWords = new Aspose.Words.Document(@"C:\RTFM\test1.rtf", LoadFormat.Rtf,"");
Aspose.Words.Document dWords2 = new Aspose.Words.Document(@"C:\RTFM\test2.rtf", LoadFormat.Rtf, "");

ImportFormatMode mode = ImportFormatMode.KeepSourceFormatting;

foreach (Section srcSection in dWords2)
{
    Node dstSection = dWords.ImportNode(srcSection, true, mode);
    dWords.AppendChild(dstSection);
}

dWords.Save(@"C:\output.rtf")

2 回答

  • 0

    在您的情况下,您需要实现IReplacingCallback接口来查找文本并将其替换为文档(rtf) . 使用以下代码示例来满足您的要求 .

    Document doc = new Document(MyDir + "input.rtf");
    
    FindandInsertDocument replacedoc = new FindandInsertDocument(MyDir + "document to be inserted.rtf");
    
    doc.Range.Replace(new Regex("text which needs to be replaced with document"), replacedoc, false); 
    
    doc.Save(MyDir + "Out.rtf");
    

    FindandInsertDocument类:

    private class FindandInsertDocument : IReplacingCallback
    {
        private String path;
    
        public FindandInsertDocument(String documentpath)
        {
            path = documentpath;
        }
    
        /// <summary>
        /// This method is called by the Aspose.Words find and replace engine for each match.
        /// </summary>
        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 Builder and insert document
            DocumentBuilder builder = new DocumentBuilder(e.MatchNode.Document as Document);
            builder.MoveTo((Run)runs[runs.Count - 1]);
    
            Document doc = new Document(path);
            builder.InsertDocument(doc, ImportFormatMode.KeepSourceFormatting);
    
            // 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;
        }
    
        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;
        }
    }
    

    我和Aspose一起担任开发人员传道人 .

  • 1
    Document docList=new Document("");//your file
    
    docList.appendDocument(tempDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
    

相关问题