ReactNative文档查看组件:react-native-doc-viewer

事件背景:最近在写一个项目,要求本地打开、查看和打开远程的文档。找到了一个组件,使用起来挺方便的。就分享一下。我是配合react-native-fs实用的,fs配置的一些东西看我另一篇随笔。

react-native-doc-viewer,可以在手机上直接打开文档,支持远程和本地文档。

支持的文档格式:xls,ppt,doc,xlsx,pptx,docx,png,jpg,pdf,mp4。支持iOS和Android。

组件名称:react-native-doc-viewer

首先安装:npm install react-native-doc-viewer --save

其次自动链接:react-native link react-native-doc-viewer


        按理说是自动连接是可以的。可是程序运行一下发现还是报错。只能手动来了。

先附上npm网址:https://www.npmjs.com/package/react-native-doc-viewer

检查并链接:

一、ios端:

1、在XCode中,在项目导航器中,右键单击Libraries➜Add Files to [你的项目名字]

2、转到node_modules➜ react-native-doc-viewer并添加RNReactNativeDocViewer.xcodeproj

3、在XCode中,在项目导航器中,选择您的项目。添加libRNReactNativeDocViewer.a到项目的Build Phases➜Link Binary With Libraries

划重点,我的以上三条都链接上了。只有下面的没有链接上。

链接的框架和库必须具有此2个库(AssetsLibrary.framework和QuickLock.framework)

注意当显示http链接时,不要忘记将APP传输安全设置 - >允许任意加载设置为YES

在info.plist里没有的话添加上。

二、android配置

去看npm网址吧,我的是直接连接一下就自动配置上了,所以懒得整理了。


附上API:

openDoc 打开远程货或本地文档

openDocb64 打开Base64字符串格式文档

openDocBinaryinUrl 打开二进制文件

playMovie 打开视频文件

制作这个组件的作者估计是没时间写很详细,所以npm上也不是很详细。下面附上我写的一部分程序。

import React, { Component } from 'react';

import {

    StyleSheet,Text,View,

    Platform,Button,Alert,ActivityIndicator

} from 'react-native';

import OpenFile from 'react-native-doc-viewer';

var RNFS = require('react-native-fs');

//保存路径可以跳进去看,具体自己选择

var SavePath = Platform.OS === 'ios' ? RNFS.LibraryDirectoryPath : RNFS.ExternalDirectoryPath;

export default class Component extends Component {

    static navigationOptions = ({ navigation }) => ({

        title: `${navigation.state.params.name}`,

    });

    state = { animating: false }

//首先下载文件

     componentDidMount() {

      alert("开始")

    RNFS.exists(SavePath + "demo.docx").then(

        //判断文件是否已存在,返回result为true说明存在,result为false说明不存在

        (result)=>{

            console.log(result);

            if(!result){

                var DownloadFileOptions = {

                    fromUrl: "https://calibre-ebook.com/downloads/demos/demo.docx",// 下载文件的URL

                    toFile: SavePath+"/demo.docx",        // 将文件保存到的本地文件系统路径

                    //进度条

                    begin: (res) => {

                        console.log('begin', res);

                        console.log('contentLength:', res.contentLength / 1024 / 1024, 'M');

                    },

                    progress: (res) => {

                        let pro = res.bytesWritten / res.contentLength;

                        console.log(pro);

                    }

                }

                const ret = RNFS.downloadFile(DownloadFileOptions);

                ret.promise.then(res => {

                    console.log('success', res);

                    console.log('file://' + DownloadFileOptions.toFile)

                }).catch(err => {


                    console.log('err', err);

                });

            }

        }

    ).catch(

    )

}

//打开本地文件

