Extração de dados de objetos incorporados
Às vezes, os dados OLE incorporados são representados como um anexo “oleData.mso” pelo MapiAttachment e precisam ser extraídos manualmente. Esses arquivos oleData.mso são no formato Microsoft Computer Document File (MCDF) e o suporte para tais arquivos está além da ocupação do Aspose.Email. No entanto, o Aspose.Email pode ser usado em combinação com outras bibliotecas de código aberto, como o OpenMCDF, para ler o conteúdo desses arquivos para salvá-los em disco. O Aspose.Email fornece a classe InlineAttachmentExtractor para enumerar pacotes MSO dos dados binários de oledata.mso, que podem então ser usados para extração de conteúdos por bibliotecas de leitura de arquivos compostos.
Se o tipo do corpo da mensagem for HTML (não RTF), e houver objetos OLE em uma mensagem, a propriedade MapiPropertyTag.PR_ATTACH_DATA_OBJ está ausente. Nesse caso, as informações sobre objetos OLE estão contidas em oldedata.mso.
Extração de Objetos Incorporados
Este artigo mostra como extrair o conteúdo de tal arquivo usando Aspose.Email e OpenMCDF. Isso pode ser feito da seguinte maneira:
- Enumerar pacotes MSO dos dados binários do anexo oledata.mso
- Para cada dado OLE, ler o CompoundFile
- Ler o fluxo com CONTEÚDOS
- Salvar o conteúdo em 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++; | |
} | |
} | |
} |