Загальні відомості про формат двійкових файлів word ms-doc

Рекомендований спосіб виконання більшої частини завдань програмування в Microsoft Word полягає у використанні основних збірок взаємодії Word. Це набір класів .NET, який надає повну об'єктну модель для роботи з Microsoft Word. У цій серії статей розглядаються тільки розширені сценарії, наприклад такі, в яких продукт Microsoft Word не встановлений.

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

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

Потік документа Word - це основний потік в файлі DOC, що містить всі дані файлу, крім таблиць, які зберігаються в 1Table stream or 0Table stream.

Блок файлової інформації починається зі зміщенням 0x00 по відношенню до потоку документа Word. Він вказує розташування всіх інших даних у файлі. Ці розташування вказуються за допомогою пари цілих чисел, перше з яких вказує розташування, а друге - розмір. Ці числа вказуються в подструктурах блоку файлової інформації, таких як FibRgFcLcb97. Імена розташувань забезпечуються префіксом fc, а назви розмірів - префіксом lcb.

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

Символ може бути текстовим або нетекстових, наприклад знаком абзацу або прив'язкою об'єкта. Його розмір може змінюватися в залежності від того, чи стосується вона до кодуванні ANSII, Юнікод або є керуючим символом. Сусідні символи в документі зовсім необов'язково є сусідніми в довічним файлі.

Позиція символу (CP) - це 32-розрядний ціле число без знака, яке визначає розташування індексу символу в тексті документа.

Структура Pcd вказує положення тексту в потоці документа Word, а також деякі властивості тексту.

Структура PlcPcd є структурою PLC. яка зіставляє масив позицій символів зі структурами Pcd. Іншими словами, вона зіставляє позиції символів з символами в тексті документа.

Витяг тексту з файлів Word

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

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

Вважайте файл DOC в потік даних.

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

Усередині блоку файлової інформації знайдіть структуру FibRgFcLcb97. Ця структура починається з байта 54 блоку файлової інформації та складається з послідовності 4-байтових полів.

Вважайте поле FibRgFcLcb97.fcClx по байту 268 і поле FibRgFcLcb97.lcbClx по байту 272. Вони вказують зміщення розташування і розмір структури Clx.

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

Всередині структури Clx знайдіть структуру Pcdt, яка йде відразу за масивом .RgPrc. мають змінний розмір і складається з структур Prc.

Для кожного елемента цього масиву виконайте наступне:

Вважайте атрибут .clxt. який є байтом 0 структури Prc. Якщо .clxt = 0x02, значить ви знайшли Pcdt.

Якщо .clxt = 0x01, вважайте наступні два байта в якості цілого числа зі знаком, а потім перейдіть вперед на це число байт до наступного елементу масиву.

Всередині структури Pcdt знайдіть структуру PlcPcd, яка починається з п'ятого байта структури Pcdt.

Завантажте масив PlcPcd.aPcd і масив PlcPcd.aCp. Елементи цих масивів співвідносяться один з одним за значенням індексу.

Для кожної структури Pcd в PlcPcd.aPcd виконайте наступне:

Вважайте значення поля Pcd.Fc.fCompressed по біту 46 поточної структури Pcd. Якщо отримано значення 0, структура Pcd посилається на 16-розрядний символ Юнікоду. Якщо отримано значення 1, структура посилається на 8-розрядний символ ANSI.

Вважайте значення Pcd.Fc. яке відповідає байтам 2-5 поточної структури Pcd, і відповідне значення позиції символу.

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

У випадку з ANSI текст в поточній позиції символу починається зі зміщенням, що дорівнює половині значення Pcd.Fc і займає один байт на символ.

У будь-якому випадку число символів, вказане поточною позицією символу, дорівнює різниці значень такої позиції символу в масиві і поточної позиції символу.