Skip to content

文档相关事件

概述

本节介绍软航OFFICE文档控件提供的文档相关事件,这些事件允许开发者在文档操作的不同阶段进行响应和处理,为文档管理系统提供完整的事件处理能力。

文档打开事件

AfterOpenFromURL

语法:

javascript
AfterOpenFromURL(Document, StatusCode)

功能:
该事件在BeginOpenFromURL方法执行完毕之后被触发。

参数:

名称必选/可选数据类型说明
Document可选object当前打开的文档对象
StatusCode可选long状态值,参照3.5.11说明

说明:
该事件和OnDocumentOpened作用基本相同,如果用BeginOpenFromURL加载文档则加载时进行的操作必须写在这两个方法的其中一个方法中。请参考BeginOpenFromURL方法。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="AfterOpenFromURL(doc, statusCode)">
    doc.TrackRevisions = true; // 进入痕迹保留状态
</script>

// 检查状态码
<script language="JScript" for="TANGER_OCX" event="AfterOpenFromURL(doc, statusCode)">
    if (statusCode === 0) {
        console.log("文档打开成功");
        // 执行文档打开后的操作
        doc.TrackRevisions = true;
    } else {
        console.log("文档打开失败,状态码:", statusCode);
    }
</script>

// 设置文档属性
<script language="JScript" for="TANGER_OCX" event="AfterOpenFromURL(doc, statusCode)">
    if (statusCode === 0) {
        // 设置文档为只读
        doc.SetReadOnly = true;
        
        // 启用痕迹保留
        doc.TrackRevisions = true;
        
        console.log("文档属性设置完成");
    }
</script>

OnDocumentOpened

语法:

javascript
OnDocumentOpened(File, Document)

功能:
该事件在文档打开完毕时执行。

参数:

名称必选/可选数据类型说明
File可选string当前打开的文档路径或URL
Document可选object当前打开的文档对象

说明:
第一个参数是文档路径或者URL,第二个参数是文档的自动化接口。比如,对于一个Word文档,第二个参数是一个Word.Document对象。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnDocumentOpened(file, doc)">
    console.log("文档已打开:", file);
    console.log("文档对象:", doc);
</script>

// 根据文档类型执行不同操作
<script language="JScript" for="TANGER_OCX" event="OnDocumentOpened(file, doc)">
    var fileExtension = file.split('.').pop().toLowerCase();
    
    switch(fileExtension) {
        case 'doc':
        case 'docx':
            // Word文档处理
            doc.TrackRevisions = true;
            console.log("Word文档已打开,启用痕迹保留");
            break;
        case 'xls':
        case 'xlsx':
            // Excel文档处理
            console.log("Excel文档已打开");
            break;
        case 'ppt':
        case 'pptx':
            // PowerPoint文档处理
            console.log("PowerPoint文档已打开");
            break;
        default:
            console.log("未知文档类型:", fileExtension);
    }
</script>

// 设置文档安全属性
<script language="JScript" for="TANGER_OCX" event="OnDocumentOpened(file, doc)">
    // 设置文档保护
    doc.SetReadOnly = false;
    
    // 启用宏安全
    doc.SetMacroSecurityLevelOffice(3);
    
    console.log("文档安全设置完成");
</script>

文档关闭事件

OnDocumentClosed

语法:

javascript
OnDocumentClosed()

功能:
该事件在文档关闭之后执行。

说明:
无参数事件,在文档关闭后触发。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnDocumentClosed()">
    console.log("文档已关闭");
</script>

// 清理资源
<script language="JScript" for="TANGER_OCX" event="OnDocumentClosed()">
    // 清理临时文件
    console.log("清理文档相关资源");
    
    // 重置控件状态
    // 可以在这里执行一些清理操作
</script>

// 记录关闭日志
<script language="JScript" for="TANGER_OCX" event="OnDocumentClosed()">
    var timestamp = new Date().toISOString();
    console.log("文档关闭时间:", timestamp);
    
    // 可以发送关闭事件到服务器
    // trackDocumentEvent('closed', timestamp);
</script>

文档激活事件

OnDocActivated

语法:

javascript
OnDocActivated(IsActivated)

功能:
当控件被激活或者不激活时触发此事件。

参数:

名称必选/可选数据类型说明
IsActivated可选bool是否激活

说明:
比如,切换窗口将会触发此事件。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnDocActivated(isActivated)">
    if (isActivated) {
        console.log("文档控件已激活");
    } else {
        console.log("文档控件已失活");
    }
</script>

