首页 > 其他分享 >winform 实现文档预览。

winform 实现文档预览。

时间:2022-12-10 20:46:25浏览次数:44  
标签:string 预览 System myPro ocx 文档 dsoframer winform

    文档预览一直是一个问题,尤其是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

相关文章

  • API接口文档实例
    接口描述获取接口统一鉴权码token接口,此接口调用需要appid凭证和secret密钥,每个微信只有一对请求URLhttps://api.weixin.qq.com/cgi-bin/token?grant_type=client_cr......
  • SpringBoot整合Swagger2在线文档
    SpringBoot整合Swagger2在线文档一什么是swagger?我们前面有讲到说开发时会创建Restful风格的API接口,供第三方或前端人员使用,那么前端人员在使用的过程中怎么知道有......
  • Springboot整合Swagger2在线文档
    SpringBoot整合Swagger2在线文档一什么是swagger?我们前面有讲到说开发时会创建Restful风格的API接口,供第三方或前端人员使用,那么前端人员在使用的过程中怎么知道有哪些接口......
  • 文档测试
    001.文档测试下面是测试的,无需理会。代码块测试测试数学公式\(E=mc^2\)图表测试类图@startumlskinparambackgroundcolortransparent!includehttps://unpkg.c......
  • WinForm(三)揭开可视化控件的面纱
    WinForm所见即所得的UI设计框架,开发效率确实有所提升,同时降低了编程门槛,让WinForm更普及。拖拖拽拽就能设计出一个界面,那么我们拖拽的这些东西是什么?它们是什么原理?。......
  • WinForm(一):开始一个WinForm程序
    WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。用VisualStudio创建一个WinForm应用很简单,建议使用非.......
  • WinForm(二):WinFrom中Main函数的入参和出参
    基本上有独立进程的应用,都是以Main函数作为入口,开始运行的。在C#中,Main函数可以无参无返回值,当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。......
  • WinForm(二):WinFrom中Main函数的入参和出参
    基本上有独立进程的应用,都是以Main函数作为入口,开始运行的。在C#中,Main函数可以无参无返回值,当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。......
  • WinForm(三)揭开可视化控件的面纱
    WinForm所见即所得的UI设计框架,开发效率确实有所提升,同时降低了编程门槛,让WinForm更普及。拖拖拽拽就能设计出一个界面,那么我们拖拽的这些东西是什么?它们是什么原理?。......
  • WinForm(二):WinFrom中Main函数的入参和出参
    基本上有独立进程的应用,都是以Main函数作为入口,开始运行的。在C#中,Main函数可以无参无返回值,当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。......