Dsoframer实现文档在线浏览功能

Dsoframer实现文档在线浏览的原理相对简单,相当于将office的桌面窗口嵌入了浏览器。但是微软发布的这个ActiveX插件很久不更新了,网上提供的下载大多是国内大牛改写的,版本不一。下面说下具体的实现吧,附件提供dsoframer的帮助文档。

1、在开发环境下注册dsoframer.ocx。

          DSOFramer.ocx复制到C:\windows\system32目录下,开始->运行->regsvr32 DSOFramer.ocx , 系统会提示DSOFramer.ocx中的DllRegisterServer成功。

    2、上传文档。

    网上上传文件的代码或者组件很多,大多集成在spring等框架下,在此就不上代码了,具体根据自己项目架构选择。但是需要说明的是,文档上传存在本地磁盘或者数据库都是可以的哦。

    3、文档展示。

    

//新建word
document.getElementById('oframe').CreateNew("Word.Document");
//打开本地文档
document.getElementById('oframe').Open("C:\\TestBook.xls");
//打开服务端代码
document.getElementById('oframe').Open(serverPath+"audsource/getdoc.do?documentId="+audsourceId, false,"Word.Document");
//保存文件至本地
document.getElementById('oframe').Save("c:\\1.doc",true);
//保存文件至服务器
document.getElementById('oframe').HttpInit();//初始化
document.getElementById('oframe').HttpAddPostString("audsourceId",info.audsourceId);//k-v形式传参
document.getElementById('oframe').HttpAddPostCurrFile("FileData","");//文件流
document.getElementById('oframe').HttpPost(webappName+'/audsource/updateDoc.do');//post提交


Dsoframer的帮助文档说明很详细,在此我也就不用做什么代码展示。但是根据自己使用过程中遇到的问题还是要为大家分享下的。

  • IE浏览器浏览时需要设置Internet选项。

    打开Internet选择——安全——添加受信任的站点

    打开Internet选择——安全——自定义级别——勾选对未标记为安全执行脚本的ActiveX控件初始化并执行

    如果勾选后安装不了dsoframer插件,那将其他ActiceX选项根据情况改为提示,安装插件并不是每台机器这样设置都可以成功安装,少数浏览器无论怎么设置都安装不上,始终提示由于安全问题被windows阻止。

  • 在编辑dsoframer打开的文档时,连续两次或多次编辑文档会导致IE浏览器奔溃,找不到解决的办法。

  • IE6浏览器无法再浏览器端注册dsoframer控件,需要按开发环境注册的方式去注册。

  • 嵌入页面的插件会存在页面遮挡的问题,需要注意放进div做显示隐藏的切换操作。

  • Dsoframer插件在线打开文档只是其基础功能,其提供word动态模板功能十分的强大,大家可以根据帮助文档试试。

Dsoframer用后给我的第一体会是:适合政府小用户群体。因为其稳定性较差不适合大用户量。其制作word动态模板以及红头文件的功能很适合政府等行政单位。如果实在需要用到在线对office文档的编辑、浏览、保存操作,可以考虑使用pageoffice插件作为替代,这是一款收费插件,兼容性稳定性都不错。


DSO(dsoframer)的接口文档

(开发环境)使用前先注册一下DSOFramer.ocx
   
操作:将DSOFramer.ocx复制到C:\windows\system32目录下,
        
开始->运行->regsvr32 DSOFramer.ocx , 系统会提示DSOFramer.ocx中的DllRegisterServer成功

DSO的接口文档

