Как извлечь текст из метафайла в C#

Пример Перечислить записи в метафайле в C# показывает, как перечислить записи в метафайле. В этом примере перечислены записи, ищет те, которые представляют команды DrawString, и извлекает их текст.

Следующий код показывает метод обратного вызова, выполняемый для каждой записи метафайла.

// Ищем строковые записи.
private bool RecordCallback(EmfPlusRecordType record_type,
    int flags, int data_size, IntPtr data,
    PlayRecordCallback callback_data)
{
    // Смотрите, если это текст.
    if (record_type == EmfPlusRecordType.DrawString)
    {
        // Копирование неуправляемых данных записи.
        byte[] data_array = null;
        data_array = new byte[data_size];
        Marshal.Copy(data, data_array, 0, data_size);

        // Посмотрите, сколько символов в строке.
        int num_chars = BitConverter.ToInt32(data_array, 8);

        // Получить символы.
        string txt = Encoding.Unicode.GetString(
            data_array, 28, 2 * num_chars);

        lstStrings.Items.Add(txt);
    }

    // Продолжаем перечисление.
    return true;
}

Если запись представляет команду DrawString, код создает массив и копирует в него данные команды. Байты с 8 по 11 данных содержат длину строки, нарисованной командой, поэтому код использует BitConverter.ToInt32 для преобразования этих байтов в число, указывающее длину строки.

Символы в строке сохраняются как Unicode, начиная с байта 28 данных. В коде используется System.Text.Encoding.Unicode.GetString, чтобы получить строку. Параметры этого метода дают массив байтов, индекс первого байта в строке (28) и количество байтов в строке. Поскольку это Unicode, каждый символ занимает 2 байта, поэтому общее количество байтов в 2 раза больше количества символов.

После того, как он получит строку, пример добавляет ее в форму ListBox.

Источник: http://csharphelper.com/blog/2016/12/extract-text-from-a-metafile-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector