Skip to content

PDF插件自定义批注相关接口

概述

本节介绍软航OFFICE文档控件PDF插件自定义批注相关接口,这些接口允许开发者在PDF文档中管理自定义批注,为PDF文档管理系统提供完整的批注控制能力。

注意: PDF插件提供了批注侧边栏来展现自定义批注信息,详见ShowSidebar方法介绍。

批注用户设置

SetAnnotateUser

语法:

javascript
SetAnnotateUser(AnnotateUser)

功能:
设置自定义批注人名称。

参数:

名称必选/可选数据类型说明
AnnotateUser必选string自定义批注人名称

返回值:
无返回值

说明:
可在OnDocumentOpened事件中设置自定义批注人名称,一般可设置为当前应用系统的用户名。如果不设置批注人名称,则默认为Administrator。自定义批注人不仅是用来标识批注的插入者信息,同时也是标识批注的所属权。批注人可以修改自己的批注内容以及设置该批注是否允许他人修改。文档中其他人的(未开放修改权限的)批注,只能查看不能修改。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 设置批注人名称
plugInObj.SetAnnotateUser("张三");
console.log("批注人名称已设置为: 张三");

// 在文档打开事件中设置
<script type="text/javascript" language="javascript" for="TANGER_OCX" event="OnDocumentOpened(TANGER_OCX_str,TANGER_OCX_obj);">
    TANGER_OCX_obj.SetAnnotateUser("当前用户");
</script>

批注操作方法

AddAnnotate

语法:

javascript
AddAnnotate(text)

功能:
插入自定义批注。

参数:

名称必选/可选数据类型说明
text必选string自定义批注内容

返回值:
无返回值

说明:
执行本方法前,可以先在PDF文档中选中文字区域,即是批注所在位置。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 插入批注
plugInObj.AddAnnotate("这是一个重要的批注");
console.log("批注已插入");

// 插入多个批注
var annotations = [
    "这是第一个批注",
    "这是第二个批注",
    "这是第三个批注"
];

for (var i = 0; i < annotations.length; i++) {
    plugInObj.AddAnnotate(annotations[i]);
    console.log("批注" + (i + 1) + "已插入");
}

GetAnnotateCount

语法:

javascript
GetAnnotateCount()

功能:
获取自定义批注个数。

返回值:
数值型

说明:
获取自定义批注个数。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 获取批注个数
var annotateCount = plugInObj.GetAnnotateCount();
console.log("批注个数:", annotateCount);

// 遍历所有批注
for (var i = 0; i < annotateCount; i++) {
    var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
    if (annotateObj) {
        console.log("批注" + i + ":", annotateObj.AnnotData);
    }
}

GetAnnotateObjFromIndex

语法:

javascript
GetAnnotateObjFromIndex(Index)

功能:
根据索引获取自定义批注对象。

参数:

名称必选/可选数据类型说明
Index必选long自定义批注索引

返回值:
Object对象

说明:
返回的Object对象包含了自定义批注的相关信息,可以通过JS代码进行获取。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 获取指定索引的批注对象
var annotateObj = plugInObj.GetAnnotateObjFromIndex(0);
if (annotateObj) {
    var annotData = annotateObj.AnnotData;        // 批注内容
    var annotTime = annotateObj.AnnotTime;        // 批注插入时间
    var userName = annotateObj.UserName;          // 批注人,即SetAnnotateUser方法设置的名称
    var pageNumber = annotateObj.PageNumber;      // 批注所在页码
    var annotX = annotateObj.X;                    // 批注所在X坐标位置
    var annotY = annotateObj.Y;                    // 批注所在Y坐标位置
    
    console.log("批注信息:");
    console.log("内容:", annotData);
    console.log("时间:", annotTime);
    console.log("用户:", userName);
    console.log("页码:", pageNumber);
    console.log("位置:", annotX, annotY);
}

// 获取所有批注对象
var annotateCount = plugInObj.GetAnnotateCount();
for (var i = 0; i < annotateCount; i++) {
    var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
    if (annotateObj) {
        console.log("批注" + i + ":", annotateObj.AnnotData);
    }
}

RemoveAnnotateByIndex

语法:

javascript
RemoveAnnotateByIndex(Index)

功能:
根据索引删除指定的自定义批注对象。

参数:

名称必选/可选数据类型说明
Index必选long自定义批注索引

返回值:
无返回值

说明:
根据索引删除指定的自定义批注对象。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 删除指定索引的批注
plugInObj.RemoveAnnotateByIndex(0);
console.log("批注已删除");

