Как извлечь текст из метафайла в 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.
