本技术资料版权所有,禁止分发.©(2003-2007),重庆软航科技有限公司,保留所有权利.NTKO和软航是软航科技的商标

NTKO OFFICE文档控件技术资料

如何通过文档控件控制word 文档里的电子印章不被复制到系统外


创建时间:02/16/2017 05:27:18 PM 修改时间: 11/13/2019 03:41:16 PM
分类:BS开发-常见问题, BS开发-开发技巧, BS客户端-JavaScript控制Word
适应版本号:4,0,6,X; 4,0,1,X

相关文档:本文档没有相关文档

问题描述:允许拷贝文档内容到本地word,但是不允许将印章也拷贝出去。

问题分析:用户拷贝前必然会选择要拷贝的内容(例如按CTRL+A,全选),所选择的内容具备start位置和end位置。同时文档中的每个印章的描点(Anchor)也具备start位置和end位置。NTKO office文档控件提供了OnWordWPSSelChange事件,即在文档中选择对象一旦改变就会触发改事件,也就是说只要用户去选择内容就会触发OnWordWPSSelChange事件,在这个事件中,去判断文档中是否有印章的描点在选择内容的start和end位置之间,如果是则让光标回到文档开始的位置(即用户选择的范围里面有印章就让用户选择不上),或者也可以通过控件提供的方法禁止复制功能。


注意:此方案针对的是NTKO OFFICE文档控件结合NTKO 安全电子印章Office版本使用的情况,若当前使用的不是我司安全电子印章产品,则可考虑更换以达到对应效果。

参考核心代码(IE下适用,Chrome、FireFox下 则需要写到对应的回调函数里):

<script language="JScript" for="TANGER_OCX" event="OnWordWPSSelChange(Selection)"> //当Word或者WPS文档的插入点或者选中内容改变时触发此事件。
var selstart=Selection.start; //选择对象的start
var selend=Selection.end; //选择对象的end
var signstart; //印章描点的start
var signend; //印章描点的end
var shapes=TANGER_OCX_OBJ.ActiveDocument.Shapes; //获取文档中图片的对象
var count=shapes.Count; //获取文档中图片的数量
for(var i=1;i<=count;i++)
{
//如果图片的TYPE属性值不等于12,则说明只是普通图片对象
if (shapes(i).Type == 12)
{
signstart=shapes(i).Anchor.start; //获取印章描点的start
signend=shapes(i).Anchor.end; //印章描点的end
if(selstart<=signstart&&selend>=signend) //所选范围是否包含印章
{
//TANGER_OCX_OBJ.ActiveDocument.application.Selection.HomeKey(6,0); //移动到文档开始位置 用户自己选择的内容等于没选择上也就没办法复制了
//也可以替换为 控件提供的禁止复制的方法
TANGER_OCX_OBJ.IsStrictNoCopy=true;
/*禁用整个系统的剪贴板,此时在鼠标移出控件时需要设置回来 可在加载控件的时候设置 详见ntkoofficecontrol.js
document.write('<object id="TANGER_OCX" classid="clsid:'+classidx64+'"');
document.write('codebase="'+codebase64+'" OnMouseOut="setCopy()" width="100%" height="100%"> ');
function setCopy(){//鼠标移到控件外,开启系统的剪贴板,以方便其他程序使用
if(TANGER_OCX_OBJ.IsStrictNoCopy){
TANGER_OCX_OBJ.IsStrictNoCopy=false;
} */


}
else
{
//如果上面采取的是禁止复制的方法,那么这儿应该启动允许复制
if(TANGER_OCX_OBJ.IsStrictNoCopy){
TANGER_OCX_OBJ.IsStrictNoCopy=false;
}
}
}
}
</script>

注意:方案实施环境必须是有正确安装Office安全电子印章环境的客户端,在不具备安全电子印章环境的情况下印章实际是图片,此时是可以点选该图片通过右键菜单选择复制的,而正确安装了电子印章环境的客户端鼠标移动到印章上时会提示文档验证状态,不可能通过右键菜单上的复制将其复制然后粘贴到系统外。

针对此类需求,以上方案只考虑了通过快捷键方式拷贝的情况,而忽略了通过右键菜单操作的情况,以上方案虽已经达到要求,但是从用户体验角度来说并不是特别好,在选中含有印章的区域时依然可以点击右键菜单复制,但是却复制不出来,可能就会造成误解。针对此种情况还可以结合文档控件提供的OnWordBeforeRightClick事件进行处理(文档控件提供了很多事件以供用户方便地实现不同功能,详见开发接口文档)

参考代码:<!--OnWordBeforeRightClick(Selection, IsCancel) 该事件在WORD、WPS右键事件发生之前激活。-->
<script type="text/javascript" for= "TANGER_OCX" event = "OnWordBeforeRightClick(Selection, IsCancel)">
var selstart=Selection.start; //选择对象的start
var selend=Selection.end; //选择对象的end
var signstart; //印章描点的start
var signend; //印章描点的end
var shapes=TANGER_OCX_OBJ.ActiveDocument.Shapes; //获取文档中图片的对象
var count=shapes.Count; //获取文档中图片的数量
for(var i=1;i<=count;i++)
{
//如果图片的TYPE属性值不等于12,则说明只是普通图片对象
if (shapes(i).Type == 12)
{
signstart=shapes(i).Anchor.start; //获取印章描点的start
signend=shapes(i).Anchor.end; //印章描点的end
if(selstart<=signstart&&selend>=signend) //所选范围是否包含印章
{
//TANGER_OCX_OBJ.ActiveDocument.application.Selection.HomeKey(6,0); //移动到文档开始位置 用户自己选择的内容等于没选择上也就没办法复制了
//也可以替换为 控件提供的禁止复制的方法
//禁用整个系统的剪贴板,此时在鼠标移出控件时需要设置回来 可在加载控件的时候设置
//TANGER_OCX_OBJ.IsStrictNoCopy=true;
TANGER_OCX_OBJ.CancelWordRightClick=true;//取消右键菜单
}
/*else
{

//如果上面采取的是禁止复制的方法,那么这儿应该启动允许复制
if(TANGER_OCX_OBJ.IsStrictNoCopy){
TANGER_OCX_OBJ.IsStrictNoCopy=false;
}
}*/
}
}
</script>

参考示例:防止电子印章从系统拷贝出去.rar


返回页面顶部↑  
本文档的相关文档:

本文档没有相关文档