React移动端项目之pdf预览问题

 更新时间:2023年02月12日 14:30:26   作者:wo_dxj  
这篇文章主要介绍了React移动端项目之pdf预览问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

React移动端项目之pdf预览

因为项目需要,需要在在项目中实现pdf文件遇见功能,众所周知,安卓老大哥貌似不怎么支持,所以采用的react-pdf插件实现方式,实现方式很简单:

引入react-pdf包

yarn add react-pdf 或者npm install react-pdf --save

封装pdf组件:(官网demo)

import React, { Component } from 'react';
import { Document, Page } from 'react-pdf';
//如果报错 
Uncaught SyntaxError: Unexpected token <index.js:1452 
Error: Setting up fake worker failed: "Cannot read property 'WorkerMessageHandler' of undefined".    at pdf.js:10999
//就增加这两句
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
class MyApp extends Component {
  state = {
    numPages: null,
    pageNumber: 1,
  }
  onDocumentLoadSuccess = ({ numPages }) => {
    this.setState({ numPages });
  }
  render() {
    const { pageNumber, numPages } = this.state;
    return (
      <div>
        <Document
          file="somefile.pdf"
          onLoadSuccess={this.onDocumentLoadSuccess}
           page = {pageNumber}
        >
          <Page pageNumber={pageNumber} />
        </Document>
        <p>Page {pageNumber} of {numPages}</p>
      </div>
    );
  }
}

奉上官网demo地址https://www.npmjs.com/package/react-pdf

需求暂时可以实现,但是不完美的是这个插件 实现的是pdf文件分页预览法,以为这不能够常预览,想预览下页,就需要自己做分页,改变page属性的值,后期想的解决办法就是滚动翻页代替点击翻页,虽然还是单页预览但是稍微比点击翻页好点,后期小编突发奇想,渲染多个封装的pdf组件,每个组件只显示一页pdf内容,尝试了下还是可以实现常预览的,至于性能方面,小编的意思是在加载完第一页之后在渲染之后的,防止一次加载同一文件多次,浪费性能

React pdf前端显示 react-pdf-js踩坑

因为业务需求,大佬让我做一个poc 可以在前端展示pdf,试了很多插件,也试了大名鼎鼎的pdfjs,但是由于本身架构就使用react,所以最后选用了react-pdf-js。

在查询资料过程中发现官网的demo已经打不开了。这点比较坑,所以只能找一些其他大佬的文章了。

webpack

  • "react-pdf-js": "^4.0.1",
  • "webpack": "^2.7.0"
  • "react": "16.5.1",

报错 

1.message: "Invalid PDF structure"
2.name: "InvalidPDFException"

原因引入方式不正确。

之前的代码为

 file={'../../doc/test.pdf'}

应改为

const pdfurl = require('../../doc/test.pdf') 
 
......
 
render(){
        return (
            <div>
                 <PDF
                    file={pdfurl}
                    onDocumentComplete={this.onDocumentComplete.bind(this)}
                    page={this.state.page}
                    />
                <Pagination  onChange={this.onChange.bind(this)} total={this.state.pages} current={this.state.page}/>
            </div>
           
 
        )
 
    }
}

因为之前项目完全没有做到pdf 所以在webpack中没有做相对应的loader

报错 

You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)

webpack中添加如下

 {
    test: /\.(pdf|svg)$/,
    use: 'file-loader?name=[path][name].[ext]',
 }

最后就可以了 完整代码如下

import React from 'react';
import { connect } from 'react-redux';
 
import { Pagination } from 'antd'
const pdfurl = require('../../doc/test.pdf') 
import PDF from 'react-pdf-js';
class Test extends React.Component {
    constructor (){
        super()
        this.state={
            "page":1,
            "pages":1
 
        }
    }
    onDocumentComplete(pages)  {
        this.setState({ page: 1, pages:pages });
    }
    onChange (page) {
        this.setState({
            page: page,
        });
      }
    render(){
        return (
            <div>
                 <PDF
                    file={pdfurl}
                    onDocumentComplete={this.onDocumentComplete.bind(this)}
                    page={this.state.page}
                    />
                <Pagination  onChange={this.onChange.bind(this)} total={this.state.pages} current={this.state.page}/>
            </div>
           
 
        )
 
    }
}
const mapStateToProps = s => ({
    
 
})
export default connect(mapStateToProps,{ 
   
})( Test )

分页使用的是antd 然后发现antd的组件最多只有102页em。。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React ref的使用示例

    React ref的使用示例

    这篇文章主要介绍了React ref的使用详解,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下
    2021-04-04
  • Remix如何支持原生 CSS方法详解

    Remix如何支持原生 CSS方法详解

    这篇文章主要为大家介绍了Remix如何支持原生CSS的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • React利用scheduler思想实现任务的打断与恢复

    React利用scheduler思想实现任务的打断与恢复

    这篇文章主要为大家详细介绍了React如何利用scheduler思想实现任务的打断与恢复,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2024-03-03
  • react 中父组件与子组件双向绑定问题

    react 中父组件与子组件双向绑定问题

    这篇文章主要介绍了react 中父组件与子组件双向绑定问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 在react中使用tailwind的问题

    在react中使用tailwind的问题

    这篇文章主要介绍了在react中使用tailwind的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • react diff算法源码解析

    react diff算法源码解析

    这篇文章主要介绍了react diff算法源码解析的相关资料,帮助大家更好的理解和学习使用react,感兴趣的朋友可以了解下
    2021-04-04
  • React官方团队完善原生Hook闭包陷阱

    React官方团队完善原生Hook闭包陷阱

    这篇文章主要为大家介绍了React官方团队出手,补齐原生Hook短板闭包陷阱的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React中常见的动画实现的几种方式

    React中常见的动画实现的几种方式

    本篇文章主要介绍了React中常见的动画实现的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • react router4+redux实现路由权限控制的方法

    react router4+redux实现路由权限控制的方法

    本篇文章主要介绍了react router4+redux实现路由权限控制的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • react实现头部导航,选中状态底部出现蓝色条块问题

    react实现头部导航,选中状态底部出现蓝色条块问题

    这篇文章主要介绍了react实现头部导航,选中状态底部出现蓝色条块问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论