欢迎使用优快云-markdown编辑器

SharePoint-App-PreviewMarkdown:一个简单的 SharePoint 2013 应用程序,用于预览文档库中的 Markdown 文件 SharePoint 应用程序预览Markdown 一个简单的 SharePoint 2013 应用程序,用于预览文档库中的 Markdown 文件。 用法 在 Visual Studio 中打开它,并将其部署到 SharePoint Online 或本地 SharePoint。 默认情况下,目标 SharePoint 版本为SharePoint Online ,您可以在项目属性中将Target SharePoint Version设置更改为SharePoint 2013 。 将 Markdown 文件上传到文档库,然后单击菜单项中的“预览”。 执照 麻省理工学院。 立即下载

首先需要安装office web apps,具体安装过程我是参照下面这篇博客完成的
Office Web Apps安装部署,安装完成后访问 http://officewebapps.pepper.cn/hosting/discovery,这里的officewebapps.pepper.cn为office web apps 服务器的域名,也可以使用 ip地址,如 192.168.1.54.成功之后会看到如下文件:
XML说明文件

接下来就是与自己的项目整合,首先需要了解WOPI协议(Web Application Open Platform Interface),

WOPI协议提供一系列基于web方式的,使文档能在Office Web Apps中查看与编辑的接口服务(Web Service)。只要web应用按照标准,实现了WOPI的接口,那么就可以调用Office Web Apps。例子很多,比如SharePoint,Exchange,SkyDriver,Dropbox集成Office Web Apps。如果我们自己做的web应用实现了相应接口,就可以调用Office Web Apps,从而实现文档的在线编辑查看。 在WOPI结构中,我们把存放Office文档的web应用叫WOPI Host或者WOPI Server。把查看编辑操作Office文档的web应用叫WOPI Client或者叫WOPI applications。所以,Office Web Apps充当的就是WOPI Client的角色。sharePoint,Exchange,自己开发的系统充当的就是WOPI Server的角色。

下图为浏览器,server,client三者的请求顺序及关系:
浏览器,server,client三者的请求顺序及关系

与office web app 集成,我们需要提供两个服务

  • checkFileInfo服务
  • getFile服务

下面看下这两个服务:

1. checkFileInfo 服务:此服务返回的是请求文件的基本信息,WOPI Server(我们自己的系统)以json方式返回给WOPI Client(office web apps),服务的url格式为:

