精华内容
下载资源
问答
  • 向文档列表视图和子面板添加文档预览弹出窗口 执照: 在 MIT 许可下分发。
  • 在线文档预览

    2018-04-20 17:49:16
    在线常用的文档预览,常见的格式有office相关文档,PDF;图片和文字就不说了;PDF也比较简单,可以在客户端网页中直接查看;这里比较有难点的是office相关文档的在线预览;office文档中,最有难度的是powerpoint的...

    在线常用的文档预览,常见的格式有office相关文档,PDF;图片和文字就不说了;

    PDF也比较简单,可以在客户端网页中直接查看;


    这里比较有难点的是office相关文档的在线预览;

    office文档中,最有难度的是powerpoint的在线预览;因为ppt中的动画不好处理;


    说一下常用的在线预览方式:

    方法一:

    用微软的office online web之类的解决方案;最靠谱,效果和开发周期比较合适;


    方法二:

    将office文档转为图片,然后添加到web中预览显示;

    难度较小;


    方法三:

    服务器将相关的文档转换为PDF,office可以通过openoffice的方法转PDF,然后客户端web浏览;

    但是ppt中的动画就不可用;


    方法四:

    还有转为flash的,但是目前Adobe不维护了,还是不考虑了;而且很麻烦;


    方法五:

    有一些公司专门做office to HTML,或者PowerPoint to HTML5 之类的,可以购买SDK相关开发;

    但是效果依然一般,很多解析不够准确;可以跨平台,支持多种浏览器;

    而且有些还需要限制为IE浏览器需要安装ActiveX;


    方法六ÿ

    展开全文
  • iOS 文档预览功能

    千次阅读 2015-04-14 14:52:32
    在我们的app中可能会涉及到doc,docx,pdf,xls等格式的文档预览,或者调用第三方app打开文档的功能。如果不是严格要求,使用UIWebView打开是一种最为简单快捷的方式(具体方法很简单,在此就不多做说明)。下面说的是...
    • 在我们的app中可能会涉及到doc,docx,pdf,xls等格式的文档预览,或者调用第三方app打开文档的功能。如果不是严格要求,使用UIWebView打开是一种最为简单快捷的方式(具体方法很简单,在此就不多做说明)。下面说的是如何使用iOS自带的文档预览功能。

    UIDocumentInteractionController

    UIDocumentInteractionController是iOS 很早就出来的一个功能。但由于平时很少用到,自然也就不知道这个功能,从而忽略了一个功能强大的”文档阅读器”。

    UIDocumentInteractionController主要由两个功能,一个是在自己的app里预览文档,另一个就是调用iPhone里第三方相关的app打开文档。
    上代码:

    *使用UIDocumentInteractionController不需要其他的依赖库,所以只要项目有UIKit库就可以了,在需要的类里需要引入
    #import <UIKit/UIKit.h>
    1、声明对象

    当前视图要准守 UIDocumentInteractionControllerDelegate 协议
    
    UIDocumentInteractionController *documentInteraction;
    
    如果你用@propoty 要使用强引用。

    2、实例化对象、 传入文档地址

    #读取目标文档路径
    filePathStr = [[NSBundle mainBundle]pathForResource@"mypdf" ofType:@"pdf"];
    
    #实例化并传入文档URL
    documentInteraction = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePathStr]];
    
    
    #设置代理
    
    documentInteraction.delegate = self;
    
    
    #提前跟编译器说好,我一会要模态跳转该controller
    
    [documentInteraction presentPreviewAnimated:YES];

    前面这些基本步骤是预览和调用第三方都需要的前奏。
    下面是实现功能( 开始了… 不要激动…)

    /*
    必须实现的代理方法 预览窗口以模态窗口的形式显示,因此需要在该方法中返回一个view controller ,作为预览窗口的父窗口。如果你不实现该方法,或者在该方法中返回 nil,或者你返回的 view controller 无法呈现模式窗口,则该预览窗口不会显示。
    */
    - (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    
        return self;
    }
    
    
    /*
    可选的2个代理方法 (主要是调整预览视图弹出时候的动画效果,如果不实现,视图从底部推出)
    */
    - (UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller
    {
        return self.view;
    }
    - (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller
    {
    
        return self.view.frame;
    }

    运行结果如图:
    这里写图片描述

    点击左上角的Done退出预览,回到当前页面。右上角的图片,点击可出现发送邮件,赋值,打印等一些功能。(这个可比web功能强大多了吧)。

    下面该说调用第三方app打开文档了。
    ps:与平时app的相互调用不同,使用UIDocumentInteractionController不需要知道第三方app的URL Scheme信息。它会自动检测能打开(准确说是操作)它的app。具体原理是这些app在发布时都是进行URl Scheme的相关设置,意图在于告知其他app我有处理文档的功能。(如何让自己的app能被调用去打开其他app的文档请参考:http://blog.csdn.net/kmyhy/article/details/9064089

    上代码:
    其实就一句话,把
    [_documentInteraction presentPreviewAnimated:YES];这句替换为下面这句就好了

    [documentInteraction presentOpenInMenuFromRect:self.view.bounds nView:self.view animated:YES];

    QLPreviewController

    QLPreviewController是iOS 4之后引入的类,属于QuickLook.frameworks。
    1、引入依赖库
    QuickLook.framework

    添加头文件 #import <QuickLook/QuickLook.h>

    准守两个协议
    QLPreviewControllerDataSource
    QLPreviewControllerDelegate

    2、创建对象
    与UIDocumentInteractionController不同,QLPreviewController不是使用类方法创建的

    self.review=[[QLPreviewController alloc]init];
    
    //设置dataSource和delegate
    review.dataSource=self;
    review.delegate=self;  
    
    //设置该controller的title              review.title=self.currentChance.fileName;

    通过模态展示QLPreviewController

    [self presentViewController:review animated:YES

    其中必须实现的代理方法为

    //返回在预览导航单里面显示了文档的列表个数
    -(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{
        return 1;
    }
    
    //返回文档的路径
     - (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{
        return [NSURL fileURLWithPath:filePath];
    }

    可选的代理方法有:

    //QLPreviewController将要消失
    - (void)previewControllerWillDismiss:(QLPreviewController *)controller;
    
    //QLPreviewController已经消失
    - (void)previewControllerDidDismiss:(QLPreviewController *)controller;
    
    //当你的文档里面含有链接的时候,点击链接会调用该方法,默认返回YES, 如果设置为NO,该链接将不会被打开。
    - (BOOL)previewController:(QLPreviewController *)controller shouldOpenURL:(NSURL *)url forPreviewItem:(id <QLPreviewItem>)item;

    注意事项:txt格式用预览打开会出现乱码的情况,此时需要进行处理

    处理乱码的方法

    - (void)transformEncodingFromFilePath:(NSString *)filePath{
        //调用上述转码方法获取正常字符串
        NSString *body = [self examineTheFilePathStr:filePath];
        //转换为二进制
        NSData *data = [body dataUsingEncoding:NSUTF16StringEncoding];
        //覆盖原来的文件
        [data writeToFile:filePath atomically:YES];
        //此时在读取该文件,就是正常格式啦
    }

    另外补充一下webView处理乱码的方法

    - (NSString *)examineTheFilePathStr:(NSString *)str{
        NSStringEncoding *useEncodeing = nil;
        //带编码头的如utf-8等,这里会识别出来
        NSString *body = [NSString stringWithContentsOfFile:str usedEncoding:useEncodeing error:nil];
        //识别不到,按GBK编码再解码一次.这里不能先按GB18030解码,否则会出现整个文档无换行bug
        if (!body) {
            body = [NSString stringWithContentsOfFile:str encoding:0x80000632 error:nil];
        }
        //还是识别不到,按GB18030编码再解码一次.
        if (!body) {
            body = [NSString stringWithContentsOfFile:str encoding:0x80000631 error:nil];
        }
    
        return body;//有值代表需要转换  为空表示不需要转换
    }
    if(body){
            [self.webView loadHTMLString:body baseURL: nil];
        }else{
            NSURL *filePathUrl = [NSURL fileURLWithPath:self.filePathStr];
          //  NSLog(@"%@",self.filePathStr);
            NSURLRequest *request = [NSURLRequest requestWithURL:filePathUrl];
            [self.webView loadRequest:request];
        }
    展开全文
  • Unity 预览窗口

    万次阅读 2017-04-28 21:49:17
    在 Unity 编辑器界面上可以看到除了 Game 视图、Scene 视图,其他的视图也会出现绘制三维物体的地方,比如检视器的预览窗口,当选中网格时,会对网格进行预览。

    预览窗口

    在 Unity 编辑器界面上可以看到除了 Game 视图、Scene 视图,其他的视图也会出现绘制三维物体的地方,比如检视器的预览窗口,当选中网格时,会对网格进行预览,如下所示:

    绘制的方法都是使用 UnityEditor 未公开文档的PreviewRenderUtility类来进行的。

    检视器预览窗口

    资产或脚本实现预览窗口可参考Editor类的文档说明,重载带有 Preview 关键字的接口。

    开启预览功能

    默认脚本对象的检视器窗口是没有预览窗口的,如下所示:

    想要开启预览窗口,那么得创建自己的检视器窗口类,然后重载 HasPreviewGUI 接口,完整代码如下:

    using UnityEngine;
    
    public class PreviewExample : MonoBehaviour {
    }
    
    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(PreviewExample))]
    public class PreviewExampleInspector : Editor {
        public override bool HasPreviewGUI()
        {
            return true;
        }
    }
    

    可以看到有黑色的预览窗口了,如下所示:

    标题栏绘制

    默认显示的是物体的名称,重载 GetPreviewTitle 接口可以更改标题名称:

        public override GUIContent GetPreviewTitle()
        {
            return new GUIContent("预览");
        }
    

    标题栏右边可以绘制其他的信息或者按钮等,重载 OnPreviewSettings 接口方便对预览窗口进行控制:

        public override void OnPreviewSettings()
        {
            GUILayout.Label("文本", "preLabel");
            GUILayout.Button("按钮", "preButton");
        }
    

    预览内容的绘制

    最后预览内容的绘制,只需要重载 OnPreviewGUI 接口即可:

        public override void OnPreviewGUI(Rect r, GUIStyle background)
        {
            GUI.Box(r, "Preview");
        }
    

    最后显示如下所示:

    摄像机渲染

    不仅仅在预览窗口进行绘制控件,还可以绘制三维物体,实质是绘制独立的摄像机所照射的信息,例如动画片段预览窗口:

    鼠标可以拖动旋转等,还可以看其他方向,就像操作摄像机一样。

    这都是通过 PreviewRenderUtility 来实现的,对于这个类没有官方文档,可以通过网上其他人的分享,还有 UnityEditor 内部的使用来学习。

    基础绘制

    PreviewRenderUtility 的构造和销毁,还有要预览物体的构造和销毁,代码如下:

        private PreviewRenderUtility m_PreviewUtility;
        private GameObject m_PreviewInstance;
    
        private void InitPreview()
        {
            if (m_PreviewUtility == null)
            {
                // 参数true代表绘制场景内的游戏对象
                m_PreviewUtility = new PreviewRenderUtility(true);
                // 设置摄像机的一些参数
                m_PreviewUtility.m_CameraFieldOfView = 30f;
    
                // 创建预览的游戏对象
                CreatePreviewInstances();
            }
        }
    
        private void DestroyPreview()
        {
            if (m_PreviewUtility != null)
            {
                // 务必要进行清理,才不会残留生成的摄像机对象等
                m_PreviewUtility.Cleanup();
                m_PreviewUtility = null;
            }
        }
    
        private void CreatePreviewInstances()
        {
            DestroyPreviewInstances();
    
            // 绘制场景上已经存在的游戏对象
            m_PreviewInstance = GameObject.Find("ThirdPersonController");
        }
    
        private void DestroyPreviewInstances()
        {
            m_PreviewInstance = null;
        }
    
        void OnDestroy()
        {
            DestroyPreviewInstances();
            DestroyPreview();
        }
    

    接着是调用绘制,以 BeginPreviewEndAndDrawPreview 包围,在其中进行摄像机的渲染 Camera.Render 调用,代码如下:

        public override void OnPreviewGUI(Rect r, GUIStyle background)
        {
            InitPreview();
            if (Event.current.type != EventType.Repaint)
            {
                return;
            }
    
            m_PreviewUtility.BeginPreview(r, background);
            Camera camera = m_PreviewUtility.m_Camera;
            camera.transform.position = m_PreviewInstance.transform.position + new Vector3(0, 5f, 3f);
            camera.transform.LookAt(m_PreviewInstance.transform);
            camera.Render();
            m_PreviewUtility.EndAndDrawPreview(r);
        }
    

    最后效果如下所示:

    动态对象绘制

    不想照射到场景上的其他游戏对象,或者想要预览的游戏对象不在场景上,那么都得通过实例化出来,设置隐藏标志,不要被游戏场景所看到,让预览摄像机进行照射渲染。

    修改创建销毁预览物体的代码:

        private void CreatePreviewInstances()
        {
            DestroyPreviewInstances();
    
            // 查找要绘制的游戏对象
            m_PreviewInstance = GameObject.Find("ThirdPersonController");
            // 实例化对象
            m_PreviewInstance = Instantiate(m_PreviewInstance, Vector3.zero, Quaternion.identity) as GameObject;
            // 递归设置隐藏标志和层
            InitInstantiatedPreviewRecursive(m_PreviewInstance);
            // 关闭对象渲染
            SetEnabledRecursive(m_PreviewInstance, false);
        }
    
        private void DestroyPreviewInstances()
        {
            if (m_PreviewInstance != null)
            {
                DestroyImmediate(m_PreviewInstance);
            }
            m_PreviewInstance = null;
        }
    
        // 预览摄像机的绘制层 Camera.PreviewCullingLayer
        // 为了防止引擎更改,可以通过反射获取,这里直接写值
        private const int kPreviewCullingLayer = 31;
    
        private static void InitInstantiatedPreviewRecursive(GameObject go)
        {
            go.hideFlags = HideFlags.HideAndDontSave;
            go.layer = kPreviewCullingLayer;
            foreach (Transform transform in go.transform)
            {
                InitInstantiatedPreviewRecursive(transform.gameObject);
            }
        }
    
        public static void SetEnabledRecursive(GameObject go, bool enabled)
        {
            Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>();
            for (int i = 0; i < componentsInChildren.Length; i++)
            {
                Renderer renderer = componentsInChildren[i];
                renderer.enabled = enabled;
            }
        }
    

    修改 InitPreview 方法,设置预览摄像机的渲染层,代码如下:

                // 设置摄像机
                m_PreviewUtility.m_Camera.cullingMask = 1 << kPreviewCullingLayer;
    

    因为实例化对象的时候,关闭了对象的渲染,那么在摄像机预览的时候,就得进行开关来进行渲染,修改 OnPreviewGUI 方法,在 camera.Render(); 的前后来显示和隐藏渲染,代码如下:

            SetEnabledRecursive(m_PreviewInstance, true);
            camera.Render();
            SetEnabledRecursive(m_PreviewInstance, false);
    

    可以看到预览窗口渲染的是另外的游戏对象,如下所示:

    拖动旋转

    在预览窗口鼠标拖动可以旋转进行预览,就像Cube物体预览一样。要想让摄像机旋转,得知道游戏对象的中心,才能绕着它进行旋转。

    添加以下变量:

        // 预览对象的包围盒
        private Bounds m_PreviewBounds;
        // 预览的方向
        private Vector2 m_PreviewDir = new Vector2(120f, -20f);
    

    修改 CreatePreviewInstances 方法,在最后添加获取包围盒代码:

            m_PreviewBounds = new Bounds(m_PreviewInstance.transform.position, Vector3.zero);
            GetRenderableBoundsRecurse(ref m_PreviewBounds, m_PreviewInstance);
    

    添加以下辅助方法:

        public static void GetRenderableBoundsRecurse(ref Bounds bounds, GameObject go)
        {
            MeshRenderer meshRenderer = go.GetComponent(typeof(MeshRenderer)) as MeshRenderer;
            MeshFilter meshFilter = go.GetComponent(typeof(MeshFilter)) as MeshFilter;
            if (meshRenderer && meshFilter && meshFilter.sharedMesh)
            {
                if (bounds.extents == Vector3.zero)
                {
                    bounds = meshRenderer.bounds;
                }
                else
                {
                    // 扩展包围盒,以让包围盒能够包含另一个包围盒
                    bounds.Encapsulate(meshRenderer.bounds);
                }
            }
            SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent(typeof(SkinnedMeshRenderer)) as SkinnedMeshRenderer;
            if (skinnedMeshRenderer && skinnedMeshRenderer.sharedMesh)
            {
                if (bounds.extents == Vector3.zero)
                {
                    bounds = skinnedMeshRenderer.bounds;
                }
                else
                {
                    bounds.Encapsulate(skinnedMeshRenderer.bounds);
                }
            }
            foreach (Transform transform in go.transform)
            {
                GetRenderableBoundsRecurse(ref bounds, transform.gameObject);
            }
        }
    
        public static Vector2 Drag2D(Vector2 scrollPosition, Rect position)
        {
            int controlID = GUIUtility.GetControlID("Slider".GetHashCode(), FocusType.Passive);
            Event current = Event.current;
            switch (current.GetTypeForControl(controlID))
            {
                case EventType.MouseDown:
                    if (position.Contains(current.mousePosition) && position.width > 50f)
                    {
                        GUIUtility.hotControl = controlID;
                        current.Use();
                        // 让鼠标可以拖动到屏幕外后,从另一边出来
                        EditorGUIUtility.SetWantsMouseJumping(1);
                    }
                    break;
                case EventType.MouseUp:
                    if (GUIUtility.hotControl == controlID)
                    {
                        GUIUtility.hotControl = 0;
                    }
                    EditorGUIUtility.SetWantsMouseJumping(0);
                    break;
                case EventType.MouseDrag:
                    if (GUIUtility.hotControl == controlID)
                    {
                        // 按住 Shift 键后,可以加快旋转
                        scrollPosition -= current.delta * (float)((!current.shift) ? 1 : 3) / Mathf.Min(position.width, position.height) * 140f;
                        scrollPosition.y = Mathf.Clamp(scrollPosition.y, -90f, 90f);
                        current.Use();
                        GUI.changed = true;
                    }
                    break;
            }
            return scrollPosition;
        }
    

    修改 OnPreviewGUI 方法,代码如下:

        public override void OnPreviewGUI(Rect r, GUIStyle background)
        {
            InitPreview();
    
            // 上下左右的旋转
            m_PreviewDir = Drag2D(m_PreviewDir, r);
            if (Event.current.type != EventType.Repaint)
            {
                return;
            }
    
            m_PreviewUtility.BeginPreview(r, background);
            Camera camera = m_PreviewUtility.m_Camera;
    
            float num = Mathf.Max(m_PreviewBounds.extents.magnitude, 0.0001f);
            float num2 = num * 3.8f;
            Quaternion quaternion = Quaternion.Euler(-m_PreviewDir.y, -m_PreviewDir.x, 0f);
            Vector3 position = m_PreviewBounds.center - quaternion * (Vector3.forward * num2);
            camera.transform.position = position;
            camera.transform.rotation = quaternion;
            camera.nearClipPlane = num2 - num * 1.1f;
            camera.farClipPlane = num2 + num * 1.1f;
    
            SetEnabledRecursive(m_PreviewInstance, true);
            camera.Render();
            SetEnabledRecursive(m_PreviewInstance, false);
            m_PreviewUtility.EndAndDrawPreview(r);
        }
    

    最后效果,如下图所示:

    完整代码地址:https://code.csdn.net/snippets/2362605

    自定义视图的预览

    在自定义视图上的预览,可以采用类似以上的方式进行绘制,也可以创建相应的检视器类,直接调用绘制预览接口。代码如下:

    using UnityEngine;
    using UnityEditor;
    
    public class PreviewExampleWindow : EditorWindow
    {
        private Editor m_Editor;
    
        [MenuItem("Window/PreviewExample")]
        static void ShowWindow()
        {
            GetWindow<PreviewExampleWindow>("PreviewExample");
        }
    
        private void OnDestroy()
        {
            if (m_Editor != null)
            {
                DestroyImmediate(m_Editor);
            }
            m_Editor = null;
        }
    
        void OnGUI()
        {
            if (m_Editor == null)
            {
                // 第一个参数这里暂时没关系,因为编辑器没有取目标对象
                m_Editor = Editor.CreateEditor(this, typeof(PreviewExampleInspector));
            }
    
            m_Editor.DrawPreview(GUILayoutUtility.GetRect(300, 200));
        }
    }
    

    打开测试窗口,如下图所示:

    补充

    Unity 2017 版本的话,需要增加调用以下代码:

        private void AddSingleGO(GameObject go)
        {
    #if UNITY_2017_1_OR_NEWER
            m_PreviewUtility.AddSingleGO(go);
    #endif
        }
    

    参考文章

    1. CustomEditor http://anchan828.github.io/editor-manual/web/customeditor.html
    展开全文
  • 小程序文档预览、文件缓存

    千次阅读 2018-12-08 17:37:51
    文档预览(wx.openDocument) 文件本地存储(wx.saveFile) 获取本地存储的文件(wx.getSavedFileList) 文档分享(ios暂不支持,Android需要借助第三方文档工具) 二、文件下载 使用文件下载功能需要先在微信...

    一、技术摘要

    • 文件下载(wx.downloadFile)
    • 文档预览(wx.openDocument)
    • 文件本地存储(wx.saveFile)
    • 获取本地存储的文件(wx.getSavedFileList)
    • 文档分享(ios暂不支持,Android需要借助第三方文档工具)

    二、文件下载

    使用文件下载功能需要先在微信后台进行下载域名配置,具体操作请移步官方文档,下载文件时,需要调用wx.downloadFile()方法,其中的两个参数最为重要

    • API wx.downloadFile()
    • url->文件存放的服务器地址
    • filePath->文件存放的本地地址(默认是存储到本地临时文件,离开即会删除)
      在这里插入图片描述

    三、文档预览

    官方目前支持大部分格式的文档预览,包括常用的PDF,Word,PPT,(Excel目前暂不支持)

    • API wx.openDocument()
    • filePath->文件路径(本地和下载得到的临时路径都可以)
    • fileType->(当前文件的类型)在这里插入图片描述

    四、文件存储

    文件存储分为临时存储和本地存储,其中最大的区别就是文件分别存在的周期长短,但是需要注意的是用户如果删除当前小程序,那么对应的文件也会被删除,(文件存储不管是临时还是本地存储,文件大小总共不能超过10M,一旦超过,再次调用相关API,会一直走fail错误回调方法)

    • tempFilePath->存储的路径(返回本地的存储路径,请注意此时返回的是一个数组列表,包含了文件的大小、文件路径、文件存储的初始时间)

    对于Android文件下载之后文件后缀变为unknown的解决办法是在地址后面拼接一个对应文档后缀名
    https://google.com?fileType=.pdf(地址是乱写的哈,主要用于展示)
    https://google.com?fileType=.word(地址是乱写的哈,主要用于展示)

    五、获取本地存储的文件
    当文件保存到了本地,那么在下次进入就需要进行文件列表的获取,此时获取文件分两种状态

    • 获取指定的某一个单独的文件详细信息(wx.getSavedFileInfo)
      * 需要传入访问的文件路径
      * 返回的结果是包含当前文件的存储时间和大小
    • 获取本地缓存的所有文件信息(wx.getSavedFileList)
      * 不需要传递参数
      * 返回的结果是当前本次存储的所有文件(文件大小、路径、时间)

    在这里插入图片描述

    六、文档分享

    通过实践操作,发现在打开文档的窗口下只有Android可以进行当前文档的分享(Android默认打开的页面是通过QQ浏览器进行预览的),但是分享出去之后,发现文件缺失了对应的后缀,导致被分享人打开不了文档的问题,
    暂时解决方法

    • 文件分享之后,接受文档的用户手动添加后缀名
    • 通过第三方文件(wps)打开进行分享

    对于ios不能打开的问题,目前官方是不支持,具体可以访问下面链接进行查看
    https://developers.weixin.qq.com/community/develop/doc/000e2c2b37c940261a47032e758c00

    七、code

    //wxml
    <view class='downloadView'>
      <block wx:for="{{storeFile}}" wx:key="*this">
        <view class='itemsView' data-info="{{storeFile[index]}}" bindtap='openStoreFile'>打开本地缓存的第{{index+1}}个文件</view>
      </block>
      <!-- 下载文件 -->
      <button data-type='0' bindtap='fileDownload'>临时文件下载并打开</button>
      <button data-type='1' bindtap='fileDownload'>存储文件下载</button>
    </view>
    
    
    //wxss
    .downloadView{
      width:100%;
    }
    .itemsView{
      line-height:60rpx;
      font-size:26rpx;
      margin-bottom:10rpx;
      border-bottom:1rpx solid #ccc;
    }
    button{
      border-bottom:1rpx solid red;
      border-radius:0;
    }
    
    //js
    Page({
      data: {
        storeFile: null,
      },
      onShow: function () {
        let that = this;
        wx.getSavedFileList({
          success(res) {
            that.setData({
              storeFile: res.fileList
            })
            console.log(that.data.storeFile)
            console.log('本地缓存文件获取成功',res)
          },
          fail(error) {
            console.log('本地缓存文件获取失败', error);
          }
        })
      },
    
      // 文件下载
      fileDownload: function (e) {
        let type = e.currentTarget.dataset.type;
        if (type == 0) {
          this.download(0);
        } else {
          this.download(1);
        }
      },
    
      // 文件下载
      download:function(val){
        let that = this;
        let filePath = '';
        that.showLoad();
    
        //下载
        wx.downloadFile({
          url: '下载地址',
          filePath: filePath,
          success(res) {
            that.showLoadHid();
            filePath = res.tempFilePath
            console.log('临时文件地址', filePath)
            if(val==0){//临时存储并打开
              that.fileOpen(filePath)
            }else{//存储本地
              wx.saveFile({
                tempFilePath: res.tempFilePath,
                success(res) {
                  that.data.storeFile.push(res.tempFilePaths);
                  that.setData({
                    storeFile: that.data.storeFile
                  })
                  console.log(that.data.storeFile)
                  console.log('文件存储成功');
                },
                fail(error) {
                  console.log('本地文件存储失败');
                }
              })
            }
          },
          fail(error) {
            that.showLoadHid();
            console.log('文件下载失败', error)
          }
        })
      },
      // 本地文档打开
      openStoreFile:function(e){
        let info = e.currentTarget.dataset.info;
        console.log(info);
        this.fileOpen(info.filePath);
      },
    
      // 打开文档
      fileOpen:function(val){
        wx.openDocument({
          filePath: val,
          fileType: 'pdf',
          success(res){
            console.log('打开文件成功');
          },
          fail(error){
            console.log('文件打开失败');
          }
        })
      },
      showLoad:function(){
        wx.showLoading({
          title: '文件下载中',
          mask:true,
        })
      },
      showLoadHid:function(){
        wx.hideLoading();
      }
    })
    
    展开全文
  • 前端实现在线预览文档

    万次阅读 热门讨论 2019-06-03 17:22:07
    前端实现在线预览文档 最近项目开发中需要实现在线预览Word,Excel,PowerPoint格式的文档,网上查找了很多资源,各说纷纭,但是在一一尝试之后只有使用微软的预览接口才能成功,其他的会出现各种各样的问题,现在说下...
  • 运行程序后,当打开多个文档视图时,在任务栏中就会显示相应个数的子窗口预览窗口.如下图所示 个人感觉这种窗口使用起来很麻烦.想修改只显示一个主窗口的预览窗口即可. 经过几个小时的源码追踪,终于发现了关键函数...
  • java 实现的文档在线预览: 需要下载的工具有:OpenOffice+flexpaper+swftools+jodcconverter * .启动OpenOffice的服务 * 1 win+R开启dos窗口 * 2 执行:cd C:\Program Files (x86)\OpenOffice 4\program * 3 ...
  • 文档在线预览方案

    千次阅读 2012-12-05 23:28:40
    文档预览即文档以flash的形式在网页上展示,所以要解决两个问题: ①:以什么格式展示flash ②:文档如何转化为符合格式的flash 展示flash有两种方式,一种是直接生成好一个完整的flash展示出来,一种是用...
  • 通过单击下一个文件或使用箭头键预览下一个文件(如果预览窗口未对准焦点,则箭头键将在后台移动选择) 完成后,通过再次单击空格键,按 Esc 或单击⨉按钮将其关闭 注意:不要忘记查看插件来预览 Office 文件,epub...
  • vs2010单文档对话框窗口界面设置

    千次阅读 2014-09-01 11:02:47
    在VS2010单文档工程中,
  • 将vue文档下载到本地预览

    千次阅读 2018-10-24 15:57:16
    将vue文档下载到本地预览 由于vue文档在服务器在国外,因此访问速度较慢,为了方便文档查看,可以将文档下载到本地预览 步骤 到vue的GitHub仓库下载文档源码 下载node.js和git安装到本地 初始化文档并部署 1...
  • 在本地运行和预发布 ...打开新窗口预览文件 <a target='_black' href='https://view.officeapps.live.com/op/view.aspx?src=http://mczaiyun.top/ht/123.xlsx'>预览文件</a> 当前页面预览文件 <iframe
  • 详解MFC框架窗口文档和视图

    万次阅读 2014-05-21 07:31:32
    尽管窗口文档和视图是MFC的基础,但可能也是最不容易理解的部分,因为其概念比传统编程所需要的Windows函数更强一些,因此,须在本章做进一步详细讨论框架窗口文档和视图的方法和技巧。 6.1框架窗口 分两类:...
  • 实现了在对话框中添加MFC文档视图结构的打印预览功能,并实现了窗口内容的打印输出。 编译环境:VS2005
  • 在线预览 PDF 文档插件 PDFObject.js

    千次阅读 2019-09-26 16:59:07
    插件描述: 这是一个 JavaScript ... 标签显示 PDF 文档 官网:https://pdfobject.com/ 使用步骤: 1、下载 pdfobject.js GitHub 下载:https://github.com/pipwerks/PDFObject/ 2、在需要使用的 html 页...
  • mfc 单文档分拆窗口

    千次阅读 2013-05-29 20:14:23
    MFC单文档 窗口分割(二次分割)   2009-05-19 09:52:47 | 分类:   vc开发资料整理 | 字号   订阅 文件1 class CMainFrame : public CFrameWnd 添加如下代码 ...
  • 超详细的OpenOffice实现前端在线预览office文档记录 最近搞一个数字化共享平台,是一个java web项目,使用框架ssm,其中项目有一个需要在线预览PDF、excle、ppt、word文件的功能,也是各种谷歌百度,乱七八糟,要么...
  • flexpaper实现文档的在线预览

    千次阅读 2013-06-09 20:59:27
    在把文档的格式转换成swf格式以后,现在该实现在线的预览。 在线预览的方法有两种方式。 第一种: 通过flashpaper实现文档的在线预览。第二种是通过flexpaper实现文档的在线预览。 在博客中用到的是第二种方法。 在...
  •  附件格式 为 excle word 文档,pdf 扫描件 分析:一个附件管理的功能 + 在线查看功能。 附件管理的功能好实现,略过。 在线查看,是通过一个播放器查看flash文件,网上例子很多。 flash...
  • 第二个解决方法仍然保持用户对话框,但是由于对话框为模态,无法利用主框架窗口CMainFrame作为预览框架,因此要另外创建并显示一个框架窗口(CFrameWnd的派生类),作为预览窗口。 另外创建的框架窗口类名为...
  • 想在多文档视图程序的打印预览中添加自定义的按钮,比如导出到文件按钮。 百度google,好像改afxprint.rc文件可以实现,但我修改后保存不了,提示cannot save。 不知道怎么弄了,这问题搞了一天了,不知道有没有...
  • 来实现预览操作时,文件打开的窗口页面title会根据后台方法名来显示,此时如果不想看到方法名,想让页面title动态显示文件名,需要进行以下操作: /* 设定新弹出页面的title 暂不适用pdf格式文件*/ var title1=name...
  • 关闭Word文档的几种方法

    千次阅读 2018-01-18 13:55:48
    关闭Word文档的几种方法 01.点X法-按钮 直接点击窗口右上方的X。 02.点X法-任务栏 直接点击任务栏Word的预览窗口上的X,鼠标移动到任务栏Word的相应图标上再点击X。 03.点C法 点击窗口左上角的控制菜单...
  • MFC视图预览的原理是:以主框架窗口(CMainFrame)作为预览框架,隐藏原先的子视图(用CMainFrame::GetActiveView得到的那个,以下简称C视图),用CPreviewView类替换,同时创建包含“打印...”、“放大”、“关闭”...
  • 预览窗格无法预览wordMicrosoft Word is packed with features that improve usability and workflow efficiency. Navigation Pane is a great example, and you can use it to navigate headings, search your ...
  • OS提供了使用其他app预览文件的支持,这就是Document Interaction Controller。此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件。而且,从4.2开始,Quick Look Framework提供了对多种文档的内置打印...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,761
精华内容 15,104
关键字:

如何关闭文档预览窗口