售楼系统售楼合同采取了word模板套打方式,调用dsoframer微软提供的第三方在线编辑word控件。已有“销售合同”中支持文本域填充,使用模板.xml获取值,然后再PrintContract.aspx页面js加载数据。
页面中创建dsoframerActiveX对象,然后再页面获取到这个对象,打开模板文档,找到书签赋值。
这次技术验证是在套打合同中加入户型图的打印,系统已有的代码中没有使用到word动态获取图片的方法,网上搜索了很久,尝试了下面几个方案:
1. word模板中添加“图像Activex”,然后再js加载数据在wordobj中找到这个控件,但是该image控件没有src直接属性,属性picture需要vb后台loadPicture(读取图片文件流到内存)来赋值,js实现不了。此方法行不通。
2. 在1基础上对该“图像Activex”,再增加户型图地址文本域(需要物理地址),然后绑定“图像Activex”点击事件,加载图片。但是前台找到该控件,但是没有click方法,obj.click()无效。此方法无效。
后来平台组同事提供NTKO控件帮助文档来做参考,通过word中添加图片录制宏,编辑宏,可以看到添加图片的代码,然后仿效添加到前台。
3. 录制宏添加图片获取相关代码,移植到前台js写法;
Selection.InlineShapes.AddPicture(sImgUrl, false,true,wordobj.ActiveDocument.Application.Selection.Range);
后来在平台同事帮忙下,可以在word第一页,第一行添加图片。
已能实现添加图片。
但是销售合同中户型图是有一定位置的,现在要解决能在指定位置添加图片。
4. 所有NTKO,获得在书签位置插入的图片,找到有效代码。
先找到对应书签,然后再书签后插入图片。
//页面加载
function onWindowLoad() {
//4. 获得在书签位置插入的图片:
//wordobj 为 js Object Activex 对象(objectid=*****.***)
var wordobj = document.getElementById("dsoframer1");
var remark = "HuXingPicture";
if(wordobj.ActiveDocument.BookMarks.Exists(remark)){//判断是否存在该书签
var picrange = wordobj.ActiveDocument.BookMarks(remark);//获得插入图片处的书签位置
if(picrange !=null){ //判读是否在该书签位置插入图片
picrange.Select(); //选中书签的位置
var selection = wordobj.ActiveDocument.Application.Selection; //获得刚选中的书签的位置
var sImgUrl = "C:\\Users\\zhangzx\\Pictures\\2B.jpg";
wordobj.ActiveDocument.Application.Selection.InlineShapes.AddPicture(sImgUrl, false, true,wordobj.ActiveDocument.Application.Selection.Range);
}
}
}
//如何word添加文本域或者图片Activex,word-选项-自定义选项,勾上开发工具