React Native 查看 PDF 文件

React Native 查看 PDF 文件
  • 场景需求:
    手机查看 PDF 文件

  • RN 版本:

      "react": "16.6.1",
      "react-native": "0.57.5",
      "react-native-pdf": "^5.0.9",
      "react-native-fetch-blob": "^0.10.8"
    
  • RN 和 插件对应的版本:

react-native-pdf 4.x.x-5.0.x 5.0.9+
React Native 0.47-0.56 ^0.57
  • 用组件:react-native-pdf

  • 安装
    npm install rn-fetch-blob --save
    npm install react-native-pdf --save

    然后 link
    react-native link rn-fetch-blob
    react-native link react-native-pdf

  • 问题 :

    1. 我当时 link 后,Android 版本没 link 上去,所以就手动加了一遍。

    2. Android Studio 运行的时候出现 Warning:Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.是因为 AS 升级到 3.0 官网出现更新了,只需要 compile project(':react-native-pdf') ===> implementation project(':react-native-pdf')


  • 效果图:


    查看 PDF 效果图.gif
  • 完整代码示例:
/**
 * Created by pis on 2018/11/27.
 */
import React, {Component}from 'react';
import {StyleSheet, Dimensions, View, Text} from 'react-native';

import Pdf from 'react-native-pdf';

export default class PDFExample extends Component {
    constructor(props) {
        super(props);
        this.state = {
            page: 0, //当前第几页
            numberOfPages: 0 //pdf 共有几页
        }
    }

    render() {
        const source = {
            uri: 'http://samples.leanpub.com/thereactnativebook-sample.pdf', //pdf 路径
            cache: true, // 是否需要缓存,默认 false
            expiration: 0, // 缓存文件过期秒数,默认 0 为未过期
            method: 'GET', //默认 'GET',请求 url 的方式
            headers: {} // 当 uri 是网址时的请求标头
        };
        //const source = require('./test.pdf');  // ios only
        //const source = {uri:'bundle-assets://test.pdf'};

        //const source = {uri:'file:///sdcard/test.pdf'};
        //const source = {uri:"data:application/pdf;base64,..."};

        return (
            <View style={styles.container}>
                <Pdf
                    source={source}
                    fitWidth={true} //默认 false,若为 true 则不能将 fitWidth = true 与 scale 一起使用
                    fitPolicy={0} // 0:宽度对齐,1:高度对齐,2:适合两者(默认)
                    page={1} //初始化第几页,1 开始
                    scale={1} //页面加载出来 pdf 时的比例
                    minScale={1} //最小模块
                    maxScale={3} //最大模块
                    onLoadComplete={(numberOfPages,filePath,width,height,tableContents)=>{
                        console.log(`number of pages: ${numberOfPages}`); //总页数
                        console.log(`number of filePath: ${filePath}`); //本地返回的路径
                        console.log(`number of width: `,JSON.stringify(width));
                        console.log(`number of height: ${JSON.stringify(height)}`);
                        console.log(`number of tableContents: ${tableContents}`);
                    }}
                    onPageChanged={(page,numberOfPages)=>{
                        this.setState({
                            page:page,
                             numberOfPages:numberOfPages
                        });
                        console.log(`current page: ${page}`); //返回当前页
                        console.log(`current numberOfPages: ${numberOfPages}`); //返回总页面,其实在 onLoadComplete() 可以获取到
                        //所以不建议在这里获取总页数,因为页面滑动就会触发
                    }}
                    onError={(error)=>{
                        console.log(error);
                    }}
                    password='111' //pdf 密码,如果密码错误,会触发 onError() 并显示密码不正确或需要密码
                    spacing={10} // 页面之间的间隔大小,默认为 10
                    horizontal={true} //横向
                    activityIndicator={null}
                    // activityIndi​​catorProps={{backgroundColor:'red'}} 文档里有这个属性,但是我看源码里面没有
                    enablePaging={true} //在屏幕上只能显示一页
                    enableAntialiasing={true} //在低分辨率屏幕上改进渲染,针对 Android 4.4 上可能会出现的一些问题
                    enableRTL={false} //倒序滑动
                    enableAnnotationRendering={true} //启用渲染注视,iOS 仅支持初始设置,不支持实时更改
                    onLoadProgress={(number)=>console.log(number)} //加载时回调,返回加载进度(0-1)
                    onPageSingleTap={()=>{
                        console.log('页面被点击的时候回调')
                    }}
                    onScaleChanged={()=>{
                        console.log('页面缩放的时候回调')
                    }}
                    style={styles.pdf}/>
                <Text>
                    当前第 {this.state.page} 页,共 {this.state.numberOfPages} 页
                </Text>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'flex-start',
        alignItems: 'center',
        marginTop: 25,
    },
    pdf: {
        flex: 1,
        width: Dimensions.get('window').width,
    }
});

  • debugger 调试模式下 web 的跨域问题 :


    报错
  • 相关解决文章 --- 但是我试过了,没啥卵用

  • 我的解决方法:
    新装了一个 react-native-debugger 调试工具

由于篇幅原因,具体想要知道整个效果图的代码或者有补充地方的可以加技术群:631730313


推荐链接
IT 界寄来的书信系列
IT 界寄来的段子系列
IT 界起来的书籍系列
搞笑我们是用心系列

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

推荐阅读更多精彩内容