// 根据激活状态执行不同操作
<script language="JScript" for="TANGER_OCX" event="OnDocActivated(isActivated)">
    if (isActivated) {
        // 激活时的操作
        console.log("用户正在编辑文档");
        // 可以启用某些功能
    } else {
        // 失活时的操作
        console.log("用户离开文档编辑");
        // 可以暂停某些功能或保存草稿
    }
</script>

// 记录用户活动
<script language="JScript" for="TANGER_OCX" event="OnDocActivated(isActivated)">
    var timestamp = new Date().toISOString();
    var activity = isActivated ? 'activated' : 'deactivated';
    
    console.log("文档活动:", activity, "时间:", timestamp);
    
    // 可以记录用户活动日志
    // logUserActivity(activity, timestamp);
</script>

屏幕模式事件

OnScreenModeChanged

语法:

javascript
OnScreenModeChanged(IsFullScreenMode)

功能:
此事件当控件在全屏/非全屏状态切换时被触发。

参数:

名称必选/可选数据类型说明
IsFullScreenMode可选bool是否处于全屏状态

说明:
参数说明了此时控件是处于全屏还是非全屏编辑模式。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnScreenModeChanged(isFullScreen)">
    if (isFullScreen) {
        console.log("进入全屏模式");
    } else {
        console.log("退出全屏模式");
    }
</script>

// 根据屏幕模式调整界面
<script language="JScript" for="TANGER_OCX" event="OnScreenModeChanged(isFullScreen)">
    if (isFullScreen) {
        // 全屏模式下的操作
        console.log("全屏编辑模式,隐藏工具栏");
        // 可以隐藏某些UI元素
    } else {
        // 非全屏模式下的操作
        console.log("普通编辑模式,显示工具栏");
        // 可以显示某些UI元素
    }
</script>

// 记录屏幕模式变化
<script language="JScript" for="TANGER_OCX" event="OnScreenModeChanged(isFullScreen)">
    var timestamp = new Date().toISOString();
    var mode = isFullScreen ? 'fullscreen' : 'windowed';
    
    console.log("屏幕模式变化:", mode, "时间:", timestamp);
    
    // 可以记录用户行为
    // trackUserBehavior('screen_mode_change', mode, timestamp);
</script>

PDF相关事件

AfterPublishAsPDFToURL

语法:

javascript
AfterPublishAsPDFToURL(RetData, ErrorCode)

功能:
该事件在PublishAsPDFToURL方法执行完毕之后被触发。

参数:

名称必选/可选数据类型说明
RetData可选string后台自定义返回字符串
ErrorCode可选long错误状态值

说明:
可以用来判断保存到URL的状态。请参考PublishAsPDFToURL方法。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="AfterPublishAsPDFToURL(ret, code)">
    alert(code);
    alert(ret);
</script>

// 检查PDF发布状态
<script language="JScript" for="TANGER_OCX" event="AfterPublishAsPDFToURL(retData, errorCode)">
    if (errorCode === 0) {
        console.log("PDF发布成功");
        console.log("返回数据:", retData);
    } else {
        console.log("PDF发布失败,错误码:", errorCode);
        console.log("错误信息:", retData);
    }
</script>

// 处理PDF发布结果
<script language="JScript" for="TANGER_OCX" event="AfterPublishAsPDFToURL(retData, errorCode)">
    switch(errorCode) {
        case 0:
            console.log("PDF发布成功,文件路径:", retData);
            // 可以显示成功消息或跳转到PDF文件
            break;
        case -1:
            console.log("PDF发布失败:网络错误");
            break;
        case -2:
            console.log("PDF发布失败:服务器错误");
            break;
        default:
            console.log("PDF发布失败,未知错误:", errorCode);
    }
</script>

AfterSelPdfContent

语法:

javascript
AfterSelPdfContent(bstRetData)

功能:
此事件当控件在选择PDF文字内容后触发并返回所选择的文字内容字符串。

参数:

名称必选/可选数据类型说明
bstRetData必选string选择的内容

说明:
用于处理PDF文档中选中的文字内容。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="AfterSelPdfContent(selectedText)">
    console.log("选中的PDF内容:", selectedText);
</script>

// 处理选中的PDF内容
<script language="JScript" for="TANGER_OCX" event="AfterSelPdfContent(selectedText)">
    if (selectedText && selectedText.trim() !== "") {
        console.log("用户选中了PDF内容:", selectedText);
        
        // 可以复制到剪贴板
        // copyToClipboard(selectedText);
        
        // 可以搜索相关内容
        // searchRelatedContent(selectedText);
    } else {
        console.log("未选中任何PDF内容");
    }
</script>

