Hello,
Our goal is to convert a MSG file to PDF, and keep the MSG attachments as attachments of the generated PDF, so far so good.
The PDF is created and the original email attachments are in the PDF attachments list as you can see in this screenshot:
screenshot of genereted PDF with attchments.png (58.2 KB)
I also uploaded the PDF it self so you can check:
FinalPDFwithAttachments.pdf (1.2 MB)
The problem is that in the generated PDF if you go to the attachments list and try to open a MSG file it gives an error “Cannot read the item” even if download the attachment and try to open it from file system. The other file extensions attachments work fine.
Is this a known bug? Can you please verify whats wrong?
Here is the code used:
// Get MSG file bytes byte[] fileContent = System.IO.File.ReadAllBytes(sourceFileFullPath); List<Aspose.Email.Mapi.MapiAttachment> mailAttachments = new List<Aspose.Email.Mapi.MapiAttachment>(); Aspose.Email.Mapi.MapiMessage messageMapi; using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(fileContent)) { //Create an instance of MapiMessage and load an email file messageMapi = Aspose.Email.Mapi.MapiMessage.Load(memStream); } using (System.IO.MemoryStream msOut = new System.IO.MemoryStream()) { using (var msgStream = new System.IO.MemoryStream()) { // Setup the email attchments Aspose.Email.Mapi.MapiAttachmentCollection attachments = messageMapi.Attachments; if (attachments.Count > 0) { for (int index = 0; index < attachments.Count; index++) { Aspose.Email.Mapi.MapiAttachment attachment = attachments[index]; if (IsInlineAttachment(attachment, messageMapi.BodyType)) { // workaround to force inline attachment to be embedded instread of exporting it in output MHTML attachment.SetProperty(new Aspose.Email.Mapi.MapiProperty(Aspose.Email.Mapi.MapiPropertyTag.PR_ATTACH_METHOD, BitConverter.GetBytes((long)5))); // file embedded in a MSG contains a PR_ATTACH_METHOD whose value equals 5 } else { mailAttachments.Add(attachment); } } } Aspose.Email.MhtSaveOptions mhtSaveOptions = new Aspose.Email.MhtSaveOptions { SaveAttachments = false // this avoids exporting attachment in output MHTML }; // Save email changes messageMapi.Save(msgStream, mhtSaveOptions); msgStream.Position = 0; Aspose.Words.Loading.HtmlLoadOptions htmlLoadOptions = new Aspose.Words.Loading.HtmlLoadOptions(); htmlLoadOptions.LoadFormat = Aspose.Words.LoadFormat.Mhtml; htmlLoadOptions.WebRequestTimeout = 2000; // 2s timeout //htmlLoadOptions.ResourceLoadingCallback = new ExternalResourceLoader(loadExternalResources); var document = new Aspose.Words.Document(msgStream, htmlLoadOptions); // Save word document MHTML document.Save(msOut, new Aspose.Words.Saving.PdfSaveOptions()); if (mailAttachments.Count > 0) { Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document(msOut); foreach (Aspose.Email.Mapi.MapiAttachment pdfAttachment in mailAttachments) { // Get attachment bytes byte[] data = pdfAttachment.BinaryData != null ? pdfAttachment.BinaryData : pdfAttachment.ObjectData.Data; using (System.IO.Stream attachmentContentStream = new System.IO.MemoryStream(data)) { // Setup new file to be added as attachment to the main PDF Aspose.Pdf.FileSpecification pdfEmbeddedFile = new Aspose.Pdf.FileSpecification(attachmentContentStream, pdfAttachment.LongFileName); // Add attachment to document's attachment collection pdfDocument.EmbeddedFiles.Add(pdfEmbeddedFile); } } // Save the PDF with the attchments pdfDocument.Save(msOut); } } System.IO.File.WriteAllBytes("d:\\output.pdf", msOut.ToArray()); }
I also upload a sample project where you can replicate the problem:
PdfAttachments.zip (16.8 KB)
And the original MSG file to be converted to PDF with attachments:
MSG file to convert to PDF.zip (3.3 MB)