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

134
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? [дубликат]

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

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

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

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

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

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

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

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

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

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

141