Парсинг документа .doc

170
11 октября 2019, 15:40

Основываясь на справочнике по структуре документа с разрешением .doc решил написать программу для получения текстовой части этого документа. Ниже представлен код моих наработок в которых не могу понять как объявить массив tableStreamName и как преобразовать переменную fc с UInt в Int.
Да и вообще скажите в чем ещё мои ошибки?!

private static void Main(string[] args)
{
    string path = @"C:\temp\MyTest.doc";
    string text = " ";
    Stream wordDocumentStream = new FileStream(path, FileMode.Open);
    byte[] fib = new byte[1472];
    wordDocumentStream.Read(fib, 0, 1472);
    int fcClx = BitConverter.ToInt32(fib, 0x01A2);
    int lcbClx = BitConverter.ToInt32(fib, 0x01A6);
    bool flag1Table = (fib[0x000A] & 0x0200) == 0x0200;
    string tableStreamName = "0Table";
    if (flag1Table) tableStreamName = "1Table";
    Stream tableStream = new Stream(tableStreamName);
    byte[] clx = new byte[lcbClx];
    tableStream.Read(clx, fcClx, lcbClx);
    int pos = 0;
    bool goOn = true;
    while (goOn)
    {
        byte typeEntry = clx[pos];
        if (typeEntry == 2)
        {
            goOn = false;
            int lcbPieceTable = BitConverter.ToInt32(clx, pos + 1);
            byte[] pieceTable = new byte[lcbPieceTable];
            Array.Copy(wordDocumentStream, pos + 5, pieceTable, 0, pieceTable.Length);
            int pieceCount = (lcbPieceTable - 4) / 12;
            for (var i = 0; i < pieceCount; i++)
            {
                int cpStart = BitConverter.ToInt32(pieceTable, i * 4);
                int cpEnd = BitConverter.ToInt32(pieceTable, (i + 1) * 4);
                byte[] pieceDescriptor = new byte[8];
                int offsetPieceDescriptor = (pieceCount + 1) * 4 + i * 8;
                Array.Copy(pieceTable, offsetPieceDescriptor, pieceDescriptor, 0, 8);
                uint fcValue = BitConverter.ToUInt32(pieceDescriptor, 2);
                bool isANSI = (fcValue & 0x40000000) == 0x40000000;
                uint fc = fcValue & 0xBFFFFFFF;
                Encoding encoding = Encoding.GetEncoding(1252);
                int cb = cpEnd - cpStart;
                if (!isANSI)
                {
                    encoding = Encoding.Unicode;
                    cb *= 2;
                }
                byte[] bytesOfText = new byte[cb];
                wordDocumentStream.Read(bytesOfText, bytesOfText.Length, fc);
                text += encoding.GetString(bytesOfText);
            }
        }
        else if (typeEntry == 1)
        {
            pos = pos + 1 + 1 + clx[pos + 1];
        }
        else
        {
            goOn = false;
        }
    }
    Console.WriteLine(text);
}
READ ALSO
Почему Unity игнорирует BoxCollider2D и CircleCollder2D? [дубликат]

Почему Unity игнорирует BoxCollider2D и CircleCollder2D? [дубликат]

На данный вопрос уже ответили:

148
Как создать полет слегка отклоненный от цели выстрел из оружия AI от его цели

Как создать полет слегка отклоненный от цели выстрел из оружия AI от его цели

Полет пули к цели с практически одинаковой скоростью осуществляется с помощью данного скрипта:

184
Как переключать состояние в методе C# .NET

Как переключать состояние в методе C# .NET

Реализую простой фасад для сокрытия более низкоуровневых решенийЕсть модель данных:

165
Не работает асинхронный вызов метода C#

Не работает асинхронный вызов метода C#

Имеется метод, который внутри себя запускает дважды другой метод, но второй раз асинхронноИ вот внутри Task не срабатывает SaveToDB()

177