文档预览一直是一个问题,尤其是web网站,实现文档预览,淡然如果你付费第三方,当我没说。微软给的接口实现预览效果还可以,但是他又限制,就是ip不行,需要域名。这个就有点苦逼。你也可以自己搭建一个Office Online Server用来实现在线预览,不过需要两台服务器,一个转换器,一个域控服务器。当然一台也是可以的,你在服务器上搞个虚拟机应该也行。用winorm来实现文档预览,相对来说就简单很多,因为是客户端程序。只要用户电脑装Office或者WPSdsoframer.ocx基本就可以了。最简单的就是直接调用进程打开就没有问题。但是不能实现修改。这里说一下实现文档预览的插件dsoFramer.ocx插件。
这个插件用起来预览效果还可以,其实配置起来也是有点-麻烦了,首先用户电脑要注册这个插件,这个就有点烦,你能指望用户去自己注册,那基本可能,所以你需要通过程序自动帮助用户注册,注意注册分电脑64位和32位的。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace INet.OA.Biz.Common { public class DsoframerHelper { private static string dsoframerPath = (Directory.GetCurrentDirectory() + "/Plugins/dsoframer.ocx").Replace('/', '\\'); private static string sys32Path = @"c:\windows\System32\dsoframer.ocx";//32位系统存放dsoframer.ocx的目录 private static string sys64Path = @"c:\windows\SysWOW64\dsoframer.ocx";//64位系统存放dsoframer.ocx的目录 /// <summary> /// 判断ocx控件是否注册的 /// </summary> /// <param name="clsid"></param> /// <returns></returns> private static bool IsRegistered(string clsid) { String key = String.Format(@"CLSID\{{{0}}}", clsid); Microsoft.Win32.RegistryKey Regkey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(key);//获取注册key if (Regkey != null) { if (Regkey.OpenSubKey("InprocServer32").GetValue("") != null)//获取注册路径 return true; else return false; } else return false; } /// <summary> /// 执行cmd.exe /// </summary> /// <param name="cmdExe"></param> /// <param name="cmdPara"></param> private static void Cmd(string cmdExe, string cmdPara) { using (System.Diagnostics.Process myPro = new System.Diagnostics.Process()) { myPro.StartInfo.FileName = "cmd.exe"; myPro.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 myPro.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息 myPro.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 myPro.StartInfo.RedirectStandardError = true;//重定向标准错误输出 myPro.StartInfo.CreateNoWindow = true;//不显示程序窗口 myPro.StartInfo.Verb = "runas";//以管理员的身份打开 myPro.Start(); string strCmd = $@"{cmdExe} {cmdPara} &exit"; //这里使用 & 是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令 myPro.StandardInput.WriteLine(strCmd); myPro.StandardInput.AutoFlush = true; myPro.WaitForExit();//等待程序执行完退出进程 } } /// <summary> /// 判断dsoframer是否注册 /// </summary> /// <returns></returns> public static bool IsRegisteredDsoframer() { return IsRegistered("00460182-9E5E-11d5-B7C8-B8269041DD57"); } /// <summary> /// 注册dsoframer /// </summary> public static void RegisteredDsoframer() { if (!File.Exists(dsoframerPath)) return; //将dsoframer.ocx拷贝到系统目录 string sysPath = ""; if (Environment.Is64BitOperatingSystem) sysPath = sys64Path; else sysPath = sys32Path; if (!File.Exists(sysPath)) File.Copy(dsoframerPath, sysPath); Cmd("regsvr32.exe", sysPath); } /// <summary> /// 解注册dsoframer /// </summary> public static void UnRegisteredDsoframer() { Cmd("regsvr32.exe", $@" -u {dsoframerPath}"); } }
引入插件:注意:注册后才会有。
然后就是把插件拖拽到窗体中:
预览就很简单了:
axFramerControl_File.Open(Path, false, "Word.Document", "", "");
上面的path是要预览的文件的路径,当然如果要预览服务器上的文件,你可以下载到本地打开,如果修改的话,下载到本地打开修改后在上传的服务器上也可以。
axFramerControl_File.Titlebar = false;//是否显示标题栏 axFramerControl_File.Menubar = false;//是否显示的菜单栏 axFramerControl_File.Toolbars = false;//是否显示的工具栏
这三个是设置栏目的。
然后你回可以根据你自己的方式实现预览了。
看一下效果
标签:string,预览,System,myPro,ocx,文档,dsoframer,winform From: https://www.cnblogs.com/zpy1993-09/p/16972263.html