/*
1.
新建
*/
//
新建Word
document.all.FramerControl1.CreateNew("Word.Document");
//
新建Excel
document.all.FramerControl1.CreateNew("Excel.Sheet");
/*
2.
打开文件
*/
//
打开制定的本地文件
document.all.FramerControl1.Open("C:\\TestBook.xls");
//
制定用Word来打开c:\plain.txt文件
document.all.FramerControl1.Open("C:\\Plain.txt",false, "Word.Document");
//
打开服务器的文件
document.all.FramerControl1.Open "https://secureserver/test/mytest.asp?id=123",true, "Excel.Sheet", "MyUserAccount", "MyPassword");
//
打开服务器的文件
document.all.FramerControl1.Open("http://localhost/1.doc", true);
/*
3.
保存文件
*/
//
到本地
document.all.FramerControl1.Save("c:\\1.doc",true);
//
服务器  
/*
增加Http协议Post上传接口,可以Post一个动态页面(jsp,asp,php...),由动态页面负责解析数据
bool HttpInit();
bool HttpAddPostString(BSTR strName, BSTR strValue);
bool HttpAddPostCurrFile(BSTR strFileID, BSTR strFileName);
BSTR HttpPost(BSTR bstr);       
*/
//
初始化Http引擎
document.all.FramerControl1.HttpInit();
//
增加Post变量
document.all.FramerControl1.HttpAddPostString("RecordID","20060102200");
document.all.FramerControl1.HttpAddPostString("UserID","
李局长");
//
上传打开的文件
document.all.FramerControl1.HttpAddPostCurrFile("FileData", "
文档名.doc");
//
执行上传动作
document.all.FramerControl1.HttpPost("http://xxxx.com/uploadfile.asp");
/*
4.
修订留痕
*/
//
进入留痕状态
document.all.FramerControl1.SetTrackRevisions(1);
//
进入非留痕状态
document.all.FramerControl1.SetTrackRevisions(0);
//
接受当前修订
document.all.FramerControl1.SetTrackRevisions(4);
/*
5.
设置当前用户
*/
document.all.FramerControl1.SetCurrUserName("
张三");       
/*
6.
设置当前时间(笔迹留痕会显示("Like 2006:02:07 11:11:11")
*/
document.all.FramerControl1.SetCurrTime("2006:02:07 11:11:11");
/*
7.
设置和创建书签,此功能比较强大,设置书签数据、添加书签和添加红头文件就靠他了
SetFieldValue(BSTR strFieldName, BSTR strValue, BSTR strCmdOrSheetName)
strFieldName:
书签名
strValue
:要设置的值
strCmdOrSheetName

命令
::ADDMARK::   
添加BookMark
::DELMARK::         
删除这个BookMark
::GETMARK::   
定位到这个BookMark
::FILE::                        
插入的是文件
::JPG::       
插入的是图片
一般来说:WORD中书签是做好的,可以通过此接口把外界数据设置进书签中去。
*/
//
在当前WORD位置插入标签,标签名为"book1",数值为"test"
document.all.FramerControl1.SetFieldValue("book1","test","::ADDMARK::");
//
设置书签"Time",数值为"2006-03-16 22:22:22"
document.all.FramerControl1.SetFieldValue("Time","2006-03-16 22:22:22","");
//
在书签位置"hongtou",插入红头文件"http://222.222.222.222/hongtou1.doc" 这样,红头就自动插进去了
document.all.FramerControl1.SetFieldValue("hongtou","http://222.222.222.222/hongtou1.doc","::FILE::");
/*
8.
设置菜单显示情况
BOOL SetMenuDisplay(long lMenuFlag)
lMenuFlag
为以下数值的组合
#define MNU_NEW                         0x01
#define MNU_OPEN                        0x02
#define MNU_CLOSE                       0x04
#define MNU_SAVE                        0x08
#define MNU_SAVEAS                      0x16
#define MNU_PGSETUP                     0x64
#define MNU_PRINT                       0x256
#define MNU_PROPS                       0x32
#define MNU_PRINTPV                     0x126
*/
//
只有新建菜单可用
document.all.FramerControl1..SetMenuDisplay(1);
//
只有打开菜单可用
document.all.FramerControl1.SetMenuDisplay(2);
//
只有打开新建菜单可用
document.all.FramerControl1.SetMenuDisplay(3);
/*
9.
保护文档和解保护文档
lProOrUn:1:
保护文档;0:解除保护
lProType: 
    wdNoProtection = -1,
    wdAllowOnlyRevisions = 0,
    wdAllowOnlyComments = 1,
    wdAllowOnlyFormFields = 2
strProPWD:
密码
*/
//
完全保护文档,密码为"pwd"   
document.all.FramerControl1.ProtectDoc(1,1,"pwd");
//
解除文档保护                
document.all.FramerControl1.ProtectDoc(0,1,"pwd");
/*
10.
显示或隐藏修订内容
ShowRevisions(long nNewValue)
nNewValue = 0
则隐藏修订
          = 1
则显示修订
*/
//
显示修订留痕
document.all.FramerControl1.ShowRevisions(1);
//
隐藏修订留痕
document.all.FramerControl1.ShowRevisions(0);
/*
11.
插入合并文件,
strFieldPath
文件路径,可以是http,ftp的路径
pPos = 0 //
当前鼠标位置
1;
文件开头
2;
文件末尾
pPos
的第4位为1的时候,代表插入的是图片
InSertFile(BSTR strFieldPath, long lPos)
*/
//
文件头部插入文件
document.all.FramerControl1.InSertFile("http://XX.com/XX.doc",1);
//
文件尾部插入文件
document.all.FramerControl1.InSertFile("http://XX.com/XX.doc",2);
//
当前光标位置插入文件
document.all.FramerControl1.InSertFile("http://XX.com/XX.doc",0);
//
文件头部插入图片
document.all.FramerControl1.InSertFile("http://XX.com/XX.jpg",9);
//
文件尾部插入图片
document.all.FramerControl1.InSertFile("http://XX.com/XX.jpg",10);
//
当前光标位置插入图片
document.all.FramerControl1.InSertFile("http://XX.com/XX.jpg",8);
/*
0x31.
文档另存为
                HRESULT SaveAs([in] VARIANT strFileName, [in] VARIANT dwFileFormat, [out,retval] long* pbool);       
参数:
        strFileName
:文件本地路径,如c:\\11.doc
        dwFileFormat:
文件格式
dwFileFormat
的数值为:
Excel: Type
enum XlFileFormat
{
    xlAddIn = 18,
    xlCSV = 6,
    xlCSVMac = 22,
    xlCSVMSDOS = 24,
    xlCSVWindows = 23,
    xlDBF2 = 7,
    xlDBF3 = 8,
    xlDBF4 = 11,
    xlDIF = 9,
    xlExcel2 = 16,
    xlExcel2FarEast = 27,
    xlExcel3 = 29,
    xlExcel4 = 33,
    xlExcel5 = 39,
    xlExcel7 = 39,
    xlExcel9795 = 43,
    xlExcel4Workbook = 35,
    xlIntlAddIn = 26,
    xlIntlMacro = 25,
    xlWorkbookNormal = -4143,
    xlSYLK = 2,
    xlTemplate = 17,
    xlCurrentPlatformText = -4158,
    xlTextMac = 19,
    xlTextMSDOS = 21,
    xlTextPrinter = 36,
    xlTextWindows = 20,
    xlWJ2WD1 = 14,
    xlWK1 = 5,
    xlWK1ALL = 31,
    xlWK1FMT = 30,
    xlWK3 = 15,
    xlWK4 = 38,
    xlWK3FM3 = 32,
    xlWKS = 4,
    xlWorks2FarEast = 28,
    xlWQ1 = 34,
    xlWJ3 = 40,
    xlWJ3FJ3 = 41,
    xlUnicodeText = 42,
    xlHtml = 44
};
Word: Type
enum WdSaveFormat
{
    wdFormatDocument = 0,
    wdFormatTemplate = 1,
    wdFormatText = 2,
    wdFormatTextLineBreaks = 3,
    wdFormatDOSText = 4,
    wdFormatDOSTextLineBreaks = 5,
    wdFormatRTF = 6,
    wdFormatUnicodeText = 7,
    wdFormatEncodedText = 7,
    wdFormatHTML = 8
};
PPT:
enum PpSaveAsFileType
{
    ppSaveAsPresentation = 1,
    ppSaveAsPowerPoint7 = 2,
    ppSaveAsPowerPoint4 = 3,
    ppSaveAsPowerPoint3 = 4,
    ppSaveAsTemplate = 5,
    ppSaveAsRTF = 6,
    ppSaveAsShow = 7,
    ppSaveAsAddIn = 8,
    ppSaveAsPowerPoint4FarEast = 10,
    ppSaveAsDefault = 11,
    ppSaveAsHTML = 12,
    ppSaveAsHTMLv3 = 13,
    ppSaveAsHTMLDual = 14,
    ppSaveAsMetaFile = 15,
    ppSaveAsGIF = 16,
    ppSaveAsJPG = 17,
    ppSaveAsPNG = 18,
    ppSaveAsBMP = 19
};
*/
/*
0x32.
删除本地文件
                        HRESULT DeleteLocalFile([in] BSTR strFilePath);       
参数:
        strFileName
:文件本地路径,如c:\\11.doc                       
*/               
/*
0x33.
创建临时文件
                HRESULT GetTempFilePath([out,retval] BSTR* strValue);       
返回:
   
临时文件的路径地址。使用完后,用DeleteLocalFile 删除
*/
/*
0x34.
设置文档显示模式
                HRESULT ShowView([in] long dwViewType, [out,retval] long * pbool);       
dwViewType
的可取值为:
enum WdViewType
{
    wdNormalView = 1,
    wdOutlineView = 2,
    wdPrintView = 3,
    wdPrintPreview = 4,
    wdMasterView = 5, //
这个是大纲
    wdWebView = 6
};
*/
//
大纲模式
document.all.FramerControl1.ShowView(5);
/*
0x39:
下载远程文件
                HRESULT DownloadFile( [in] BSTR strRemoteFile, [in] BSTR strLocalFile, [out,retval]  BSTR* strValue);       
参数:
         strRemoteFile
:远程路径地址,http or Ftp
         strLocalFile:
本地保存地址,if strLocalFile == NULL then Create Temp File and return TempFile's Path
*/
/*
0x40
:增加Http上传时候的,附加其他文件
                HRESULT HttpAddPostFile([in] BSTR strFileID, [in]  BSTR strFileName, [out,retval] long* pbool);
参数:
         strFileID
:文件的ID,供服务器端页面解析
         strFileName:
本地文件地址
*/
/*
0x41,0x42.
获取详细的修订信息。
   GetRevCount( [out,retval] long * pbool);
   GetRevInfo([in] long lIndex, [in]  long lType, [out,retval] BSTR* pbool);
  
例子如下
*/
var vCount;
vCount = document.all.FramerControl1.GetRevCount();
alert(vCount);
var vOpt = 0;
var vDate;
for(var i=1; i<= vCount; i++){
        vOpt = document.all.FramerControl1.GetRevInfo(i,2);
        if("1" == vOpt){
                vOpt = "
插入";
        }else if("2" == vOpt){
                vOpt = "
删除";
        }else{
                vOpt = "
未知操作";
        }
        vDate = new String(document.all.FramerControl1.GetRevInfo(i,1));
        vDate = parseFloat(vDate);
        alert(vDate);
        dateObj = new Date(vDate);
  alert(dateObj.getYear()   + "
" + dateObj.getMonth() + 1 + "" + dateObj.getDate() +"" +  dateObj.getHours() +"" +  dateObj.getMinutes() +"" +  dateObj.getSeconds() +"" );
        alert("
用户:"+document.all.FramerControl1.GetRevInfo(i,0) + "\r\n操作:" + vOpt + "\r\n内容:" + document.all.FramerControl1.GetRevInfo(i,3));
}
/*
0x43.
设置基本信息:
                HRESULT SetValue([in] BSTR strValue, [in]  BSTR strName, [out,retval] long* pbool);
1.
设置文件只读密码
        SetValue("password","::DOCPROP:PassWord");
2.
设置文件修改密码
        SetValue("password","::DOCPROP:WritePW");
返回值:
0
正确
-1
:不支持此命令,请确定您的第二个参数没有传错
-127:
异常
*/
//
设置文件只读密码
document.all.FramerControl1.SetValue("password","::DOCPROP:PassWord");
//
设置文件修改密码
document.all.FramerControl1.SetValue("password","::DOCPROP:WritePW");
/*
0x44.
设置文档变量,这个很少能用到
                HRESULT SetDocVariable([in] BSTR strVarName, [in]  BSTR strValue,[in] long lOpt, [out,retval] long* pbool);
strVarName:
变量名
strVlaue:
变量值
lOpt:
操作类型,
按位
第一位为1:  表示update域关联的
第二位为1:  表示如果没有这个变量则添加
第三位为1:  未来支持
return:
0:OK
-127:
异常
*/
/*
0x45:
分页保存
HRESULT SetPageAs([in] BSTR strLocalFile, [in]  long lPageNum, [in]  long lType,[out,retval] long* pbool);
strLocalFile
:本地路径
lPageNum
:页数

 



转载于:https://my.oschina.net/u/872813/blog/189911

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值