// 删除所有批注
var annotateCount = plugInObj.GetAnnotateCount();
for (var i = annotateCount - 1; i >= 0; i--) {
    plugInObj.RemoveAnnotateByIndex(i);
    console.log("批注" + i + "已删除");
}

RemoveAllAnnotate

语法:

javascript
RemoveAllAnnotate()

功能:
删除所有自定义批注。

返回值:
无返回值

说明:
删除所有自定义批注。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 删除所有批注
plugInObj.RemoveAllAnnotate();
console.log("所有批注已删除");

批注数据管理

GetCustomAnnotatesData

语法:

javascript
GetCustomAnnotatesData([bstrUserName])

功能:
获取PDF文档中自定义批注数据。

参数:

名称必选/可选数据类型说明
bstrUserName可选string自定义批注人名称

返回值:
自定义批注二进制数据流

说明:
参数bstrUserName:可选。如果不传则为当前文档所有用户的批注信息;如果有传值则为指定用户的批注信息。由于自定义批注并不属于PDF文档的一部分,所以自定义批注并不能像插入的图片那样随着PDF文档一起提交保存。因此,需要通过此方法提取出自定义批注的二进制数据到一个表单对象中,随文档控件的SaveToURL方法一并提交到服务器(也可以通过Ajax提交),单独存储到数据库独立字段中。在打开PDF文档时,再将存储的二进制数据赋给PutCustomAnnotatesData就可以加载到PDF文档中。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 获取所有批注数据
var annotatesData = plugInObj.GetCustomAnnotatesData();
console.log("批注数据:", annotatesData);

// 获取指定用户的批注数据
var userAnnotatesData = plugInObj.GetCustomAnnotatesData("张三");
console.log("张三的批注数据:", userAnnotatesData);

// 提交时把批注数据赋给一个hide控件提交到服务器
document.getElementById("hidAnnotateData").value = plugInObj.GetCustomAnnotatesData();
plugInObj.SaveToURL("../upLoadPdfFile.jsp?", "EDITFILE", "", "", 0);

PutCustomAnnotatesData

语法:

javascript
PutCustomAnnotatesData(pData, [bstrUserName])

功能:
将自定义批注数据加载到PDF文档中。

参数:

名称必选/可选数据类型说明
pData必选string批注二进制数据
bstrUserName可选string自定义批注人名称

返回值:
无返回值

说明:
参数pData:从服务器返回的批注二进制流数据。参数bstrUserName:可选。如果不传则加载所有用户的批注信息;如果有传值则只加载指定用户的批注信息。

使用示例:

javascript
// 基本用法
var plugInObj = OfficeControlObj.ActiveDocument;

// 加载所有批注数据
plugInObj.PutCustomAnnotatesData(annotatesData);
console.log("批注数据已加载");

// 加载指定用户的批注数据
plugInObj.PutCustomAnnotatesData(userAnnotatesData, "张三");
console.log("张三的批注数据已加载");

// 在文档打开事件中加载批注数据
<script type="text/javascript" language="javascript" for="TANGER_OCX" event="OnDocumentOpened(TANGER_OCX_str,TANGER_OCX_obj);">
    TANGER_OCX_obj.PutCustomAnnotatesData(AnnData);
</script>

方法分类总结

分类方法功能说明
用户设置SetAnnotateUser设置批注人设置自定义批注人名称
批注操作AddAnnotate添加批注插入自定义批注
批注操作GetAnnotateCount获取批注个数获取自定义批注个数
批注操作GetAnnotateObjFromIndex获取批注对象根据索引获取自定义批注对象
批注操作RemoveAnnotateByIndex删除批注根据索引删除指定的自定义批注对象
批注操作RemoveAllAnnotate删除所有批注删除所有自定义批注
数据管理GetCustomAnnotatesData获取批注数据获取PDF文档中自定义批注数据
数据管理PutCustomAnnotatesData加载批注数据将自定义批注数据加载到PDF文档中

使用流程

1. 基本批注管理流程

javascript
// 基本批注管理流程
function basicAnnotateManagement() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 设置批注人
    function setAnnotateUser() {
        plugInObj.SetAnnotateUser("当前用户");
        console.log("批注人已设置");
    }
    
    // 添加批注
    function addAnnotate() {
        plugInObj.AddAnnotate("这是一个重要的批注");
        console.log("批注已添加");
    }
    
    // 获取批注信息
    function getAnnotateInfo() {
        var count = plugInObj.GetAnnotateCount();
        console.log("批注个数:", count);
        
        for (var i = 0; i < count; i++) {
            var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
            if (annotateObj) {
                console.log("批注" + i + ":", annotateObj.AnnotData);
            }
        }
    }
    
    return {
        setAnnotateUser: setAnnotateUser,
        addAnnotate: addAnnotate,
        getAnnotateInfo: getAnnotateInfo
    };
}