http://server/wopi/files/{filename}?access_token=token
如下示例:
http://localhost:8080/MyOWA/wopi/files/test.docx?access_token=token
这里的filename是你需要预览的文件名称,access_token是WOPI Client请求WOPI Server 时自动加上的。访问成功返回如下json数据格式:
` {
“AllowExternalMarketplace”: true,
“AllowOAuthOverHttp”: true,
“BaseFileName”: “hello.docx”,//文件名
“OwnerId”: “admin”,//文件所有者的唯一编号
“SHA256”: “0e258391262b515b878a8d0ccb78784ad3223ce219287e7df9b3f03c0c457ee9”,
“Size”: 11644,//文件大小,以bytes为单位
“Version”: 1477191374718//文件版本号,文件如果被编辑,版本号也要跟着改变
}
““
Json中至少要包括五个属性:BaseFileName, OwnerId, Size, SHA256, 和 Version,
点击查看更多参数说明

2. GetFile服务:此服务返回的是请求文件的内容,WOPI Server以数据流的方式返回给WOPI Client.服务URl格式一般为

http://server/wopi/files/{filename}/contents?access_token=token
如下示例:
http://localhost:8080/MyOWA/wopi/files/test.docx/contents?access_token=token

package cn.com.officeWebApp.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;

import cn.com.instai.officeWebApp.helper.SHA256Util;
import cn.com.instai.officeWebApp.model.FileModel;
import cn.com.instai.officeWebApp.model.OWAModel;

@Controller
@RequestMapping(value = "wopi")
public class OWAController {

    private static final Logger logger = Logger.getLogger(OWAController.class);

    public static final String OWA_XML = "http://192.168.1.60/hosting/discovery";

    /**
     * 获取文件信息
     * @Description 
     * @author niepei
     * @param request
     * @param response
     * @param filename
     * @param access_token
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "deprecation" })
    @RequestMapping(value = "files/{filename}", method = RequestMethod.GET)
    public  ModelAndView checkFileInfo(HttpServletRequest request, HttpServletResponse response,@PathVariable("filename") String filename/*, @RequestParam("access_token") String access_token*/)throws Exception {
        logger.debug("------------------------------->  checkFileInfo  has   end  ");
        String jsonStr = null;
        OWAModel model = new OWAModel();
        String reqUrl = request.getRequestURL().toString();
        filename = reqUrl.substring(reqUrl.lastIndexOf("/"));
        String filePath = request.getRealPath("template/"+filename);
        logger.debug("------------------------------->  filePath  is " + filePath );
        File file = new File(filePath);
        if (file.exists()) {
            model.setBaseFileName(file.getName());
            model.setSize(file.length());
            model.setOwnerId("admin");
            model.setSHA256(SHA256Util.getFileSHA256(filePath));
            model.setVersion(file.lastModified());
            model.setAllowExternalMarketplace(true);
            model.setAllowOAuthOverHttp(true);
        }
        jsonStr = JSON.toJSONString(model);
        PrintWriter out = response.getWriter();
        response.setCharacterEncoding("UTF-8"); 
        response.setContentType("application/json;charset=UTF-8");
        out.write(jsonStr);
        logger.debug("------------------------------->  checkFileInfo has   end  ");
        return null;

    }


    /**
     * 获取文件流
     * @Description 
     * @author niepei
     * @param request
     * @param response
     * @param filename
     * @param access_token
     * @return
     * @throws IOException
     */
    @SuppressWarnings("deprecation")
    @RequestMapping(value = "files/{filename}/contents", method = RequestMethod.GET)
    public HttpServletResponse  getFile(HttpServletRequest request, HttpServletResponse response,@PathVariable("filename") String filename/*, @RequestParam("access_token") String access_token*/)throws IOException {
        logger.debug("------------------------------->  getFile   has  begin");
        filename = request.getRealPath("template/"+filename);
        File file = new File(filename);
        String name = file.getName();
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
        byte[] buffer = new byte[is.available()];
        is.read(buffer);
        is.close();
        response.reset();
        // 设置response的Header
        response.addHeader("Content-Disposition","attachment;filename=" + new String(name.getBytes("utf-8"), "ISO-8859-1"));
        response.addHeader("Content-Length", "" + file.length());
        response.setContentType("application/octet-stream");
        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
        toClient.write(buffer);
        toClient.flush();
        toClient.close();
        logger.debug("------------------------------->  getFile   has   end  ");
        return response;

    }


    @SuppressWarnings("deprecation")
    @RequestMapping(value="test",method = RequestMethod.POST)
    public ModelAndView test(@RequestBody FileModel file){
        logger.debug("------------------------------->  test  has   end  ");
        String URL = "";
        String filename = file.getFilename();
        String ext = filename.substring(filename.lastIndexOf("."));
        if(ext.indexOf("do")>0){
            URL = "http://officewebapps.instai.cn/wv/wordviewerframe.aspx?WOPISrc=FILE_PATH";
        }else if(ext.indexOf("xl")>0){
            URL = "http://officewebapps.instai.cn/x/_layouts/xlviewerinternal.aspx?WOPISrc=FILE_PATH";
        }else if(ext.indexOf("pp")>0){
            URL = "http://officewebapps.instai.cn/p/PowerPointFrame.aspx?WOPISrc=FILE_PATH";
        }
        String filePath = URLEncoder.encode("http://localhost:8080/InstaiEduAi/wopi/files/"+filename);
        URL = URL.replace("FILE_PATH", filePath);
        logger.debug("URL ------------------> " + URL);
        ModelAndView mav = new ModelAndView("redirect:" + URL);
        logger.debug("------------------------------->  test  has   end  ");
        return mav;     
    }

}
地心地固坐标系与北天东坐标系的转换 经过这一步旋转,x3轴和y3轴就处在过O3点的经度线所在的平面了,而且z3轴指向了东。将图3的坐标系旋转成图2的样子。这里需要多次旋转,每次以某个轴为对称轴进行旋转,对应的坐标变换参考。的原点在地心,Z轴指向北极点,X轴指向本初子午线与赤道的交点,Y轴指向符合右手定则,如下图所示。下面实现地心地固坐标系到北天东坐标系的转换,问题描述为:设一点。以y1轴为对称轴,顺时针旋转90°,得到图4的样子。,X轴指向北,Y轴指向天,Z轴指向东,如下图所示。因此,北天东坐标下的坐标为。点在图3坐标系下的坐标。 阅读详情

相关推荐

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2216

markdown 文档转 word

前言 使用 Typora 编辑 md 文档,有时候需要给同事 word 文档,可以安装 pandoc。 下载地址 https://github.com/jgm/pandoc/releases 检查是否安装成功 安装完毕后可以使用如下命令,检测是否安装成功。 pandoc --version 导出 ...

王坦的博客 826

uniapp无感刷新token实现过程

可以看到已经触发了刷新token接口,并且重新请求上次失败的列表接口,无感刷新token逻辑已经正常,但为什么列表接口请求成功,还一直loading没关闭捏,就是因为后续代码未执行,await接口的返回没有成功resolve。路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token,但在过程中发现一个问题就是。3、排查await的列表接口为何没有成功resolve。

weixin_40618068的博客 3594

MarketDown语法指南

https://blog.csdn.net/CarryNet/article/details/88595554

oayoat blog 1691

C# 调用halcon中visualize_object_model_3d显示点云

3.1 判断线程是否为空,如果为空,则新创建,如果不为空,则中断线程,清空窗口后再次执行创建操作3.2 创建:调用show()方法实例化显示类的对象,传入显示参数,将线程testvisual 绑定 在 类对象的action方法上(此处action方法内部,只调用了visualize_object_model_3d算子)3.3 启动线程。

weixin_42362219的博客 1403

【FPGA】AD9694调试注意事项

基于FPGA的AD9694设计及其注意事项,包括同步的设计注意事项

weixin_41246509的博客 2904

html 实现sqlpad那样的编辑器_推荐几款好用的markdown编辑器

Markdown编辑器Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了。Markdown编辑器使用一套格式标记语言来对文档内容进行排版和格式显示。而Markdown的标记很少,常用的也就十个左右,它是一种非常轻量的标记语言。Markdown编辑器深受技术人员的喜爱,Markdown可以用来编写说明文档,用它写...

weixin_39621178的博客 1409

使用cmd命令查看电脑是不是翻新机 如何查看自己电脑是不是翻新机

最近pdd啥的百亿补贴啊,什么品牌店啊,很多“假一赔十”,绝对“正品”都蹦出来了,很多人拿到以后,也上网查了各种鉴别方式,包括区分是不是翻新机之类的。本人亲自踩坑“pdd品牌店”,“假一赔十”,“绝对正品”等店铺,跟大家分享一下我得鉴别经验(说道分享鉴别经验了,大家也就不用好奇了,我肯定是买到翻新机了,mmp)。 第一步:准备好手机,开始录屏,没有完整的拆箱视频,可能不容易退货退款 第二步:拆箱,查看屏幕划痕(用手机闪光灯看,要不然看不清),然后查看屏幕有没有被擦过的痕迹 第三步:查看USB孔等插口有没有划

weixin_39417324的博客 1万+

markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

超级无敌美丽的艳 1298

14 Prompt 的边界:什么时候必须用 RAG 或微调

Prompt 不是万能解法。本文用“改输入、补知识、改模型”这条主线,讲清什么时候继续优化 Prompt,什么时候必须引入 RAG、工具调用或微调,帮助你避免用重技术掩盖轻问题。

老于的笔记的专栏 209

用Python爬取政府采购信息的实战全流程

以 Playwright 自动采集政府采购信息结构化存储与查询可拓展关键词过滤与通知机制。

2201_76125261的博客 1146

几款主流好用的 Markdown 编辑器,值得拥有

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-oXQ1OCnC-1712894857964)][外链图片转存中…(img-BqnMgz7C-1712894857964)]一个人可以走的很快,但一群人才能走的更远。

2401_83977626的博客 5254

智能车图像处理12-进阶篇4--环岛辅助判断条件

主函数: 第6行: 含义是当前需要不在坡道和车库状态 第11-12行 : 寻找一下环岛的双断点(在辅助函数中) 第16-66行: 当左右线的方差满足一边很大,一边很小时,truepianfangflag /truepianfangflagforleft 置1,在环岛的判断中使用。 辅助函数: 双断点函数(左与右相似,以做为例): 第13-28行: 第一处断点 第29-40行: 第一处断点后 连续边线 第41-52行: 第一处连续后,第二处断点 第53-64行: 第二处断点后,第二处

taiyuezyh的博客 1万+

欢迎使用优快云-markdown编辑器111

11

cpongo5 281

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Pepper_7
博客等级 码龄11年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值