Как я могу получить каждую страницу текста в документе Word отдельно (используя .NET)?

Мне нужно определить, на каких страницах документа Word встречается ключевое слово. У меня есть несколько инструментов, которые могут получить текст документа, но ничего не говорит мне, на каких страницах встречается текст. У кого-нибудь есть хорошее стартовое место для меня? я использую .NET

Спасибо!

edit: Дополнительное ограничение: я не могу использовать какие-либо материалы Interop.

edit2: Если кто-нибудь знает о стабильных библиотеках, которые могут это сделать, это также будет полезно. Я использую Aspose, но, насколько я знаю, в нем ничего нет.


person Adam A    schedule 14.11.2008    source источник


Ответы (4)


Вот как я получаю текст, я считаю, что вы можете установить диапазон выбора для страницы, затем вы можете проверить этот текст, может быть немного отсталым от того, что вам нужно, но может быть местом для начала.

Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();
object missing = Type.Missing;
object fileName = @"c:\file.doc";
object objFalse = false;

wordApplication.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone;
Microsoft.Office.Interop.Word.Document doc = wordApplication.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,ref objFalse, ref missing, ref missing, ref missing, ref missing);

//I belevie you can define a SelectionRange and insert here
doc.ActiveWindow.Selection.WholeStory();
doc.ActiveWindow.Selection.Copy();

IDataObject data = Clipboard.GetDataObject();
string text = data.GetData(DataFormats.Text).ToString();

doc.Close(ref missing, ref missing, ref missing);
doc = null;

wordApplication.Quit(ref missing, ref missing, ref missing);
wordApplication = null;
person Douglas Anderson    schedule 14.11.2008
comment
Спасибо! Я определенно ценю ответ. Думаю, я должен был упомянуть о своих ограничениях - не могу использовать Interop. - person Adam A; 14.11.2008
comment
Я отмечаю это как лучший ответ, который я мог получить. Надеюсь, это поможет кому-то еще в будущем. - person Adam A; 14.11.2008

Как вы определяете страницу?

Если вы считаете только разрывы разделов/жестких страниц, это сложно, но выполнимо. Если вы хотите посчитать мягкие разрывы страниц, задача становится очень сложной и несколько бессмысленной. Учтите, что определение места разрыва программной страницы динамически генерируется во время выполнения и не сохраняется в самом файле. Это зависит от огромного количества факторов, включая активный драйвер принтера (да, он может измениться для одного и того же файла на другом компьютере), шрифты, кернинг, межстрочный интервал, поля и т. д. и т. д. и т. д.

person JohnFx    schedule 14.11.2008
comment
К сожалению, я хочу мягкую, очень очень сложную версию. Хотя я бы не сказал, что это бессмысленно. Это единственное определение страницы, которое на самом деле что-то означает в реальном мире (все остальное на самом деле не является WYSIWYG). Я определенно ценю разъяснения, и большое спасибо за ваш ответ. - person Adam A; 14.11.2008
comment
В этом случае вам, вероятно, придется печатать в фиксированном формате страницы, таком как TIFF или PDF, чтобы выполнить это, но убедитесь, что вы всегда выполняете операцию на одном и том же компьютере с одними и теми же драйверами печати, выбранными для получения согласованных результатов. - person JohnFx; 25.11.2008

Один дерьмовый способ сделать это с помощью Aspose — преобразовать файл Word в PDF, а затем захватить текст на каждой странице.

Я ничего не знаю о внутренностях Aspose или о том, как они определяют свои программные страницы при конвертации, но это лучшее, что у меня есть.

person Adam A    schedule 14.11.2008

Благодарим вас за использование Aspose.Words.

В общедоступном API у нас в настоящее время есть только информация о «потоковом документе», например. абзацы, таблицы, списки и т. д. Внутри мы создаем модель макета страницы, которая имеет такие классы, как страница, блок текста, строка текста и т. д. Конечно, между моделью документа и моделью макета существуют внутренние связи, и можно узнать, какая страница где заканчивается, и все такое. Предоставление этой информации через общедоступный API является (ну, по-прежнему) одним из первых мест в нашем списке приоритетов.

Зарегистрировали ли вы свой запрос на форумах поддержки Aspose.Words? Мы используем эту информацию для поддержки системы голосования и будем работать над функциями, которые в первую очередь получают больше голосов.

person romeok    schedule 15.11.2009
comment
Не уверен насчет регистрации запроса, но я спросил об этом в существующей ветке. Мне сказали, что это приближается, но я так и не получил ответа. Преобразование в PDF и последующее использование GetNextPageText сработало для меня, но, вероятно, не будет хорошо масштабироваться в будущем. Если бы вы, ребята, сделали это достоянием общественности, это определенно было бы здорово. Спасибо за интерес! - person Adam A; 16.11.2009