2. 高级批注管理流程

javascript
// 高级批注管理流程
function advancedAnnotateManagement() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 批注管理配置
    var annotateConfig = {
        enableLogging: true,
        enableValidation: true,
        enableErrorHandling: true,
        enableQualityControl: true
    };
    
    // 应用批注管理配置
    function applyAnnotateConfig() {
        try {
            if (annotateConfig.enableLogging) {
                console.log("批注管理日志已启用");
            }
            
            if (annotateConfig.enableValidation) {
                console.log("批注验证已启用");
            }
            
            console.log("批注管理配置应用成功");
        } catch (error) {
            console.error("批注管理配置应用失败:", error);
        }
    }
    
    // 监控批注状态
    function monitorAnnotateStatus() {
        var status = {
            annotateCount: plugInObj.GetAnnotateCount(),
            annotatesData: plugInObj.GetCustomAnnotatesData()
        };
        
        console.log("批注状态监控:", status);
        return status;
    }
    
    return {
        applyAnnotateConfig: applyAnnotateConfig,
        monitorAnnotateStatus: monitorAnnotateStatus
    };
}

3. 批注质量控制流程

javascript
// 批注质量控制流程
function annotateQualityControl() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 批注质量控制
    function controlAnnotateQuality() {
        var annotateQuality = {
            totalAnnotates: 0,
            validAnnotates: 0,
            invalidAnnotates: 0,
            qualityScore: 0
        };
        
        annotateQuality.totalAnnotates = plugInObj.GetAnnotateCount();
        
        for (var i = 0; i < annotateQuality.totalAnnotates; i++) {
            var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
            if (annotateObj && annotateObj.AnnotData && annotateObj.AnnotData.trim() !== "") {
                annotateQuality.validAnnotates++;
            } else {
                annotateQuality.invalidAnnotates++;
            }
        }
        
        if (annotateQuality.totalAnnotates > 0) {
            annotateQuality.qualityScore = (annotateQuality.validAnnotates / annotateQuality.totalAnnotates) * 100;
        }
        
        console.log("批注质量控制:", annotateQuality);
        return annotateQuality;
    }
    
    // 执行质量控制
    var qualityResult = controlAnnotateQuality();
    console.log("批注质量控制结果:", qualityResult);
}

完整示例

1. 基础批注管理

javascript
// 基础批注管理示例
function basicAnnotateManagement() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 设置批注人
    function setAnnotateUser() {
        plugInObj.SetAnnotateUser("当前用户");
        console.log("批注人已设置");
    }
    
    // 添加批注
    function addAnnotate() {
        plugInObj.AddAnnotate("这是一个重要的批注");
        console.log("批注已添加");
    }
    
    // 获取批注信息
    function getAnnotateInfo() {
        var count = plugInObj.GetAnnotateCount();
        console.log("批注个数:", count);
        
        for (var i = 0; i < count; i++) {
            var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
            if (annotateObj) {
                console.log("批注" + i + ":", annotateObj.AnnotData);
            }
        }
    }
    
    return {
        setAnnotateUser: setAnnotateUser,
        addAnnotate: addAnnotate,
        getAnnotateInfo: getAnnotateInfo
    };
}

2. 高级批注管理

javascript
// 高级批注管理示例
function advancedAnnotateManagement() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 批注管理配置
    var annotateConfig = {
        enableLogging: true,
        enableValidation: true,
        enableErrorHandling: true,
        enableQualityControl: true
    };
    
    // 应用批注管理配置
    function applyAnnotateConfig() {
        if (annotateConfig.enableLogging) {
            console.log("批注管理日志已启用");
        }
        
        if (annotateConfig.enableValidation) {
            console.log("批注验证已启用");
        }
        
        console.log("批注管理配置应用完成");
    }
    
    // 监控批注状态
    function monitorAnnotateStatus() {
        var status = {
            annotateCount: plugInObj.GetAnnotateCount(),
            annotatesData: plugInObj.GetCustomAnnotatesData()
        };
        
        console.log("批注状态:", status);
        return status;
    }
    
    return {
        applyAnnotateConfig: applyAnnotateConfig,
        monitorAnnotateStatus: monitorAnnotateStatus
    };
}

3. 批注质量控制

