偶遇需要解析 PPT为单张图片

其中,对于包含动画的PPT页,分别对动画最后效果进行截取,即每个连续动画截取 (动画N个)N+1(原图)张

http://git.oschina.net/jiailiuyan/OfficeDecoder

using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Reflection;
using Aspose.Slides;
using Aspose.Slides.Animation; namespace Helpers
{
public static class PPTHelper
{ /// <summary> 获取 PPT 文档单页中的Shape,此项为动画的触发项 </summary>
/// <param name="ieffect"></param>
/// <returns></returns>
private static AutoShape GetAutoShape(IEffect ieffect)
{
AutoShape autoshape = null;
var effect = ieffect as Effect;
var flag = BindingFlags.Instance | BindingFlags.NonPublic;
// 在 IEffect 中,PPTXUnsupportedProps 是获取触发项的属性
var props = effect.TextAnimation.GetType().GetProperty("PPTXUnsupportedProps", flag);
if (props != null)
{
var animation = props.GetValue(effect.TextAnimation, null);
// 由于 dll 混淆后,无法直接获取属性的名称且触发项被设置为了保护项,因此需要反射 ishape_0 获取
var ishapefield = animation.GetType().GetField("ishape_0", flag);
var ishape = ishapefield.GetValue(animation);
autoshape = ishape as AutoShape;
}
return autoshape;
} /// <summary> 设置默认的 Slide 显示内容,在有动画的情况下, ISlide 显示的是编辑状态下最终呈现的,因此要修改其属性为动画播放状态初始界面 </summary>
/// <param name="islide"></param>
/// <returns></returns>
private static bool SetDefaultSlide(ISlide islide)
{
// ISlide 中的 Timeline.MainSequence 记录的是动画项
var slidecount = islide.Timeline.MainSequence.Count;
if (slidecount == )
{
return false;
} for (int i = ; i < slidecount; i++)
{
var ieffect = islide.Timeline.MainSequence[i];
var autoshape = GetAutoShape(ieffect);
foreach (var behavior in ieffect.Behaviors)
{
// Behaviors 中暂时只需要判断 SetEffect 项,因为其他项设置的是缓动和位置,因此无需处理
var seteffect = behavior as SetEffect;
if (seteffect != null)
{
//因为在此有动画设置此项为可见,反推之,此项默认应该隐藏
if (seteffect.To.ToString() == "visible")
{
autoshape.Hidden = true;
}
continue;
}
}
}
return true;
} public static List<string> ConvertToImages(string pptfile, string savedirectory = "")
{
// 返回的图片绝对路径集合
List<string> images = new List<string>(); // 获取 Word 文件名称
var pptname = System.IO.Path.GetFileNameWithoutExtension(pptfile); // 如果指定了保存路径,则使用传入的路径,否则在 Pdf 文件的同级创建同名文件夹当作保存路径
savedirectory = string.IsNullOrWhiteSpace(savedirectory) ? System.IO.Path.GetDirectoryName(pptfile) : savedirectory;
savedirectory = System.IO.Path.Combine(savedirectory, pptname);
// 防止保存的路径不存在因此创建保存文件夹
Directory.CreateDirectory(savedirectory); var pres = new Presentation(pptfile); int pptcount = pres.Slides.Count;
for (int p = ; p < pptcount; p++)
{
var item = pres.Slides[p];
var imagefile = System.IO.Path.Combine(savedirectory, p + ".jpg"); if (!SetDefaultSlide(item))
{
// 获取 2 倍的图像,用以解决 PPT 内容过小时分辨率过小 ,下同
item.GetThumbnail(2.0f, 2.0f).Save(imagefile);
images.Add(imagefile); continue;
}
imagefile = System.IO.Path.Combine(savedirectory, p + "_0.jpg");
item.GetThumbnail(2.0f, 2.0f).Save(imagefile);
images.Add(imagefile); // 在此每一个动画需要截图一次,因为每一个动画都有自己的显示内容
var slidecount = item.Timeline.MainSequence.Count;
for (int i = ; i < slidecount; i++)
{
var ieffect = item.Timeline.MainSequence[i];
var autoshape = GetAutoShape(ieffect);
try
{
foreach (var behavior in ieffect.Behaviors)
{
var seteffect = behavior as SetEffect;
if (seteffect != null)
{
//由于此属性标识当前项可见,于是需要还原状态用以截图
autoshape.Hidden = seteffect.To.ToString() != "visible";
continue;
}
}
}
catch { }
imagefile = System.IO.Path.Combine(savedirectory, p + "_" + i + ".jpg");
item.GetThumbnail(2.0f, 2.0f).Save(imagefile);
images.Add(imagefile);
}
} return images;
} /// <summary> 获取 PPT 中包含动画的所有可显示的 Bitmap </summary>
/// <param name="path"> PPT 文件路径 ,可以为 .pptx .ppt .pptm </param>
/// <returns> 包含了所有动画页的图像 </returns>
public static List<Bitmap> GetPPTImages(string path)
{
var bmps = new List<Bitmap>();
var pres = new Presentation(path);
foreach (var item in pres.Slides)
{
if (!SetDefaultSlide(item))
{
// 获取 2 倍的图像,用以解决 PPT 内容过小时分辨率过小 ,下同
bmps.Add(item.GetThumbnail(2.0f, 2.0f));
continue;
} bmps.Add(item.GetThumbnail(2.0f, 2.0f)); // 在此每一个动画需要截图一次,因为每一个动画都有自己的显示内容
var slidecount = item.Timeline.MainSequence.Count;
for (int i = ; i < slidecount; i++)
{
var ieffect = item.Timeline.MainSequence[i];
var autoshape = GetAutoShape(ieffect);
try
{
foreach (var behavior in ieffect.Behaviors)
{
var seteffect = behavior as SetEffect;
if (seteffect != null)
{
//由于此属性标识当前项可见,于是需要还原状态用以截图
autoshape.Hidden = seteffect.To.ToString() != "visible";
continue;
}
}
}
catch { } bmps.Add(item.GetThumbnail(2.0f, 2.0f));
}
} return bmps;
} }
}

