Извлечение данных встроенных объектов
Иногда встроенные данные OLE представляются как вложение “oleData.mso” с помощью MapiAttachment и должны быть извлечены вручную. Эти файлы oleData.mso имеют формат Microsoft Computer Document File (MCDF), и поддержка таких файлов выходит за рамки возможностей Aspose.Email. Однако Aspose.Email может использоваться в комбинации с другими библиотеками с открытым исходным кодом, такими как OpenMCDF, для чтения содержимого таких файлов для сохранения на диск. Aspose.Email предоставляет класс InlineAttachmentExtractor для перечисления пакетов MSO из двоичных данных oledata.mso, которые затем могут быть использованы для извлечения содержимого библиотеками чтения Compound Files.
Если тип тела сообщения - HTML (не RTF), и в сообщении есть объекты OLE, свойство MapiPropertyTag.PR_ATTACH_DATA_OBJ отсутствует. В этом случае информация об объектах OLE содержится в oldedata.mso.
Извлечение встроенных объектов
Эта статья показывает, как извлечь содержимое из такого файла с помощью Aspose.Email и OpenMCDF. Это можно сделать следующим образом:
- Перечислить пакеты MSO из двоичных данных вложения oledata.mso
- для каждого OLE-данных прочитать CompoundFile
- Прочитать поток с СОДЕРЖИМЫМ
- Сохранить содержимое в FileStream
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// The path to the File directory | |
string dataDir = RunExamples.GetDataDir_Email(); | |
MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg"); | |
foreach (MapiAttachment mapiAttachment in msg.Attachments) | |
{ | |
if (mapiAttachment.LongFileName == "oledata.mso") | |
{ | |
IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData)); | |
int index = 0; | |
foreach (var oleItem in oledata) | |
{ | |
// Using OpenMCDF library | |
CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value)); | |
CFStream contents = cf.RootStorage.GetStream("CONTENTS"); | |
using (FileStream fs = File.OpenWrite(index + ".pdf")) | |
{ | |
byte[] data = contents.GetData(); | |
fs.Write(data, 0, data.Length); | |
fs.Flush(); | |
fs.Close(); | |
} | |
index++; | |
} | |
} | |
} |