javascript
// 批注质量控制示例
function annotateQualityControl() {
    var plugInObj = OfficeControlObj.ActiveDocument;
    
    // 批注质量控制
    function controlAnnotateQuality() {
        var annotateQuality = {
            totalAnnotates: 0,
            validAnnotates: 0,
            invalidAnnotates: 0,
            qualityScore: 0
        };
        
        annotateQuality.totalAnnotates = plugInObj.GetAnnotateCount();
        
        for (var i = 0; i < annotateQuality.totalAnnotates; i++) {
            var annotateObj = plugInObj.GetAnnotateObjFromIndex(i);
            if (annotateObj && annotateObj.AnnotData && annotateObj.AnnotData.trim() !== "") {
                annotateQuality.validAnnotates++;
            } else {
                annotateQuality.invalidAnnotates++;
            }
        }
        
        if (annotateQuality.totalAnnotates > 0) {
            annotateQuality.qualityScore = (annotateQuality.validAnnotates / annotateQuality.totalAnnotates) * 100;
        }
        
        console.log("批注质量控制:", annotateQuality);
        return annotateQuality;
    }
    
    // 执行质量控制
    var qualityResult = controlAnnotateQuality();
    console.log("批注质量控制结果:", qualityResult);
}

注意事项

  1. 批注人设置:在文档打开事件中设置批注人名称
  2. 批注内容:批注内容不能为空,确保内容的有效性
  3. 批注位置:批注位置需要正确设置
  4. 错误处理:实现完善的错误处理机制
  5. 性能考虑:避免频繁操作批注
  6. 资源管理:及时清理不需要的批注
  7. 状态同步:保持批注状态的一致性

错误处理

javascript
// 批注管理错误处理
function handleAnnotateError(operationType, error) {
    console.error("批注管理处理失败:", operationType, error.message);
    
    switch(operationType) {
        case 'AddAnnotate':
            console.log("批注添加失败,请检查:");
            console.log("1. 批注内容是否有效");
            console.log("2. 批注位置是否正确");
            console.log("3. 文档状态是否正常");
            break;
        case 'GetAnnotateObjFromIndex':
            console.log("批注对象获取失败,请检查:");
            console.log("1. 批注索引是否正确");
            console.log("2. 批注是否存在");
            console.log("3. 文档状态是否正常");
            break;
        case 'RemoveAnnotateByIndex':
            console.log("批注删除失败,请检查:");
            console.log("1. 批注索引是否正确");
            console.log("2. 批注是否存在");
            console.log("3. 文档状态是否正常");
            break;
        default:
            console.log("未知批注管理处理失败");
    }
}

最佳实践

1. 批注管理最佳实践

javascript
// 批注管理最佳实践
function annotateManagementBestPractice() {
    // 批注管理配置
    var annotateConfig = {
        enableLogging: true,
        enableValidation: true,
        enableErrorHandling: true,
        enableQualityControl: true
    };
    
    // 应用批注管理配置
    function applyAnnotateConfig() {
        try {
            // 设置批注管理处理
            if (annotateConfig.enableLogging) {
                console.log("批注管理日志已启用");
            }
            
            if (annotateConfig.enableValidation) {
                console.log("批注验证已启用");
            }
            
            console.log("批注管理配置应用成功");
        } catch (error) {
            handleAnnotateError('applyAnnotateConfig', error);
        }
    }
    
    // 应用配置
    applyAnnotateConfig();
}

2. 批注质量控制最佳实践

javascript
// 批注质量控制最佳实践
function annotateQualityControlBestPractice() {
    // 批注质量控制
    function controlAnnotateQuality() {
        try {
            // 批注质量控制
            var annotateQuality = {
                totalAnnotates: 0,
                validAnnotates: 0,
                invalidAnnotates: 0,
                qualityScore: 0
            };
            
            // 计算质量分数
            if (annotateQuality.totalAnnotates > 0) {
                annotateQuality.qualityScore = (annotateQuality.validAnnotates / annotateQuality.totalAnnotates) * 100;
            }
            
            console.log("批注质量控制完成:", annotateQuality);
            return annotateQuality;
        } catch (error) {
            console.error("批注质量控制失败:", error.message);
            return null;
        }
    }
    
    // 执行质量控制
    var qualityResult = controlAnnotateQuality();
    console.log("批注质量控制结果:", qualityResult);
}

技术要点

  1. 批注人设置:在文档打开事件中设置批注人名称
  2. 批注内容:批注内容不能为空,确保内容的有效性
  3. 批注位置:批注位置需要正确设置
  4. 错误处理:完善的错误处理机制
  5. 性能优化:避免频繁操作批注
  6. 资源管理:及时清理不需要的批注
  7. 状态同步:保持批注状态的一致性