private ImageFormat GetImageFormat(SlidesConversionFormat format) { switch (format) { case SlidesConversionFormat.bmp: return(ImageFormat.Bmp); case SlidesConversionFormat.jpeg: return(ImageFormat.Jpeg); case SlidesConversionFormat.png: return(ImageFormat.Png); case SlidesConversionFormat.emf: return(ImageFormat.Wmf); case SlidesConversionFormat.wmf: return(ImageFormat.Wmf); case SlidesConversionFormat.gif: return(ImageFormat.Gif); case SlidesConversionFormat.exif: return(ImageFormat.Emf); case SlidesConversionFormat.ico: return(ImageFormat.Icon); default: throw new ArgumentException($"Unknown format {format}"); } }
/// <summary> /// Splits presentation to parts and saves each part to the specified format. /// </summary> /// <param name="source">The source presentation file.</param> /// <param name="outputDir">Output directory where parts will be stored.</param> /// <param name="format">The required format.</param> /// <param name="splitType">Splitting type <see cref="SplitType"/></param> /// <param name="splitNumber">The number of slides in the group (applied only for <see cref="SplitType.Number"/>)</param> /// <param name="splitRange">The slide ranges string (applied only for <see cref="SplitType.Range"/>)</param> /// <param name="cancellationToken">The cancellation token.</param> public void Split(string source, string outputDir, SlidesConversionFormat format, SplitType splitType, int splitNumber, string splitRange, CancellationToken cancellationToken = default(CancellationToken)) { using (var presentation = new Presentation(source)) { foreach (var chunk in presentation.GetChunks(splitType, splitNumber, splitRange)) { SaveChunk(outputDir, chunk.name, Path.GetFileNameWithoutExtension(source), chunk.slides, format, cancellationToken); } } }
/// <summary> /// Converts source file into target format, saves resulted file to out file. /// Returns null in case of multiple files (all saved into outFolder). /// </summary> /// <param name="sourceFile">Source slides file to proceed.</param> /// <param name="outFolder">Output folder.</param> /// <param name="format">Output format.</param> /// <returns>Result file path.</returns> public string Conversion( string sourceFile, string outFolder, SlidesConversionFormat format ) { using (var presentation = new Presentation(sourceFile)) { var fileName = Path.GetFileNameWithoutExtension(sourceFile); var outOneFile = Path.Combine(outFolder, $"{fileName}.{format}"); switch (format) { case SlidesConversionFormat.odp: case SlidesConversionFormat.otp: case SlidesConversionFormat.pptx: case SlidesConversionFormat.pptm: case SlidesConversionFormat.potx: case SlidesConversionFormat.ppt: case SlidesConversionFormat.pps: case SlidesConversionFormat.ppsm: case SlidesConversionFormat.pot: case SlidesConversionFormat.potm: case SlidesConversionFormat.pdf: case SlidesConversionFormat.xps: case SlidesConversionFormat.ppsx: case SlidesConversionFormat.tiff: case SlidesConversionFormat.html: case SlidesConversionFormat.swf: var slidesFormat = format.ToString().ParseEnum <SaveFormat>(); presentation.Save(outOneFile, slidesFormat); return(outOneFile); case SlidesConversionFormat.txt: var lines = new List <string>(); foreach (var slide in presentation.Slides) { foreach (var shp in slide.Shapes) { if (shp is AutoShape ashp) { lines.Add(ashp.TextFrame.Text); } } var notes = slide.NotesSlideManager.NotesSlide?.NotesTextFrame?.Text; if (!string.IsNullOrEmpty(notes)) { lines.Add(notes); } } System.IO.File.WriteAllLines(outOneFile, lines); return(outOneFile); case SlidesConversionFormat.doc: case SlidesConversionFormat.docx: using (var stream = new MemoryStream()) { presentation.Save(stream, SaveFormat.Html); stream.Flush(); stream.Seek(0, SeekOrigin.Begin); var doc = new Words.Document(stream); switch (format) { case SlidesConversionFormat.doc: doc.Save(outOneFile, Words.SaveFormat.Doc); break; case SlidesConversionFormat.docx: doc.Save(outOneFile, Words.SaveFormat.Docx); break; default: throw new ArgumentException($"Unknown format {format}"); } } return(outOneFile); case SlidesConversionFormat.bmp: case SlidesConversionFormat.jpeg: case SlidesConversionFormat.png: case SlidesConversionFormat.emf: case SlidesConversionFormat.wmf: case SlidesConversionFormat.gif: case SlidesConversionFormat.exif: case SlidesConversionFormat.ico: ImageFormat GetImageFormat(SlidesConversionFormat f) { switch (format) { case SlidesConversionFormat.bmp: return(ImageFormat.Bmp); case SlidesConversionFormat.jpeg: return(ImageFormat.Jpeg); case SlidesConversionFormat.png: return(ImageFormat.Png); case SlidesConversionFormat.emf: return(ImageFormat.Wmf); case SlidesConversionFormat.wmf: return(ImageFormat.Wmf); case SlidesConversionFormat.gif: return(ImageFormat.Gif); case SlidesConversionFormat.exif: return(ImageFormat.Emf); case SlidesConversionFormat.ico: return(ImageFormat.Icon); default: throw new ArgumentException($"Unknown format {format}"); } } ///var size = presentation.SlideSize.Size; for (var i = 0; i < presentation.Slides.Count; i++) { var slide = presentation.Slides[i]; var outFile = Path.Combine(outFolder, $"{i}.{format}"); using (var bitmap = slide.GetThumbnail(1, 1)) // (new Size((int)size.Width, (int)size.Height))) bitmap.Save(outFile, GetImageFormat(format)); } return(null); case SlidesConversionFormat.svg: var svgOptions = new SVGOptions { PicturesCompression = PicturesCompression.DocumentResolution }; for (var i = 0; i < presentation.Slides.Count; i++) { var slide = presentation.Slides[i]; var outFile = Path.Combine(outFolder, $"{i}.{format}"); using (var stream = new FileStream(outFile, FileMode.CreateNew)) slide.WriteAsSvg(stream, svgOptions); } return(null); default: throw new ArgumentException($"Unknown format {format}"); } } }
/// <summary> /// Asynchronously converts source file into target format, saves resulted file to out file. /// </summary> /// <param name="sourceFile">Source slides file to proceed.</param> /// <param name="outFolder">Output folder.</param> /// <param name="format">Output format.</param> public string ConvertFile( string sourceFile, string outFolder, SlidesConversionFormat format ) => Conversion(sourceFile, outFolder, format);
/// <summary> /// Merge documents into one file, saves resulted file to out file with specified format. /// </summary> /// <param name="outFolder">Output folder.</param> /// <param name="format">Output format.</param> /// <param name="styleMasterFile">Master file for style in result file. When null, style not changed from source files.</param> /// <param name="sourceFiles">Source slides files to proceed.</param> /// <returns>Result file path.</returns> public string Merger( string outFolder, SlidesConversionFormat format, string styleMasterFile, params string[] sourceFiles ) { var files = new List <string>(); foreach (var sourceFile in sourceFiles) { if (Directory.Exists(sourceFile)) { files.AddRange(Directory.EnumerateFiles(sourceFile)); } else { files.Add(sourceFile); } } var fileName = Path.GetFileNameWithoutExtension(styleMasterFile ?? files.First()); var resultFile = Path.Combine(outFolder, $"{fileName}.pptx"); using (var resultPresentation = new Presentation()) { var slides = resultPresentation.Slides; while (slides.Any()) { slides.Remove(slides.First()); } var masters = resultPresentation.Masters; Presentation masterPresentation = null; IMasterSlide masterSlide = null; float maxWidth = 0, maxHeight = 0; if (styleMasterFile != null) { masterPresentation = new Presentation(styleMasterFile); foreach (var master in masterPresentation.Masters) { masterSlide = masters.AddClone(master); } } try { foreach (var sourceFile in files) { using (var sourcePresentation = new Presentation(sourceFile)) { var sourceSize = sourcePresentation.SlideSize.Size; maxWidth = Math.Max(maxWidth, sourceSize.Width); maxHeight = Math.Max(maxHeight, sourceSize.Height); var master = sourcePresentation.Masters.FirstOrDefault(); masters.AddClone(master); var layout = sourcePresentation.LayoutSlides; foreach (var slide in sourcePresentation.Slides) { if (masterSlide != null) { slides.AddClone(slide, masterSlide, true); } else { slides.AddClone(slide); } } } } if (styleMasterFile != null) { var masterSize = masterPresentation.SlideSize.Size; resultPresentation.SlideSize.SetSize(masterSize.Width, masterSize.Height, SlideSizeScaleType.DoNotScale); } else { resultPresentation.SlideSize.SetSize(maxWidth, maxHeight, SlideSizeScaleType.DoNotScale); } } finally { masterPresentation?.Dispose(); } resultPresentation.Save(resultFile, Aspose.Slides.Export.SaveFormat.Pptx); } if (format == SlidesConversionFormat.pptx) { return(resultFile); } else { return(Conversion( resultFile, outFolder, format )); } }
private void SaveChunk(string outputDir, string chunkName, string fileName, ISlide[] chunkSlides, SlidesConversionFormat format, CancellationToken cancellationToken = default(CancellationToken)) { if (chunkSlides.Length == 0) { return; } cancellationToken.ThrowIfCancellationRequested(); var presentation = chunkSlides[0].Presentation; switch (format) { case SlidesConversionFormat.pptx: case SlidesConversionFormat.pptm: case SlidesConversionFormat.ppsx: case SlidesConversionFormat.ppsm: case SlidesConversionFormat.potx: case SlidesConversionFormat.potm: case SlidesConversionFormat.pps: case SlidesConversionFormat.ppt: case SlidesConversionFormat.pot: case SlidesConversionFormat.odp: case SlidesConversionFormat.otp: using (var splitPresentation = new Presentation()) { while (splitPresentation.Slides.Count > 0) { splitPresentation.Slides.RemoveAt(0); } foreach (var slide in chunkSlides) { cancellationToken.ThrowIfCancellationRequested(); splitPresentation.Slides.AddClone(slide); } splitPresentation.Save(Path.Combine(outputDir, $"{fileName}_{chunkName}.{format}"), format.ToString().ParseEnum <SaveFormat>()); } break; case SlidesConversionFormat.pdf: case SlidesConversionFormat.xps: case SlidesConversionFormat.tiff: case SlidesConversionFormat.html: case SlidesConversionFormat.swf: presentation.Save(Path.Combine(outputDir, $"{fileName}_{chunkName}.{format}"), chunkSlides.Select(s => s.SlideNumber).ToArray(), format.ToString().ParseEnum <SaveFormat>()); break; case SlidesConversionFormat.doc: case SlidesConversionFormat.docx: using (var stream = new MemoryStream()) { presentation.Save(stream, chunkSlides.Select(s => s.SlideNumber).ToArray(), SaveFormat.Html); stream.Flush(); stream.Seek(0, SeekOrigin.Begin); var doc = new Words.Document(stream); var wordFormat = format == SlidesConversionFormat.doc ? Words.SaveFormat.Doc : Words.SaveFormat.Docx; doc.Save(Path.Combine(outputDir, $"{fileName}_{chunkName}.{format}"), wordFormat); } break; case SlidesConversionFormat.txt: var lines = new List <string>(); foreach (var slide in chunkSlides) { cancellationToken.ThrowIfCancellationRequested(); foreach (var shp in slide.Shapes) { if (shp is AutoShape ashp) { lines.Add(ashp.TextFrame.Text); } } var notes = slide.NotesSlideManager.NotesSlide?.NotesTextFrame?.Text; if (!string.IsNullOrEmpty(notes)) { lines.Add(notes); } } System.IO.File.WriteAllLines(Path.Combine(outputDir, $"{fileName}_{chunkName}.{format}"), lines); break; case SlidesConversionFormat.bmp: case SlidesConversionFormat.jpeg: case SlidesConversionFormat.png: case SlidesConversionFormat.emf: case SlidesConversionFormat.wmf: case SlidesConversionFormat.gif: case SlidesConversionFormat.exif: case SlidesConversionFormat.ico: foreach (var slide in chunkSlides) { cancellationToken.ThrowIfCancellationRequested(); var outFile = Path.Combine(outputDir, $"{fileName}_{slide.SlideNumber:D2}.{format}"); using (var bitmap = slide.GetThumbnail(1, 1)) { bitmap.Save(outFile, GetImageFormat(format)); } } break; case SlidesConversionFormat.svg: var svgOptions = new SVGOptions { PicturesCompression = PicturesCompression.DocumentResolution }; foreach (var slide in chunkSlides) { cancellationToken.ThrowIfCancellationRequested(); var outFile = Path.Combine(outputDir, $"{fileName}_{slide.SlideNumber:D2}.{format}"); using (var stream = new FileStream(outFile, FileMode.CreateNew)) { slide.WriteAsSvg(stream, svgOptions); } } break; default: throw new ArgumentException($"Unknown format {format}"); } }