Страница 7 из 8 4. Структура документа MS WORD | -... Он съедал десять тарелок супу... - А на второе, - пятнадцать отбивных котлет... - И, наконец,... двадцать компотов!... - А потом этот человек подвязывал салфетку на грудь и говорил: "Ну, кажется, я заморил червячка, теперь, пожалуй, можно приступить к настоящему обеду! Ларри Я.Л. Необыкновенные приключения Карика и Вали | Итак, мы подробно изучили с разных сторон множество действительно интересных вопросов, но... Следует признать, что основную тему статьи мы пока не раскрыли. В ближайшее же время попытаемся исправиться. В Интернете можно найти немало ссылок на фирменные материалы "Microsoft Word 6.0 Binary File Format" и "Microsoft Word 97 Binary File Format", которые представляют собой огромные файлы, заполненные большим количеством малопонятных терминов, таблиц, списков и пр. Но название не совсем точно отражает действительность: на самом деле эти материалы описывают всего лишь структуру потока под названием "WordDocument". Продемонстрируем, что ничего совсем уж иррационального и трансцендентного в фирменной документации от Micrisoft нет. Итак, поток "WordDocument" (в документации он называется "главным потоком" - main stream) начинается со своего собственного внутреннего заголовка, в котором мы упомянем всего несколько наиболее интересных для нас полей: Смещение Длина Назначение Примечание ----------------------------------------------- 0h 2 Сигнатура Word6/Word97 2h 2 Код версии Word6/Word97 18h 4 Начало текста Word6/Word97 1Ch 4 Конец текста+1 Word6/Word97 34h 4 Длина текста+1 Word6 4Ch 4 Длина текста+1 Word97
Для документов, созданных в Word v6.0/7.0 или WordPad, сигнатура обычно равна 0A5DCh, а для Word97/2K/XP она равна 0A5ECh (все это верно по крайней мере для русских версий). Если документ создан в MS WinWord, то текст обычно начинается по "круглым" смещениям (например, 200h или 300h), для прочих продуктов это не всегда выполняется (например, WordPad может разместить его по "треугольному" смещению 312h). Текст для формата версий 6.0/7.0 представляет собой обычную последовательность однобайтовых символов в той или иной кодировке, а для более старших версий - в двухбайтовой кодировке UNICODE: Символ Кодировка ----------------- 0-9 030h-039h A-Z 041h-05Ah a-z 061h-07Ah А-Я 410h-42Fh Ё 401h а-я 430h-44Fh ё 451h
Этой информации вполне достаточно, чтобы, например, извлечь из Word-документа текст. Производить обратную операцию несколько сложнее - для этого придется параллельно формировать таблицы описания свойств символов и абзацев. |