使用 TX Text Control 和 C# 基于 Word 的文档比较和跟踪更改

TX Text Control 是一款功能类似于 MS Word 的文字处理控件,包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理,网站内容发布,电子病历中病案模板创建、病历书写、修改历史、连续打印、病案归档等功能的实现。

在文档处理应用程序中比较文档的策略有很多。最常见的方法之一是逐字比较文档的文本。这是一种简单有效的文档比较方法,但它确实有一些局限性。

TX Text Control 最新下载icon-default.png?t=N7T8https://www.evget.com/vendor/118

逐字比较

本质上,该比较算法按给定顺序比较所有段落。在段落的基础上,将按照分隔符提取所有句子。最后,将原始文档中这些句子中的单词与给定的修订文档进行比较。

结果在原始文档中标记为跟踪更改。跟踪更改在原始文档中突出显示,用户可以看到对文档所做的更改。

C# 中的文档与 TX 文本控件的比较

执行

该示例实现了该类DocumentComparison,该类接受两个TXText控件。 其构造函数中的文本控件实例。您可以轻松地重写此类以使用非 UI TXText控件。服务器文本控件实例。

DocumentComparison dc = new DocumentComparison(textControl1, textControl2);

构造函数比较两个文档。它循环遍历原始文档中的所有段落,并将文本与修订后的文档进行比较。如果发现差异,文本将被标记为跟踪更改。

提取句子

该ExtractSentences方法从当前段落中获取一个字符串,并通过在典型的分隔符处拆分它来返回句子列表。

public static List<string> ExtractSentences(string input)
{
List<string> sentences = new List<string>();

// Use regular expression to split the input string into sentences but keep white spaces
string pattern = @"([.!?])";

// split the input string into sentences with the delimiters
string[] splitSentences = Regex.Split(input, pattern);

// Trim each sentence and remove empty strings
foreach (string sentence in splitSentences)
{
sentences.Add(sentence);
}

return sentences;
}
比较句子

CompareSentences 方法创建单个单词并比较每个给定句子中单词的位置。它返回一个元组列表,每个元组包含三个元素:单词 from sentence1、单词开头的字符索引以及对应的单词 from sentence2。最后,它返回两个句子之间的差异列表。

private static List<(string word, int charIndex, string replacedWord)> CompareSentences(string sentence1, string sentence2)
{
string[] words1 = sentence1.Split(' ');
string[] words2 = sentence2.Split(' ');

List<(string word, int charIndex, string replacedWord)> differences =
new List<(string word, int charIndex, string replacedWord)>();

// Track the character index
int charIndex = 0;

// Get the maximum length of the two sentences
int maxLength = Math.Max(words1.Length, words2.Length);

// Compare each word in the sentences
for (int i = 0; i < maxLength; i++)
{
// Check if the current word exists in both sentences
if (i < words1.Length && i < words2.Length)
{
// If the words are different, add the word, character index, and replaced word to the list
if (words1[i] != words2[i])
{
differences.Add((words1[i], charIndex, words2[i]));
}
}
// If one of the sentences is shorter, add the extra word to the list
else if (i < words1.Length)
{
differences.Add((words1[i], charIndex, ""));
}
else
{
differences.Add((words2[i], charIndex, ""));
}

// Update the character index for the next word
if (i < words1.Length)
charIndex += words1[i].Length + 1; // Add 1 for the space
}

return differences;
}
比较文件

DocumentComparison 类的构造函数使用上述方法来查找给定 TextControl 实例之间的差异。差异被标记为原始文档中的跟踪更改。

public DocumentComparison(TXTextControl.TextControl originalDocument, TextControl revisedDocument)
{
// Initialize document references
m_originalDocument = originalDocument;
m_revisedDocument = revisedDocument;

// Enable track changes in the original document
originalDocument.IsTrackChangesEnabled = true;

// Compare paragraphs between the original and revised documents
for (int p = 1; p <= m_originalDocument.Paragraphs.Count; p++)
{
var offsetSentences = 0;

// Retrieve the original and revised paragraphs
Paragraph originalParagraph = m_originalDocument.Paragraphs[p];

if (p > m_revisedDocument.Paragraphs.Count)
break; // Break if the revised document has fewer paragraphs than the original document

Paragraph revisedParagraph = m_revisedDocument.Paragraphs[p];

// Get the start position of the original paragraph
var startParagraph = originalParagraph.Start;
var uncheckedOffset = 0;

// Check if the text of the original and revised paragraphs differ
if (originalParagraph.Text != revisedParagraph.Text)
{
// Extract sentences from the original and revised paragraphs
var originalSentences = ExtractSentences(originalParagraph.Text);
var revisedSentences = ExtractSentences(revisedParagraph.Text);

// Compare sentences and replace words in the original document
for (int i = 0; i < originalSentences.Count; i++)
{
// Trim sentences and calculate offset
var originalTrimOffset = originalSentences[i].Length - originalSentences[i].Trim().Length;
var originalSentence = originalSentences[i].Trim();
var revisedSentence = revisedSentences[i].Trim();

// Track changes offset initialization
int trackedChangeOffset = 0;

var differences = CompareSentences(originalSentence, revisedSentence);

// Check if there are any differences
if (differences.Count == 0)
uncheckedOffset = originalSentences[i].Length - 1;

// Apply differences to the original document
foreach (var difference in differences)
{
m_originalDocument.Selection.Start = trackedChangeOffset + startParagraph + offsetSentences +
difference.charIndex + originalTrimOffset + uncheckedOffset - 1;

m_originalDocument.Selection.Length = difference.word.Length;
m_originalDocument.Selection.Text = difference.replacedWord;

trackedChangeOffset += difference.replacedWord.Length;
}

// Update offset for next sentence
offsetSentences += originalSentences[i].Length + trackedChangeOffset;
}
}

}
}
结论

逐字比较文档是文档比较的常用方法。此示例演示如何使用 TX Text Control 实现简单的逐字比较算法。该示例比较两个文档并将差异标记为跟踪原始文档中的更改。

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TX Text Control是一款用于.NET平台的文本编辑控件。它提供了强大和灵活的功能,可用于开发各种文本处理应用程序。 首先,TX Text Control支持多种文本格式,包括RTF(Rich Text Format),HTML(HyperText Markup Language)和DOCX(Microsoft Word的XML格式),这使开发者可以轻松地在应用程序中实现文本的导入和导出。 其次,TX Text Control提供了丰富的文本编辑功能,包括文本格式化、字体样式、段落布局、列表、表格、图像插入等。开发者可以通过使用这些功能,轻松地创建和编辑丰富多样的文本内容。 此外,TX Text Control还支持文本的合并邮件功能,开发者可以根据模板和数据源生成个性化的文本文档。这对于需要大量生成个性化信函或报告的应用程序来说十分有用。 TX Text Control还提供了对文本注释和批注的支持,这对于多人协作编辑文档非常重要。用户可以在文档中添加注释或批注,并与其他协作者进行实时交流。 最后,TX Text Control拥有丰富的开发工具和API文档,简化了开发者的工作。它提供了基于事件的编程模型,允许开发者以代码方式对文本进行操作和处理。 总之,TX Text Control是一款功能强大的文本编辑控件,它能够满足各种文本处理需求。无论是普通的文本编辑器还是复杂的文档处理应用程序,TX Text Control都能提供相应的功能和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值