    handlePressLocal = () => {

        this.setState({ animating: true });

        if (Platform.OS === 'ios') {

            OpenFile.openDoc([{

                url: SavePath + "/demo.docx",

                fileNameOptional: "白皮书"

            }], (error, url) => {

                if (error) {

                    this.setState({ animating: false });

                } else {

                    this.setState({ animating: false });

                    console.log(url)

                }

            })

        } else {

            OpenFile.openDoc([{

                url: "file://"+SavePath+"/demo.docx",//打开本地文件必须加上file://

                fileName: "白皮书",

                cache: true,

                fileType: "docx"

            }], (error, url) => {

                if (error) {

                    console. log(error)

                    this.setState({ animating: false });

                } else {

                    this.setState({ animating: false });

                    console.log(url)

                    alert(url)

                }

            })

        }

    }

//打开远程文件

handlePress = () => {

        this.setState({ animating: true });

        if (Platform.OS === 'ios') {

            OpenFile.openDoc([{

                url: "https://calibre-ebook.com/downloads/demos/demo.docx",

                fileNameOptional: "test filename"

            }], (error, url) => {

                if (error) {

                    this.setState({ animating: false });

                } else {

                    this.setState({ animating: false });

                    console.log(url)

                }

            })

        } else {

            //Android

            this.setState({ animating: true });

            OpenFile.openDoc([{

                url: "https://www.huf-haus.com/fileadmin/Bilder/Header/ART_3/Header_HUF_Haus_ART_3___1_.jpg", // Local "file://" + filepath

                fileName: "sample",

                cache: false,

                fileType: "jpg"

            }], (error, url) => {

                if (error) {

                    this.setState({ animating: false });

                    console.error(error);

                } else {

                    this.setState({ animating: false });

                    console.log(url)

                }

            })

        }

    }

setToggleTimeout() {

        this.setTimeout(() => {

            this.setState({ animating: !this.state.animating });

            this.setToggleTimeout();

        }, 2000);

    }

render() {

        return (

            <View style={styles.container}>

                <ActivityIndicator

                    animating={this.state.animating}

                    style={[styles.centering, { height: 80 }]}

                    size="large" />

                <Text style={styles.welcome}>

                    Doc Viewer React Native

                </Text>

                <Button

                    onPress={this.handlePress.bind(this)}

                    title="打开远程文档"

                    accessibilityLabel="See a Document"

                />

                <Button

                    onPress={this.handlePressLocal.bind(this)}

                    title="打开本地文档"

                    accessibilityLabel="See a Document"

                />

            </View>

        );

    }

}

const styles = StyleSheet.create({

    container: {

        flex: 1,

        justifyContent: 'center',

        alignItems: 'center',

        backgroundColor: '#F5FCFF',

    },

    welcome: {

        fontSize: 20,

        textAlign: 'center',

        margin: 10,

    },

    instructions: {

        textAlign: 'center',

        color: '#333333',

        marginBottom: 5,

    },

});


上面我觉得重要的地方都有加注释。有使用fs 有需要的可以点下FS,去我的另一篇文章 。

再次划重点:打开本地文件失败:打开本地文件的url:必须是file://+路径+文件名字。上面也有注释。我是遇到这个问题了,所以就想唠叨一下。

我只使用了打开远程的和下载后打开本地的。其他的官方上npm上有例子。可以去查看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 1、读《奥巴马回忆录·我父亲的梦想》有感 孙洋洋 生活是不公平的,你要去适应它。有的人逆风而行,也未必会失败。奥...
    不如遇见阅读 1,190评论 0 0
  • 保存图片到系统相册 first, 先要讲的是如何将一张图片保存到系统的相册, 这里我们就不讲保存到自定义的相册什么...
    zhouyuhan阅读 3,661评论 4 4
  • 落落大方,彬彬有礼,是我对星洲小学学生的印象。是的,一次班队活动,展现了他们良好的精神风貌,出色的班级凝聚力...
    浙大学习班学霸组阅读 158评论 0 0
  • 今天参加读写训练营的读书分享会,其实我参与的时候已经迟了,好多小伙伴已经分享过了。我本可以用语音分享,但是因为孩子...
    透明的橙阅读 124评论 0 0
  • 只有复杂的环境,才会造成这般扭曲的人性! 今天推荐的这部电影,真需要一下子切入正题! 不是因为绵绵着急,只是对这部...
    Shawn必有人鱼线阅读 301评论 0 0