OMCS 使用技巧 -- 扩展电子白板支持课件的类型:word、pdf、ppt
OMCS电子白板仅仅内置了对图片类型(jpg、png、bmp)的课件的完整支持,如果要支持其它类型的课件(比如word、pdf、ppt、rar 等),那么,OMCS使用者必须自己实现电子白板流程中的一个环节(文档到图片的转换),然后通过OMCS提供的扩展接口注入到OMCS框架中。
本文首先介绍了扩展电子白板的课件类型的原理,接着给出了一个实现范例,以演示如何支持word、pdf、ppt、以及将多个图片压缩成一个rar的课件,最后提供了一个支持这些课件类型的电子白板demo的源码下载。
一. 如何扩展课件类型?
如何扩展OMCS让其支持更多的课件类型了?
我们只需要实现 IImageConverter 接口和 IImageConverterFactory 接口,然后将IImageConverterFactory的实现类的实例挂接到 IMultimediaManager的ImageConverterFactory属性上即可。
1. IImageConverter
OMCS.Engine.WhiteBoard.IImageConverter 接口代表图片转换器,用于完成文档到图片的转换,它会将文档中的每一页转换成一张图片(jpg或png)。该接口定义如下:
public interface IImageConverter { /// <summary> /// 当成功转换一页时,触发此事件。参数:已经完成转换的页数(doneCount) - 总页数(totalCount) /// </summary> event CbGeneric<int, int> ProgressChanged; /// <summary> /// 转换完成时,触发此事件。 /// </summary> event CbGeneric ConvertSucceed; /// <summary> /// 转换失败时,触发此事件。事件参数:失败的原因(FailCause) /// </summary> event CbGeneric<string> ConvertFailed; /// <summary> /// 开始转换。 /// </summary> /// <param name="originFilePath">要被转换的文档的全路径。</param> /// <param name="imageOutputDirPath">用于保存转换后的图片的目录的全路径</param> void ConvertToImage(string originFilePath, string imageOutputDirPath); /// <summary> /// 取消转换。 /// </summary> void Cancel(); }
各个元素的注释写得很清楚了,就不再赘述。
比如,我们要支持将word文档转换为图片,那么就可以定义一个Word2ImageConverter类,然后让其实现IImageConverter接口。
2. IImageConverterFactory
OMCS.Engine.WhiteBoard.IImageConverterFactory 接口代表转换器工厂,用于创建图片转换器实例,并告诉OMCS框架其支持哪些类型的课件。
public interface IImageConverterFactory { /// <summary> /// 根据文档的扩展名,创建对应的图片转换器。 /// </summary> /// <param name="extendName">全小写的扩展名。如“.docx”,“.pdf”等</param> /// <returns>如果不支持对应的文件类型,则返回null。</returns> IImageConverter CreateImageConverter(string extendName); /// <summary> /// 获取所有支持的文档类型。返回的集合中的元素为全小写的扩展名。如“.docx”,“.pdf”等。 /// </summary> List<string> GetSupportedFileTypes(); }
OMCS会在白板操作过程中的两个时候调用IImageConverterFactory接口:
(1)当用户上传课件时,OMCS会调用GetSupportedFileTypes方法来判断当前扩展是否支持目标类型的课件,如果不支持,则不能上传目标课件。
(2)当用户打开课件时,如果没有找到对应的缓存的图片,则会调用CreateImageConverter方法得到图片转换器,然后,再调用转换器开始进行转换。
二. 扩展课件类型示例
最常见的课件类型大概是3种:word文档、pdf文档、ppt幻灯片。如何将它们转换成图片,网上提供了很多解决方案,并且也有很多成熟的组件可以使用。
经过试用比较,我们推荐使用Aspose(请大家支持和购买正版的Aspose组件),Aspose稳定可靠,而且其API也相当简单。下面是我们基于Aspose试用版实现的word、pdf、ppt图片转换器,供您参考。
1. word转图片
public class Word2ImageConverter : IImageConverter { private bool cancelled = false; public event CbGeneric<int, int> ProgressChanged; public event CbGeneric ConvertSucceed; public event CbGeneric<string> ConvertFailed; public void Cancel() { if (this.cancelled) { return; } this.cancelled = true; } public void ConvertToImage(string originFilePath, string imageOutputDirPath) { this.cancelled = false; ConvertToImage(originFilePath, imageOutputDirPath, 0, 0, null, 200); } /// <summary> /// 将Word文档转换为图片 /// </summary> /// <param name="wordInputPath">Word文件路径</param> /// <param name="imageOutputDirPath">图片输出路径,如果为空,默认值为Word所在路径</param> /// <param name="startPageNum">从PDF文档的第几页开始转换,如果为0,默认值为1</param> /// <param name="endPageNum">从PDF文档的第几页开始停止转换,如果为0,默认值为Word总页数</param> /// <param name="imageFormat">设置所需图片格式,如果为null,默认格式为PNG</param> /// <param name="resolution">设置图片的像素,数字越大越清晰,如果为0,默认值为128,建议最大值不要超过1024</param> private void ConvertToImage(string wordInputPath, string imageOutputDirPath, int startPageNum, int endPageNum, ImageFormat imageFormat, int resolution) { try { Aspose.Words.Document doc = new Aspose.Words.Document(wordInputPath); if (doc == null) { throw new Exception("Word文件无效或者Word文件被加密!"); } if (imageOutputDirPath.Trim().Length == 0) { imageOutputDirPath = Path.GetDirectoryName(wordInputPath); } if (!Directory.Exists(imageOutputDirPath)) { Directory.CreateDirectory(imageOutputDirPath); } if (startPageNum <= 0) { startPageNum = 1; } if (endPageNum > doc.PageCount || endPageNum <= 0) { endPageNum = doc.PageCount; } if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; } if (imageFormat == null) { imageFormat = ImageFormat.Png; } if (resolution <= 0) { resolution = 128; } string imageName = Path.GetFileNameWithoutExtension(wordInputPath); ImageSaveOptions imageSaveOptions = new ImageSaveOptions(SaveFormat.Png); imageSaveOptions.Resolution = resolution; for (int i = startPageNum; i <= endPageNum; i++) { if (this.cancelled) { break; } MemoryStream stream = new MemoryStream(); imageSaveOptions.PageIndex = i - 1; string imgPath = Path.Combine(imageOutputDirPath, imageName) + "_" + i.ToString("000") + "." + imageFormat.ToString(); doc.Save(stream, imageSaveOptions); Image img = Image.FromStream(stream); Bitmap bm = ESBasic.Helpers.ImageHelper.Zoom(img, 0.6f); bm.Save(imgPath, imageFormat); img.Dispose(); stream.Dispose(); bm.Dispose(); System.Threading.Thread.Sleep(200); if (this.ProgressChanged != null) { this.ProgressChanged(i - 1, endPageNum); } } if (this.cancelled) { return; } if (this.ConvertSucceed != null) { this.ConvertSucceed(); } } catch (Exception ex) { if (this.ConvertFailed != null) { this.ConvertFailed(ex.Message); } } } }
2. pdf转图片
实现同Word2ImageConverter类似,可下载文末的Demo源码查看具体实现。这里省略。
3. ppt转图片
实现同Word2ImageConverter类似,可下载文末的Demo源码查看具体实现。这里省略。
4. 课件本来就是多张图片
课件如果本身就是多张图片,那么就不用再转换了。但是问题在于,白板原生支持的图片课件仅仅是一张图片而已,如果一个课件由多张图片构成,那就很不方便了。
这种情况的解决方案是:将多张图片压缩成一个 rar,作为一个课件文档,就像一个word文档一样。然后,解压这个动作就相当于是将 rar 转换为图片了。
Demo源码中的Rar2ImageConverter类,就是用于解压 rar 课件的。
5. 实现转换器工厂
public class ImageConverterFactory : IImageConverterFactory { public IImageConverter CreateImageConverter(string extendName) { if (extendName == ".doc" || extendName == ".docx") { return new Word2ImageConverter(); } if (extendName == ".pdf") { return new Pdf2ImageConverter(); } if (extendName == ".ppt" || extendName == ".pptx") { return new Ppt2ImageConverter(); } if (extendName == ".rar") { return new Rar2ImageConverter(); } return null; }
public List<string> GetSupportedFileTypes() { List<string> list = new List<string>(); list.Add(".doc"); list.Add(".docx"); list.Add(".pdf"); list.Add(".ppt"); list.Add(".pptx"); list.Add(".rar"); return list; } }
5. 注入到OMCS
IMultimediaManager multimediaManager = MultimediaManagerFactory.GetSingleton(); multimediaManager.ImageConverterFactory = new ImageConverterFactory();
三. 支持word、pdf、ppt课件类型的电子白板 Demo
1. Demo 说明
基于上面的成果,我们很快完成了一个支持word、pdf、ppt类型课件的电子白板Demo。可按以下流程测试这个demo:
(1)启动OMCS服务端。
(2)启动第一个客户端,选择“老师”角色,登录进默认教室。
(3)再启动多个客户端,选择“学生”角色,登录进默认教室。
(4)老师即可进行上传课件、打开课件、删除课件、课件翻页,在课件上标注、书写,等等操作。
2. Demo 源码下载
Demo源码:OMCS.Demos.WhiteBoardTest.rar
相关内容:
--------------------------------------------------------------------------------------------
阅读 更多OMCS开发手册系列文章。
Q Q:168757008