偶遇需要解析 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. html2canvas 踩坑总结

    需求:将html表格导出为图片,表格可以自己编辑数据,并适配各种屏幕大小.上网搜了下,找到了html2canvas,一开始使用的是最新版0.5.0,最终因为需要支持自定义div编辑框自动换行选择了v0 ...

  2. External Table

    CREATE TABLE AS SELECT,使用Oracle9i的External Table  Oracle 9i 的一项新特性就是 External Table,它就象通常的数据库表一样,拥有字 ...

  3. 使用OLEDB读取excel和csv文件

    这是我第一次在博客上写东西,简单的为大家分享一个oledb读取文件的功能吧,这两天在做一个文件导入数据库的小demo,就想着导入前先在页面上展示一下,之前调用Microsoft.Office.Inte ...

  4. DWZ (JUI) 教程 table 排序

    dwz排序是后台排序,不是前台的js排序,他的流程和搜索,分页是一样的,当你点击排序的按钮时,从新发送请求刷新当前的navTable 和 dialog. <th width="60&q ...

  5. Linux学习笔记---【1】

    什么是POSIX? 为何说Linux使用POSIX对于开发有很好的影响? POSIX是可携式操作系统接口(Portable Operating System Interface)的缩写,重点在于规范内 ...

  6. 20160126深入浅出obc知识点整理

    1.错误域Error Domain NSMachErrorDomain:系统内核错误 NSPOSIXErrorDomain:系统错误 NSOSStatusErrorDomian:MacOS9之前的错误 ...

  7. UI4_UIImageView

    // // ViewController.m // UI4_UIImageView // // Created by zhangxueming on 15/7/1. // Copyright (c) ...

  8. Bring up a website by wordpress

    WORDPRESS WordPress is web software you can use to create a beautiful website or blog, which is both ...

  9. Qt获得网页源码

    1.工程中添加网络模块 打开你的.pro文件插入以下代码 QT += network 2.添加代码 CodeQString NetWork::getWebSource(QUrl url) { QNet ...

  10. 修改eclipse中tomcat的发布路径

    当我们在eclipse部署好tomcat的时候,默认这个项目是部署在eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\t ...