Общие сведения о формате двоичных файлов Word MS-DOC

Обзор. Сведения о двоичном формате файлов MS-DOC, который используется в продуктах Microsoft Word прежних версий, включая базовые структуры и ключевые концепции для программного взаимодействия с ним.

Дата последнего изменения: 6 января 2012 г.

Применимо к: Office 2007 | Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word | Word 2007 | Word 2010

В этой статье
Общие сведения о двоичном формате файлов MS-DOC
Заключение
Дополнительные материалы

Дата публикации:   февраль 2011 года

Автор:   корпорация Майкрософт

Содержание

  • Общие сведения о двоичном формате файлов MS-DOC

  • Основные компоненты формата файлов MS-DOC

  • Извлечение текста из файлов Word

  • Заключение

  • Дополнительные материалы

В этой статье описывается структура файлов MS-DOC и некоторые процедуры по работе с ними. Данная статья входит в серию статей, посвященных двоичным форматам файлов, используемым продуктами Microsoft Office. Эти статьи следует использовать совместно с документами Office File Format Documents, опубликованными на сайте MSDN.

Общие сведения о двоичном формате файлов MS-DOC

В Microsoft Office Word 2003, Microsoft Word 2002, Microsoft Word 2000 и Microsoft Word 97 в качестве формата по умолчанию используется двоичный формат файлов MS-DOC. Этот формат имеют все файлы с расширением DOC или DOT. Базовой единицей измерения данных в документе Word является символ, к таким символам может относиться форматирование и другие невидимые символы, а также символы в кодировке ANSI и Юникод. Все данные о символах размещаются в потоке документа Word. В начале этого потока находится структура под названием блок файловой информации (File Information Block — FIB), которая содержит указатели на все данные в файле.

Примечание

Рекомендуемый способ выполнения большей части задач программирования в Microsoft Word заключается в использовании основных сборок взаимодействия Word. Это набор классов .NET, который предоставляет полную объектную модель для работы с Microsoft Word. В этой серии статей рассматриваются только расширенные сценарии, например такие, в которых продукт Microsoft Word не установлен.

Основные компоненты формата файлов MS-DOC

Ниже описаны наиболее важные структуры, о которых вам следует знать при работе с файлами DOC.

  • 2.1.1 WordDocument Stream

    Поток документа Word — это основной поток в файле DOC, содержащий все данные файла, кроме таблиц, которые хранятся в 1Table stream or 0Table stream.

    • File Information Block

      Блок файловой информации начинается со смещением 0x00 по отношению к потоку документа Word. Он указывает расположение всех остальных данных в файле. Эти расположения указываются посредством пары целых чисел, первое из которых указывает расположение, а второе — размер. Эти числа указываются в подструктурах блока файловой информации, таких как FibRgFcLcb97. Имена расположений снабжаются префиксом fc, а названия размеров — префиксом lcb.

    • Структура Clx

      Структура Clx представляет собой массив из 0 или большего числа структур Prc, которые содержат сведения о свойствах, после чего идет структура Pcdt, содержащая структуру PlcPcd.

  • Character

    Символ может быть текстовым или нетекстовым, например знаком абзаца или привязкой объекта. Его размер может меняться в зависимости от того, относится ли он к кодировке ANSII, Юникод или является управляющим символом. Соседние символы в документе совершенно необязательно являются соседними в двоичном файле.

    • Character Position (CP)

      Позиция символа (CP) — это 32-разрядное целое число без знака, которое определяет расположение индекса символа в тексте документа.

    • Структура Pcd

      Структура Pcd указывает положение текста в потоке документа Word, а также некоторые свойства текста.

  • Plc

    Структура PLC представляет собой массив позиций символов, за которым следует массив элементов данных. Разные структуры Plc имеют разные имена и функции. Например, структура Plcbkf состоит из закладок и указателей на закладки.

  • Структура PlcPcd

    Структура PlcPcd является структурой PLC, которая сопоставляет массив позиций символов со структурами Pcd. Другими словами, она сопоставляет позиции символов с символами в тексте документа.

Извлечение текста из файлов Word

Формальный алгоритм для извлечения текста приведен в документах об открытых спецификациях на сайте MSDN в подразделе 2.4.1 Retrieving Text, кроме того, в подразделе 3.1 Example of a Clx раздела с примерами приведен пример реализации части данной процедуры. Здесь описана упрощенная версия всего процесса.

Порядок извлечения текста из документа Word

  1. Считайте файл DOC в поток данных.

  2. Начните считывание блока файловой информации со смещения 0 потока документа Word. Дополнительные сведения см. в разделе 2.5.15 How to read the FIB.

  3. Внутри блока файловой информации найдите структуру FibRgFcLcb97. Эта структура начинается с байта 54 блока файловой информации и состоит из последовательности 4-байтовых полей.

  4. Считайте поле FibRgFcLcb97.fcClx по байту 268 и поле FibRgFcLcb97.lcbClx по байту 272. Они указывают смещение расположения и размер структуры Clx.

  5. Начните считывать структуру Clx из потока таблицы со смещением, указанным в поле FibRgFcLcb97.fcClx.

  6. Внутри структуры Clx найдите структуру Pcdt, которая идет сразу за массивом .RgPrc, имеющим переменный размер и состоящим из структур Prc.

    Для каждого элемента этого массива выполните следующее:

    1. Считайте атрибут .clxt, который является байтом 0 структуры Prc. Если .clxt = 0x02, значит вы нашли Pcdt.

    2. Если .clxt = 0x01, считайте следующие два байта в качестве целого числа со знаком, а затем перейдите вперед на это число байт к следующему элементу массива.

  7. Внутри структуры Pcdt найдите структуру PlcPcd, которая начинается с пятого байта структуры Pcdt.

  8. Загрузите массив PlcPcd.aPcd и массив PlcPcd.aCp. Элементы этих массивов соотносятся друг с другом по значению индекса.

  9. Для каждой структуры Pcd в PlcPcd.aPcd выполните следующее:

    1. Считайте значение поля Pcd.Fc.fCompressed по биту 46 текущей структуры Pcd. Если получено значение 0, структура Pcd ссылается на 16-разрядный символ Юникода. Если получено значение 1, структура ссылается на 8-разрядный символ ANSI.

    2. Считайте значение Pcd.Fc, которое соответствует байтам 2–5 текущей структуры Pcd, и соответствующее значение позиции символа.

      • В случае с Юникодом текст в позиции символа, указанной текущим значением позиции, начинается со смещением, которое равно значению Pcd.Fc в потоке документа Word, и занимает два байта на символ.

      • В случае с ANSI текст в текущей позиции символа начинается со смещением, которое равно половине значения Pcd.Fc и занимает один байт на символ.

      В любом случае число символов, указанное текущей позицией символа, равно разности значений следующей позиции символа в массиве и текущей позиции символа.

Заключение

В этой статье приведен лишь пример формата MS-DOC. Указанные в данной статье средства позволят вам с легкостью овладеть восстановлением данных. После изучения дополнительных материалов вы сможете приступить к восстановлению сведений о форматировании и других метаданных, а затем перейди к операциям сохранения.

Дополнительные материалы

Для получения дополнительных сведения см. следующие ресурсы: