WPF解析PPT为图片
偶遇需要解析 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为图片的更多相关文章
- WPF解析Word为图片
偶遇需要解析Word为单张图,此做 http://git.oschina.net/jiailiuyan/OfficeDecoder using System; using System.Collect ...
- WPF解析PDF为图片
偶遇需要解析PDF文件为单张图,此做, http://git.oschina.net/jiailiuyan/OfficeDecoder using System; using System.Colle ...
- [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧
不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...
- C#实现 word、pdf、ppt 转为图片
office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...
- word、pdf、ppt 转为图片
office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...
- php实现ppt转图片,php调用com组件问题
PHP 调用com组件将ppt转为图片. 需要在php.ini中开启 extension=php_com_dotnet.dllcom.allow_dcom = true 测试代码如下: < ...
- 重要:关于PPT转图片需要注意的问题
关于PPT转图片的问题需要注意的问题 我们有一个项目做过直接上传ppt的功能,但是网页不可能显示ppt,所以只能把ppt转成pdf或者图片来显示,我们的做法是转成了图片,然后使用swiper做成类 ...
- 实现PPT在线预览,PPT转图片方案
一.PPT转图片可行方案探索历程 PPT转图片方案 方案具体步骤及分析 已放弃方案 poi(失真度太高):Aspose直接转图片(收费,效果较好,备选):微软Office Online(需要基于Win ...
- Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转
同一文档,在不同的文档查看器或者编译环境中,需要对该文档进行相应的格式转换.下面的内容中,将介绍通过Java编程来实现PPT文档格式转换的方法. 使用工具: Spire.Presentation fo ...
随机推荐
- CSS标签知识
一.内联标签和块标签的区别 内联,内嵌,行内属性标签: 1.默认同行可以继续跟同类型标签: 2.内容撑开宽度 3.不支持宽高 4.不支持上下的margin和padding 5.代码换行被解析 块属性标 ...
- js 数组的length(javascript教程四)
这是一个简单的函数,就是利用length来判断数组再遍历数组了. <script language="javascript" type="text/javascri ...
- 关于server的一些小记
一. 批量创建用户 1. Import-Module ActiveDirectory 2. import-csv e:\users\newusers.csv | 3. New-ADUser -path ...
- UI1_ScrollViewHomeWork
// // AppDelegate.m // UI1_ScrollViewHomeWork // // Created by zhangxueming on 15/7/13. // Copyright ...
- UI3_ViewController初步
// // AppDelegate.m // UI3_ViewController初步 // // Created by zhangxueming on 15/6/30. // Copyright ( ...
- webSphere提示SSL证书过期,解决方法
1.点击Security ------SSL certificate and key management2.点击Related Items下的key stores and certificates3 ...
- 9款精美别致的CSS3菜单和按钮
1.超具立体感的CSS3 3D菜单 菜单项带小图标 记得之前向大家分享过不少CSS3 3D菜单,比如CSS3 3D动画菜单 3D立方体菜单项和HTML5/CSS3自定义下拉框 3D卡片折叠动画,效果都 ...
- 'hibernate.dialect' must be set when no Connection avalable
'hibernate.dialect' must be set when no Connection avalable 当连接不可用时,必须要设置Hibernate方言 搜索大多数的解决办法是:首先查 ...
- opencv 手写选择题阅卷 (二)字符识别
opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...
- ant条件逻辑
<condition property="sdk-folder" value="E:\android\android-sdk\adt-bundle-windows- ...