/// <summary> /// Finishes off the Presentation (fills extra page) /// </summary> public void FinishPres() { objSlide = (Microsoft.Office.Interop.PowerPoint._Slide)objSlides._Index(sCount); oCount = 1; AddText("This deck generated by eFlash", "Comic Sans MS", 40, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse, 50, 50, 800, 150); AddPic(Constant.ePath + "About.png", MsoTriState.msoFalse, MsoTriState.msoTrue, 200, 200, 350, 250); //AddPic("C:\\Program Files\\eFlash\\Data\\Media\\About.png", MsoTriState.msoFalse, MsoTriState.msoTrue, 200, 200, 350, 250); }
/// <summary> /// Open a PPT deck and create a directory of jpg images, one for each slide in the deck. /// </summary> /// <param name="g"></param> /// <param name="file"></param> private void processPpt(Guid g, FileInfo file) { if (stopNow) { return; } if (pptApp == null) { try { pptApp = new PowerPoint.Application(); // Check if PPT was already running. pptAlreadyOpen = (pptApp.Visible == MsoTriState.msoTrue); } catch (Exception e) { log.WriteLine("Failed to create PowerPoint application instance. " + e.ToString()); log.ErrorLevel = 6; pptApp = null; return; } } try { PowerPoint._Presentation ppPres = pptApp.Presentations.Open(file.FullName, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse); PowerPoint.Slides slides = ppPres.Slides; String tempDirName = Utility.GetTempDir(); Directory.CreateDirectory(tempDirName); int slideCount = slides.Count; int ptStart = progressTracker.CurrentValue; for (int i = 1; i <= slides.Count; i++) { if (stopNow) { break; } //The image looks much better and is reasonably small if we save to wmf format first, then // convert to jpg. I guess the .Net jpeg encoder is better than the PPT encoder?? // Sometimes we may want to use the jpeg export with certain decks because we can get better // fidelity with some less common symbols. PowerPoint._Slide ppSlide = (PowerPoint._Slide)slides._Index(i); String jpgfile = Path.Combine(tempDirName, "slide" + i.ToString() + ".jpg"); Image img = null; string tmpfile = null; if (useNativeJpegExport) { tmpfile = Path.Combine(tempDirName, "slidetmp" + i.ToString() + ".JPG"); ppSlide.Export(tmpfile, "JPG", 0, 0); img = Image.FromFile(tmpfile); } else { tmpfile = Path.Combine(tempDirName, "slide" + i.ToString() + ".WMF"); ppSlide.Export(tmpfile, "WMF", 0, 0); img = Image.FromFile(tmpfile); } try { //The right shift is used to work around a CP3 issue: Some slide decks are shifted to the right, so we also // need to do this to keep ink from being mis-aligned. As of 2013 this should no longer be needed when // using a current version of CP3. if (rightShift > 0) { Image shiftedImage; RightImageShift(img, rightShift, out shiftedImage); shiftedImage.Save(jpgfile, ImageFormat.Jpeg); shiftedImage.Dispose(); } else { img.Save(jpgfile, ImageFormat.Jpeg); } } catch (Exception e) { log.WriteLine("Failed to save image for slide " + jpgfile + " exception: " + e.ToString()); log.ErrorLevel = 6; } img.Dispose(); System.IO.File.Delete(tmpfile); progressTracker.CurrentValue = ((i * 100) / slideCount) + ptStart; } ppPres.Close(); ppPres = null; this.outputDirs.Add(g, tempDirName); } catch (Exception e) { log.WriteLine(e.ToString()); log.ErrorLevel = 6; } }