要將PowerPoint檔案中的每張投影片匯出成圖檔,我們可以將PowerPoint的Com元件加入參考。

[C#]Export PowerPoint file to photos

撰寫如下的程式:

void ConvertPptToJpg(string file, string outputPath)
{
	var application = new Microsoft.Office.Interop.PowerPoint.Application();

	var ppt = application.Presentations.Open(file, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

	var index = 0;
	var fileName = Path.GetFileNameWithoutExtension(file);
	foreach (Slide slid in ppt.Slides)
	{
		++index;
		slid.Export(Path.Combine(outputPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
	}

	ppt.Close();
	application.Quit();
	GC.Collect();
}

程式碼很簡單,就是建立出PowerPoint應用程式後,讓PowerPoint應用程式將投影片檔案開啟,開啟時設定不顯示視窗,然後遍巡所有的投影片匯出,匯出時帶入匯出的檔案位置以及想要的解析度大小,做完後再將PowerPoint檔及應用程式關閉。

實際將投影片位置以及匯出檔案存放的位置帶入

...
ConvertPptToJpg(@"C:\Users\larry\Desktop\Win8 Screen Capture.pptx", @"c:\");
...

可以看到投影片如我們預期的轉成一張張的圖檔。

[C#]Export PowerPoint file to photos

這邊也可以進一步用Late-Binding的方式處理,效果一樣。

private void NAR(object o)
{
	try
	{
		while ((Marshal.ReleaseComObject(o) > 0) || (Marshal.FinalReleaseComObject(o) > 0))
		{
		}
	}
	catch
	{
	}
	finally
	{
		o = null;
	}
}

void ConvertPptToJpg(string file, string outputPath)
{
	Type t = Type.GetTypeFromProgID("PowerPoint.Application");
	object o = Activator.CreateInstance(t);

	object p = t.InvokeMember(
		"Presentations",
		BindingFlags.Public | BindingFlags.GetProperty,
		null, o, null, null);

	Type t2 = p.GetType();
	object ppt = t2.InvokeMember("Open",
		BindingFlags.Public | BindingFlags.InvokeMethod,
		null, p, new object[] { file, 0, 0, 0 }, null);

	object slides = t2.InvokeMember(
	"Slides",
	BindingFlags.Public | BindingFlags.GetProperty,
	null, ppt, null, null);

	var index = 0;
	var fileName = Path.GetFileNameWithoutExtension(file);
	foreach (object slid in (slides as IEnumerable))
	{
		++index;
		var slidType = slid.GetType();
		slidType.InvokeMember("Export",
		BindingFlags.Public | BindingFlags.InvokeMethod,
		null, slid, new object[] { Path.Combine(outputPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height }, null);
		NAR(slid);
	}

	NAR(p);
	p = null;

	NAR(slides);
	slides = null;

	t2.InvokeMember("Close",
		BindingFlags.Public | BindingFlags.InvokeMethod,
		null, ppt, null, null);

	NAR(ppt);
	ppt = null;

	t.InvokeMember(
		"Quit",
		BindingFlags.Public | BindingFlags.InvokeMethod,
		null, o, null, null);

	NAR(o);
	o = null;

	GC.Collect();
}
  • How to convert PowerPoint (.ppt, .pptx) to several images of each slide?