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 Demo -- 电子白板的课件功能展现(附源码)

--------------------------------------------------------------------------------------------  

下载免费版本的OMCS以及 demo源码

阅读 更多OMCS开发手册系列文章

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

联系我们

站内搜索

OrayTalk 企业即时通讯系统

傲瑞通官网

详细说明

客户端下载

OrayMeeting 视频会议系统

详细说明

客户端下载

ESFramework 通信框架

详细说明

SDK与Demo下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK与Demo下载

OMCS FAQ

版本变更记录

OVCS 视频会议Demo

详细说明

源码下载

傲瑞实用组件

SDK下载

H5Media 纯网页音视频交互

NPusher 推流组件

MCapture 语音视频采集组件

MFile 语音视频录制组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

StriveEngine 轻量级的通信引擎

傲瑞组件 FAQ

授权

授权流程

产品选购指南

授权方案说明

授权SDK使用说明

其它

支持信创国产化

SDK使用技巧

联系我们