偶遇需要解析 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. 根据不同的浏览器对不同元素进行css调整

    <!if firefox> .element { top:4px; } <![endif]> <!if chrome> .element { top:6px; } ...

  2. 【奇怪现象】用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE。【正常】?原因?

    [奇怪现象]用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE.[正常]?原因? 对于__VIEWSTATE和__EVENTVALIDA ...

  3. Part 82 to 85 Talking about Generic queue, stack collection class

    Part 82   Generic queue collection class Part 83   Generic stack collection class Part 84   Real tim ...

  4. 日志备份和差异备份还原中的常见问题示例(转自&邹建)

    --创建测试 CREATE DATABASE db GO    --正常备份 BACKUP DATABASE db TO DISK='c:\1.bak' WITH FORMAT BACKUP LOG  ...

  5. IE6中position:fixed无效问题解决

    在做页面右下脚对话框时,直接使用position:fixed;大部分浏览器很容易就能做到,但是在IE6中却发现不行,原来是IE6不支持position:fixed;这个属性. 虽然用JS肯定能解决这个 ...

  6. AMQ学习笔记 - 10. Spring-JmsTemplate之浏览

    概述 浏览只是针对Queue的概念,Topic没有浏览.浏览是指获取消息而消息依然保持在broker中,而消息的接收会把消息从broker中移除. 浏览可以用来实现对Queue中消息的监控. JMS ...

  7. 洛谷 P3374 【模板】树状数组 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  8. template_20_实现智能指针

    一:计数器二:析构和释放三:SmartPoint

  9. Android 技术用于汇总

    id 名词 含义 详细  1 Android CTS     CTS 全称 Compatibility Test Suite 兼容性测试工具 当产品开发出来以后,并定制了自己的 Android 系统后 ...

  10. shell编程基础练习

    shell作为一个人机交互的接口,在Linux中发挥着很大的作用,而shell编程则是减轻系统工程师工作的利器,这里总结一下shell编程的主要内容(趁着程序运行的空档). 本文的基本结构是shell ...