// 分析选中的内容
<script language="JScript" for="TANGER_OCX" event="AfterSelPdfContent(selectedText)">
    if (selectedText) {
        var textLength = selectedText.length;
        var wordCount = selectedText.split(/\s+/).length;
        
        console.log("选中内容统计:");
        console.log("字符数:", textLength);
        console.log("单词数:", wordCount);
        
        // 可以显示内容统计信息
        // showContentStats(textLength, wordCount);
    }
</script>

预览相关事件

AfterPreviewClosed

语法:

javascript
AfterPreviewClosed()

功能:
此事件当控件在退出打印预览模式后触发。

说明:
无参数事件,在退出打印预览后触发。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="AfterPreviewClosed()">
    console.log("退出打印预览模式");
</script>

// 恢复编辑模式
<script language="JScript" for="TANGER_OCX" event="AfterPreviewClosed()">
    console.log("返回文档编辑模式");
    
    // 可以恢复某些编辑功能
    // enableEditingFeatures();
    
    // 可以刷新文档显示
    // refreshDocumentDisplay();
</script>

// 记录预览活动
<script language="JScript" for="TANGER_OCX" event="AfterPreviewClosed()">
    var timestamp = new Date().toISOString();
    console.log("预览结束时间:", timestamp);
    
    // 可以记录用户预览行为
    // trackUserBehavior('preview_closed', timestamp);
</script>

方法分类总结

分类事件功能说明
文档打开AfterOpenFromURL从URL打开文档后触发文档加载完成
OnDocumentOpened文档打开完毕时执行文档打开完成
文档关闭OnDocumentClosed文档关闭之后执行文档关闭完成
文档激活OnDocActivated控件激活/失活时触发焦点状态变化
屏幕模式OnScreenModeChanged全屏/非全屏切换时触发显示模式变化
PDF相关AfterPublishAsPDFToURLPDF发布完成后触发PDF转换完成
AfterSelPdfContent选择PDF内容后触发PDF内容选择
预览相关AfterPreviewClosed退出打印预览后触发预览模式结束

使用流程

1. 基本文档事件处理流程

javascript
// 基本文档事件处理流程
function basicDocumentEventHandling() {
    // 文档打开事件
    function handleDocumentOpened(file, doc) {
        console.log("文档已打开:", file);
        // 设置文档属性
        doc.TrackRevisions = true;
    }
    
    // 文档关闭事件
    function handleDocumentClosed() {
        console.log("文档已关闭");
        // 清理资源
    }
    
    // 文档激活事件
    function handleDocumentActivated(isActivated) {
        if (isActivated) {
            console.log("文档已激活");
        } else {
            console.log("文档已失活");
        }
    }
}

2. 高级文档事件处理流程

javascript
// 高级文档事件处理流程
function advancedDocumentEventHandling() {
    // 文档事件配置
    var documentEventConfig = {
        enableTracking: true,
        enableLogging: true,
        enableSecurity: true
    };
    
    // 处理文档打开
    function handleAdvancedDocumentOpened(file, doc) {
        if (documentEventConfig.enableTracking) {
            console.log("文档打开跟踪:", file);
        }
        
        if (documentEventConfig.enableSecurity) {
            // 设置安全属性
            doc.SetReadOnly = false;
            doc.SetMacroSecurityLevelOffice(3);
        }
    }
    
    // 处理文档关闭
    function handleAdvancedDocumentClosed() {
        if (documentEventConfig.enableLogging) {
            console.log("文档关闭日志记录");
        }
    }
}

3. PDF事件处理流程

javascript
// PDF事件处理流程
function pdfEventHandling() {
    // 处理PDF发布
    function handlePdfPublish(retData, errorCode) {
        if (errorCode === 0) {
            console.log("PDF发布成功:", retData);
        } else {
            console.log("PDF发布失败:", errorCode);
        }
    }
    
    // 处理PDF内容选择
    function handlePdfContentSelection(selectedText) {
        if (selectedText) {
            console.log("选中PDF内容:", selectedText);
        }
    }
}

完整示例

1. 基础文档事件处理

javascript
// 基础文档事件处理示例
function basicDocumentEventHandling() {
    // 文档打开处理
    function onDocumentOpened(file, doc) {
        console.log("文档已打开:", file);
        doc.TrackRevisions = true;
    }
    
    // 文档关闭处理
    function onDocumentClosed() {
        console.log("文档已关闭");
    }
}

2. 高级文档事件处理

javascript
// 高级文档事件处理示例
function advancedDocumentEventHandling() {
    // 文档事件管理
    var documentEventManager = {
        isDocumentOpen: false,
        isDocumentActive: false,
        currentDocument: null
    };
    
    // 处理文档打开
    function handleDocumentOpened(file, doc) {
        documentEventManager.isDocumentOpen = true;
        documentEventManager.currentDocument = doc;
        
        console.log("文档管理状态更新:", documentEventManager);
    }
    
    // 处理文档关闭
    function handleDocumentClosed() {
        documentEventManager.isDocumentOpen = false;
        documentEventManager.currentDocument = null;
        
        console.log("文档管理状态重置:", documentEventManager);
    }
}

