首页 > 其他分享 >react-pdf在部分iOS手机上加载pdf失败问题解决

react-pdf在部分iOS手机上加载pdf失败问题解决

时间:2023-08-26 22:46:30浏览次数:46  
标签:url app iOS react 报错 pdf 加载

最近项目快结束了,测试提了一个bug,iOS手机上加载pdf一直在转圈,加载不出来内容。看到这个bug,在电脑上和安卓手机上没有问题,iOS手机中打开确实又问题,初步确定为app问题。我们的项目是集成在客户的app里的,可能是app内的WebView和Safari有一些差异导致的问题。

  1. 首先直接在iOS手机上用app和Safari分别访问本地启动的项目,发现打开之后一直转圈,但是没有报错信息,因为手机上是用vConsole看的,不确定是不是一些信息被过滤掉了,所以就在电脑上用Safari打开同一个页面,结果和手机上一样,依然没有报错信息。
  2. 因为没有错误信息,看了一会儿也没有头绪,突然想到之前遇到过,本地项目无法加载一些js,导致页面显示不全,有没有可能因为本地项目导致部分js加载不全,造成pdf加载不出来。尝试在电脑上用Safari打开远程页面,发现可以正常加载,手机上用Safari测试也可以正常加载,所以问题确定为iOS手机的app中无法加载pdf。
  3. app中无法加载,想到是不是pdf链接又问题,单独复制链接在代码中写死,测试发现也加载不出来。然后想到是不是app内部有网络限制,用app提供的方法ping pdf链接的域名,发现可以正常访问,所以排除链接和网络问题。
  4. 在github上react-pdf库的issues中搜索,发现有一个类似的问题,但是是Cordova的项目,情况应该不一样,所以就略过了。
  5. 没办法只能看react-pdf的源码,发现Document中除了之前用的onLoadSuccess方法,还有其他的onLoadErroronSourceSuccessonSourceError方法,加上这些方法,重新打包发布项目后,在app中打开发现,终于看到了一条有用的信息message: “undefined is not an object (evaluating ‘e.body.getReader’)”,再搜索源码,定位到报错位置是pdfjs中的PDFFetchStreamReader类中相关的方法报错,查看相关代码逻辑。传递pdf url后,pdfjs会请求这个url,拿到返回pdf数据后再去加载,现在是第一步请求pdf url没有返回数据导致报错,所以没有加载pdf。
  6. 搜索类似问题,发现Pdf.js body.getReader 报错问题,不过有点不同,这个问题是qq浏览器加载问题,不过提供了思路,需要手动请求pdf url,然后把数据内容赋值给pdfjs就可以正常加载了。
  7. 有思路之后,参考步骤4中的请求方法,在Document的onLoadError方法中,直接请求pdf url,把请求后的数据赋值给Document,这样就可以正常加载pdf了。
    onDocumentLoadError = (e) => {
      console.error('onDocumentLoadError', e);
      if (typeof this.state.pdfUrl == 'string') {
        this.transferUrlToArrBuffer(this.state.pdfUrl);
      }
    };
    transferUrlToArrBuffer = async (url) =>{
      const res = await fetch(url);
      const arrBuffer = await res.arrayBuffer();
      this.setState({pdfUrl: arrBuffer});
    };
    
  8. render中的方法如下,
    <Document
      file={pdfUrl}
      onl oadSuccess={this.onDocumentLoadSuccess}
      onl oadError={this.onDocumentLoadError}
      options={{
        cMapUrl: `//cdn.jsdelivr.net/npm/pdfjs-dist@${pdfjs.version}/cmaps/`,
        cMapPacked: true,
      }}
    >
      <Page pageNumber={1} onRenderSuccess={this.onLoadSuccess}/>
    </Document>
    

标签:url,app,iOS,react,报错,pdf,加载
From: https://www.cnblogs.com/shenyuiOS/p/17659626.html