WPF解析PPT为图片的更多相关文章

  1. WPF解析Word为图片

    偶遇需要解析Word为单张图,此做 http://git.oschina.net/jiailiuyan/OfficeDecoder using System; using System.Collect ...

  2. WPF解析PDF为图片

    偶遇需要解析PDF文件为单张图,此做, http://git.oschina.net/jiailiuyan/OfficeDecoder using System; using System.Colle ...

  3. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧

    不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...

  4. C#实现 word、pdf、ppt 转为图片

    office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...

  5. word、pdf、ppt 转为图片

    office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...

  6. php实现ppt转图片,php调用com组件问题

    PHP 调用com组件将ppt转为图片. 需要在php.ini中开启 extension=php_com_dotnet.dllcom.allow_dcom = true   测试代码如下:   < ...

  7. 重要:关于PPT转图片需要注意的问题

    关于PPT转图片的问题需要注意的问题   我们有一个项目做过直接上传ppt的功能,但是网页不可能显示ppt,所以只能把ppt转成pdf或者图片来显示,我们的做法是转成了图片,然后使用swiper做成类 ...

  8. 实现PPT在线预览,PPT转图片方案

    一.PPT转图片可行方案探索历程 PPT转图片方案 方案具体步骤及分析 已放弃方案 poi(失真度太高):Aspose直接转图片(收费,效果较好,备选):微软Office Online(需要基于Win ...

  9. Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转

    同一文档,在不同的文档查看器或者编译环境中,需要对该文档进行相应的格式转换.下面的内容中,将介绍通过Java编程来实现PPT文档格式转换的方法. 使用工具: Spire.Presentation fo ...

随机推荐

  1. JavaScript--正则表达式(笔记)

    一 什么是正则表达式 // 正则表达式(regular expression)是一个描述字符模式的对象; // JS定义RegExp类表示正则表达式; // String和RegExp都定义了使用正则 ...

  2. String中重要方法与字段

    下列这段代码已全部包含了我要写的String类中重要的字段: //StringMisc.java// This program demonstrates the length, charAt and ...

  3. Struts2+Hibernate4+Spring4整合

    jar包 配置文件 web.xml文件 <!-- needed for ContextLoaderListener --> <context-param> <param- ...

  4. acount

    #include<iostream> using namespace std; class account { public: int de( int i, double b, doubl ...

  5. JavaScript ES7 中使用 async/await 解决回调函数嵌套问题

    原文链接:http://aisk.me/using-async-await-to-avoid-callback-hell/ JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题.以往在浏览器中, ...

  6. Linux中profile与bashrc的作用

    文章同步发表在博主网站朗度云,传输门:http://www.wolfbe.com/detail/201608/278.html 在Linux系统上,我们会看到类似于profile和bashrc的文件, ...

  7. SQL 复杂查询

    一.子查询 .相关子查询 相关子查询是指需要引用主查询列表的子查询语句,相关子查询是通过EXISTS谓词来实现的.下面以显示工作在"new york"的所有雇员为例,说明相关子查询 ...

  8. 自适应rem布局

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  9. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  10. PHP实现根据浏览器跳转不同语言页面代码

    以下是对使用PHP实现根据浏览器跳转不同语言页面的代码进行了介绍,需要的朋友可以过来参考下 代码: <?php /** * 根据不同浏览器跳转不同页面 * 来源:www.jbxue.com * ...