我需要分析我的Word文档的文本,并在我的分析器检测到的文本范围内创建书签(几乎就像语法检查器)。
我不想使用Find()
实用程序,因为我的需求过于具体。
为此,
1 /检索文档纯文本
我检索文档主要故事的纯文本:
String plainText = ActiveDocument.Range()。Text;
2 /分析纯文本并获得结果
我将它发送到我的分析工具,该工具返回带位置的标记集合:
例如,如果我想检测模式" 我的模式"在文档文本中,分析器可以将标记返回为{ pattern : "my marker", start: 5, end : 14 }
,其中" 开始"和" 结束"是发送的纯文本中模式的字符索引。
3 /在文档中显示结果
我从这些标记创建书签 对于前面的例子,它应该是:
// init a new range and collapse it
Word.Range range = activeDocument.Range(); range.Collapse(WdCollapseStart);
// move character-by-character in the "formatted" text
range.MoveStart(WdUnits.Character, Marker.start ); # Marker.start=5
//set length (end)
range.setRange(range.Start,range.Start+(Marker.End-Marker.Start)); #Marker.end=14
4 /结果
4.1全局结果
当文档主要故事包含文本,链接,列表,标题时,一切正常: 范围很好,纯文本索引与格式化文本索引相关联。
4.2数组问题
当一个文档包含一个数组时,Ranges的位置不好几个字符:纯文本索引与格式化的文本索引不完全相关。
我找到了这个问题的原因(在其他论坛中有解释):这是由于非打印char(7),它是以纯文本格式添加的单元格分隔符。我们可以处理这些字符来计算位置范围,一切都很好!
4.3内容控制,目录,章节和其他方面的问题
当文档包含这些元素时,范围也会被定位为几个字符。 其他非打印出现在纯文本中,但我不明白这意味着什么以及如何处理计算位置范围。
通过" Developer ribbon>显示Word元素标记。创建模式",我们看到每个元素有2个标记:将纯文本索引移动2 *元素解决问题。这似乎没问题。
4.4 Endpaper问题
我不知道我们怎么说" page de garde" (法语)英文,我认为它是" endpaper" :这是第一个具有特定页眉,页脚和内容控件的页面:)
当文档包含Endpaper时,Ranges也会定位几个字符。 但这一次,纯文本中没有非打印标记。
其他信息,当我使用" Developer ribbon>显示单词元素标记时创作模式",我看到了endpaper标记。
我发现了类似的问题:
我希望我的解释清楚,你可以帮助我理解错误或告诉我最好的方法吗?
非常感谢。
答案 0 :(得分:1)
它不是很漂亮,但您可以尝试通过Regex删除不需要的字符。例如,删除\a
个字母(代码为7):
string j = new string(new char[] { (char)7 });
plainText = Regex.Replace(plainText,string.Format("[{0}]", j), "");
现在你必须识别其他'邪恶'字符并将它们添加到char数组中。如果它有效,您将获得一个字符串,其长度与文档中Characters
的数量相对应。可能你必须通过试验来调整这段代码。 (我不确定你使用的是哪种语言 - 我认为是C#。)
<强>更新强> 另一个想法(如果它适用于您的分析仪工具):
将问题分解为单个段落:
foreach(Word.Paragraph pg in activeDocument.Paragraphs)
{
Word.Range range = pg.Range();
string text = range.Text;
// your stuff here
}
使用此段落范围对象和包含的文本字符串,您可以像尝试处理整个文档对象及其文本一样 - 只是逐段显示。所有这些段落都可以通过范围和移动操作“寻址”,就像您已经这样做的那样。我认为有问题的字符在段落的外部或末尾,因此它们不会影响这些段落中的字符计数。
由于我无法重现您称之为endpaper的内容,因此我无法对其进行验证。此外,我不知道段落是否包含特殊文本范围作为页眉和内容表。但至少可以将问题缩小到更小的范围。我觉得值得一试。