Как извлечь текст из метафайла в C#
Пример
Следующий код показывает метод обратного вызова, выполняемый для каждой записи метафайла.
// Ищем строковые записи. 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.