偶遇需要解析 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. 浅谈实现placeholder效果的几种方案

    placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示.高端浏览器支持此属性(ie10/11在获得焦点 ...

  2. JNA参数传递问题,Java数组

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法. C语言结构体定义如下: typedef struct Rect { in ...

  3. 如何提高手机APP的用户体验?

    详细内容请点击 随着移动互联网如日中天,如火如荼的时候,手机APP开发日益高涨了起来,关于手机APP的用户体验,也是一个老话长谈的话题.从事这行业也很久了,以下是我个人在工作中的一些关于APP的用户体 ...

  4. Jquery操作radio,checkbox,select表单操作实现代码

    一 .Select jQuery获取Select选择的Text和Value: 1. $("#select_id").change(function(){//code...}); / ...

  5. Excel VBA 快捷键 代码

    一. 在ThisWorkbook中 Private Sub Workbook_Open() '%对应alt键 宏不能加() Application.OnKey "%q", &quo ...

  6. 实例介绍Cocos2d-x精灵菜单和图片菜单

    精灵菜单类是MenuItemSprite,图片菜单类是MenuItemImage.由于MenuItemImage继承于MenuItemSprite,所以图片菜单也属于精灵菜单.为什么叫精灵菜单呢?那是 ...

  7. UI4_UIWebView

    // // ViewController.m // UI4_UIWebView // // Created by zhangxueming on 15/7/7. // Copyright (c) 20 ...

  8. js中字符和数组一些基本算法题

    最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping  这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法 ...

  9. HTML文件中使用Java程序

    HTML文件中使用Java程序:简而言之,在HTML文件中引入java应用程序,并通过javascript调用其方法.   一. 运行环境 1.JAVA_HOME.CLASSPATH.PATH配置正确 ...

  10. 在Windows Phone中使用HTML编程

    在开发Windows Phone的项目中,需求中有几个页面是要用表格来布局的(效果图如下),由于Grid中有的边线是虚的,而且没有边线,果断放弃了,用了border将表格的线加上去了.于是在有表格布局 ...