3. 文档事件质量控制

javascript
// 文档事件质量控制示例
function documentEventQualityControl() {
    // 事件质量控制
    function controlDocumentEventQuality() {
        var eventQuality = {
            documentOpened: 0,
            documentClosed: 0,
            documentActivated: 0,
            errors: []
        };
        
        // 监控事件质量
        function monitorEventQuality(eventType, success) {
            if (success) {
                eventQuality[eventType]++;
            } else {
                eventQuality.errors.push({
                    event: eventType,
                    timestamp: new Date().toISOString()
                });
            }
        }
        
        console.log("文档事件质量控制:", eventQuality);
        return eventQuality;
    }
    
    // 执行质量控制
    var qualityResult = controlDocumentEventQuality();
    console.log("文档事件质量控制结果:", qualityResult);
}

注意事项

  1. 事件顺序:注意事件触发的顺序,确保在正确的时机执行相应操作
  2. 参数验证:验证事件参数的有效性,避免空值或无效值
  3. 错误处理:实现完善的错误处理机制
  4. 性能考虑:避免在事件处理中执行耗时操作
  5. 资源管理:及时清理不需要的资源
  6. 状态同步:保持文档状态的一致性
  7. 用户体验:确保事件处理不影响用户体验

错误处理

javascript
// 文档事件错误处理
function handleDocumentEventError(eventType, error) {
    console.error("文档事件处理失败:", eventType, error.message);
    
    switch(eventType) {
        case 'OnDocumentOpened':
            console.log("文档打开事件失败,请检查:");
            console.log("1. 文档文件是否存在");
            console.log("2. 文档格式是否支持");
            console.log("3. 控件是否已正确初始化");
            break;
        case 'OnDocumentClosed':
            console.log("文档关闭事件失败,请检查:");
            console.log("1. 文档是否已正确关闭");
            console.log("2. 是否有未保存的更改");
            break;
        case 'AfterPublishAsPDFToURL':
            console.log("PDF发布事件失败,请检查:");
            console.log("1. 网络连接是否正常");
            console.log("2. 服务器是否可访问");
            console.log("3. PDF转换服务是否可用");
            break;
        default:
            console.log("未知文档事件处理失败");
    }
}

最佳实践

1. 文档事件管理最佳实践

javascript
// 文档事件管理最佳实践
function documentEventManagementBestPractice() {
    // 文档事件配置
    var documentEventConfig = {
        enableTracking: true,
        enableLogging: true,
        enableSecurity: true,
        enableQualityControl: true
    };
    
    // 应用文档事件配置
    function applyDocumentEventConfig() {
        try {
            // 设置事件处理
            if (documentEventConfig.enableTracking) {
                console.log("文档事件跟踪已启用");
            }
            
            if (documentEventConfig.enableLogging) {
                console.log("文档事件日志已启用");
            }
            
            console.log("文档事件配置应用成功");
        } catch (error) {
            handleDocumentEventError('applyDocumentEventConfig', error);
        }
    }
    
    // 应用配置
    applyDocumentEventConfig();
}

2. 文档事件质量控制最佳实践

javascript
// 文档事件质量控制最佳实践
function documentEventQualityControlBestPractice() {
    // 文档事件质量控制
    function controlDocumentEventQuality() {
        try {
            // 事件质量控制
            var eventQuality = {
                totalEvents: 0,
                successfulEvents: 0,
                failedEvents: 0,
                qualityScore: 0
            };
            
            // 计算质量分数
            if (eventQuality.totalEvents > 0) {
                eventQuality.qualityScore = (eventQuality.successfulEvents / eventQuality.totalEvents) * 100;
            }
            
            console.log("文档事件质量控制完成:", eventQuality);
            return eventQuality;
        } catch (error) {
            console.error("文档事件质量控制失败:", error.message);
            return null;
        }
    }
    
    // 执行质量控制
    var qualityResult = controlDocumentEventQuality();
    console.log("文档事件质量控制结果:", qualityResult);
}

技术要点

  1. 事件顺序:注意事件触发的顺序,确保在正确的时机执行相应操作
  2. 参数验证:验证事件参数的有效性,避免空值或无效值
  3. 错误处理:完善的错误处理机制
  4. 性能优化:避免在事件处理中执行耗时操作
  5. 资源管理:及时清理不需要的资源
  6. 状态同步:保持文档状态的一致性
  7. 用户体验:确保事件处理不影响用户体验