相关文章

  • jdk1.8 AudioSystem 无法关闭流的问题
    问题首先说明JDK版本,EclipseTemurin1.8.0_382,写音频处理时遇到一个文件流无法关闭的问题。具体是javax.sound.sampled.AudioSystem#getAudioInputStream(java.io.File)写在try-with-resources里,在try-with-resources结束的代码块外删除文件显示文件被占用,最后在stackov......
  • 现在开发需要兼容Android 和 iOS 手机的大型App,优选什么框架?
    前言现在最主流的跨平台方案应该也就是Flutter了,再就是RN,不过RN已经在慢慢退出历史舞台。中小企业目前最优先选择的还是Flutter,Flutter现在的生态也逐渐很完善。不过大型App,我还是推荐混编,一些不重要的模块使用Flutter,重要的模块还是使用原生的好。除了Fluttet的方案,还有一种方案可......
  • Vmware虚拟机bios里面启动顺序怎么改?
    参考https://it.cha138.com/python/show-4080587.html1、首先打开虚拟机,并选择创建好的虚拟机,如图中所示,选中后,右边会出来这个虚拟机的基本配置,2、然后在右边虚拟机上红框处点击右键,并选择“电源”=》“启动时进入BIOS”。3、进入BISO界面后,按键盘右方向键到“BOOT”项,然......
  • vue项目axios请求 解决跨域问题 2种方法
    前端添加vue.config.js文件 【【4k小白到全栈】进阶课好看登录页面Vue3+Ts+Pinia+Axios+VueRouyer+SpringBoot2.7+MybatisPlus前后端分离】https://www.bilibili.com/video/BV1x14y1Z74z?p=26&vd_source=da9319adec9f5f92ccc22db2f6108195 后端  response.setConte......
  • How to get the Axios's response file type All In One
    HowtogettheAxios'sresponsefiletypeAllInOne获取Axios请求响应头中的文件类型AxiosAPIhttps://www.npmjs.com/package/axiosdemosimportfsfrom'node:fs';importpathfrom'path';importaxiosfrom'axios';asyncfunctio......
  • 前端React学习路径
    在当今的软件开发领域,React已经成为一种广泛使用的JavaScript库,用于构建用户界面。它由Facebook开发并维护,具有高效、灵活和可扩展等特点,适用于各种类型的应用程序开发。本文将介绍前端React的学习路径,包括基本概念、核心功能、组件进阶、路由和状态管理、构建实践等方面,并结合代码......
  • Airtest新增iOS、Windows录屏功能,真香!
    1.前言在录屏这块,Airtest之前一直仅支持了Android设备,但Airtest1.2.9的新版录屏功能里,新增了iOS和Windows的录屏支持。下文我们将详细了解这个新的录屏功能,以及实操下在iOS设备或者Windows端的录屏操作。2.Airtest录屏功能介绍熟悉Airtest的同学都知道,我们可以用 start_rec......
  • 用Python制作一个PDF转Word工具
    工具:Python3.9.13,VSCode1.73.1,pdf2docx0.5.6,tkinter,Win10HomePDF文件不易编辑,想要编辑需要转成Word,但网上的工具很多要充VIP,所以今天我们就来做个PDF转Word工具。首先先安装第三方库:pipinstalltkinter导入库:#coding=utf-8importosimporttkinterfrompdf2docximport......
  • axios.js的使用方法
    axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js中。以下是axios的基本使用方法: 1.安装axios模块: ```npminstallaxios``` 2.引入axios模块: ```javascriptconstaxios=require('axios');``` 3.发送GET请求: ```javascriptaxios.get('/api......
  • 分享一个批量转换某个目录下的所有ppt->pdf的Python代码
    大家好,我是皮皮。一、前言前几天在Python最强王者群【Python小小小白】分享了一份Python自动化办公的代码,可以批量转换某个目录下的所有ppt->pdf,非常强大。二、实现过程在正式跑代码之后,你可能需要按照对应的库,不然会报错。代码运行之后,本地会出现下面的UI界面,选择PPT文件......