using System.Runtime.InteropServices; using System.Windows.Forms; using System; using Word = Microsoft.Office.Interop.Word; using System.Collections.Generic; namespace AIProofread.core { public class ProcessingContext { public Word.Range Range { get; set; } public int GlobalIndex { get; set; } } public class DocumentReader { private static readonly Stack _processingStack = new Stack(); public static List ReadByVSTO(Word.Document _doc, Word.Application _app, List list) { //List list = new List(); try { // 关闭屏幕更新 _app.ScreenUpdating = false; // 初始化堆栈:处理所有顶级 StoryRanges foreach (Word.Range storyRange in _doc.StoryRanges) { _processingStack.Push(new ProcessingContext { Range = storyRange, GlobalIndex = 0, }); } // 迭代处理堆栈中的每个 Range while (_processingStack.Count > 0) { var context = _processingStack.Pop(); ProcessElement(context.Range, context.GlobalIndex, list); Marshal.ReleaseComObject(context.Range); } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { _app.ScreenUpdating = true; Marshal.ReleaseComObject(_doc); } return list; } private static void ProcessElement(Word.Range range, int globalIndex, List list) { if (range.Text?.Trim() == "\r\a") { globalIndex++; return; } var paragraphs = range.Paragraphs; // Debug.WriteLine($"Processing element: {range.Text}"); // 处理段落 foreach (Word.Paragraph paragraph in paragraphs) { list.Add(new DocumentText { Text = paragraph.Range.Text, ParagraphNumber = globalIndex + 1 }); Marshal.ReleaseComObject(paragraph); globalIndex++; } } } }