使用pdf.js预览pdf遇到的问题总结

我先说一下问题点:

最近项目做了一次改造,是关于iobs的。用户上传的pdf资料和图片等文件都是上传到iobs上,
所以用户需要预览或者页面返显图片的时候,都是从iobs上拿。之前拿到iobs链接之后,可以在一定的时间内无限次打开。这次做了安全改造,iobs链接只能用一次,再次打开的时候会报权限错误。这一改造就导致了页面预览pdf文件出现了问题。
安卓手机预览pdf文件,一切正常。
苹果手机预览pdf文件,小于1M可以预览,大于1M,显示一直加载中…

为什么苹果手机有问题,安卓手机没问题呢?
手机连接电脑进行调试后发现,因为pdf.js默认是分片加载,所以会发送多次请求,一个iobs链接会用多次。安卓手机第一次请求回来之后,后面第二次请求、第三次请求等都是从缓存(强缓存)中读取的,所以后面的请求不会到服务器,所以安卓名义上是只请求了一次。

但是苹果手机不是这样的,没有设置强缓存(苹果系统的安全机制是这样的,可以手动设置),所以分片加载会请求多次,第一次请求正常,后面的请求会出现请求报错的情况。
那又为什么小于1M的可以加载出来,大于1M的就不行呢?
因为小于1M的pdf资源请求会很快,所以在第二次请求、第三次请求等这些结果返回之前,第一次请求的结果已经返回来了,所以有数据,能正常加载。
大于1M的pdf资源请求会很慢,所以在第二次请求、第三次请求等这些结果返回之后,第一次请求的结果还没有返回回来,(第二次请求、第三次请求等请求响应的结果是权限错误,因为iobs链接已经用了不止一次),因为第二次请求、第三次请求等请求失败,所以第一次请求的响应结果也是请求报错(因为服务器认为)

因为pdf.js默认配置的是分片加载,分片加载的话,肯定会多次请求这个iobs链接的,现在iobs只能用一次,那就需要把pdf.js中分片加载的默认配置关掉;

我们先来看一下pdf.js的分片加载配置

PDF.js插件中切片配置相关属性如下:

##### 1         "disableAutoFetch": true, //是否禁用自动获取,true为禁用自动获取,开启分页
##### 2         "disableFontFace": false,
##### 3         "disableRange": false, //是否禁用range获取文件,false表示支持分页请求头
##### 4         "disableStream": true, //分页关键,是否禁用流的形式加载

既然知道了相关的配置属性,我就在pdf.js和viewer.js这两个js文件中进行了修改

viewer.js是在getDefaultPreferences这个函数中进行修改

function getDefaultPreferences(){..."disableAutoFetch": true,// "disableAutoFetch": false, // 这个是默认的,所以需要改成true"disableFontFace": false,"disableRange": true,// "disableRange": false,// 这个是默认的,所以需要改成true"disableStream": true// "disableStream": false // 这个是默认的,所以需要改成false   
}

pdf.js是在getDocument这个函数中进行修改

function getDocument(){...if(typeof params.disableRange !== "boolean"){// params.disableRange = false // 这个是默认的,所以需要改成trueparams.disableRange = true}if(typeof params.disableStream !== "boolean"){// params.disableStream = false // 这个是默认的,所以需要改成trueparams.disableStream = true}if(typeof params.disableAutoFetch !== "boolean"){// params.disableAutoFetch = false // 这个是默认的,所以需要改成trueparams.disableAutoFetch = true}
}

好,现在已经修改完默认的分片配置,改为不分片加载。

看看效果,配置成功,进入到预览pdf页面,只会iobs链接只会请求一次,说明分片加载已经关掉了。

如果仅仅是遇到上面这个问题,我就不写这篇总结了。
还遇到了这样一个问题,就是如果是1M以内的pdf数据,返回的响应头里面的content-type : application/octet-stream,可以被pdf.js正常加载预览。如果是大于1M的pdf数据,返回的响应头里面的content-type : application/pdf,这个时候被pdf.js加载预览时报 load failed(加载失败)。
为什么返回的响应头中的content-type 不一样呢,可能是iobs做了一些设置。不过通过查看iobs提供的接口文档,发现只要在url加上response-content-type这个值,就可以指定返回的响应头里面的content-type 值。
于是我就让后端小伙伴在url上加上了response-content-type这个值。加上后,生效了,大于1M的数据返回的响应头里面的content-type : application/octet-stream。

但是又出现新的问题,就是大于1M的数据无法被浏览器加载,这是为什么呢?
我又查看了一下配置,发现disableStream这个值我改为了true,是否禁用流的形式加载。这样的话,就相当于禁用流的形式进行加载了。
于是我把disableStream这个值我改回了false,最后的配置如下:

viewer.js是在getDefaultPreferences这个函数中进行修改

function getDefaultPreferences(){..."disableAutoFetch": true,// "disableAutoFetch": false, // 这个是默认的,所以需要改成true"disableFontFace": false,"disableRange": true,// "disableRange": false,// 这个是默认的,所以需要改成true"disableStream": false// "disableStream": false // 这个是默认的,所以需要改成false   
}

pdf.js是在getDocument这个函数中进行修改

function getDocument(){...if(typeof params.disableRange !== "boolean"){// params.disableRange = false // 这个是默认的,所以需要改成trueparams.disableRange = true}if(typeof params.disableStream !== "boolean"){// params.disableStream = false // 这个是默认的,所以需要改成trueparams.disableStream = false}if(typeof params.disableAutoFetch !== "boolean"){// params.disableAutoFetch = false // 这个是默认的,所以需要改成trueparams.disableAutoFetch = true}
}

好,现在已经修改完,大于1M的数据也可以被成功预览。

当然这其中有很多值得我去深挖的点。我后面会再写一篇,详细去介绍我深挖的哪些点,比如为什么1M以内的数据不受影响,大于1M的数据为什么会受影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇: three.js如何实现简易3D机房?(二)模型加载的过渡动画:http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 (1)需求: (2)思路:…

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2022)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

生物电信号测量技术

引言 生物电信号是生物体内的电活动产生的电流或电压信号,它反映了生物体的生理状态和活动。生物电信号测量技术是一种用于记录和分析这些信号的方法,广泛应用于医学、生物学、神经科学等领域。本文将介绍几种常见的生物电信号测量技术,并讨…

C语言第三十六弹---文件操作(中)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

全志D1s开发板裸机开发之坏境搭建

环境搭建 开发板介绍 张天飞老师编写的《RISC-V体系结构编程与实践》,里面的源码是基于 QEMU 模拟器的,可以认为它是一款虚拟的开发板。如果需要在真实开发板上学习,可以使用百问网的 DongshanPI-D1S 开发板。 DongshanPI-D1S 是百问网推出…

Python web自动化测试 —— 文件上传!

​文件上传三种方式: (一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传 方法:和用户输入是一样的,使用send_keys 步骤:1、找到定位元素,2&#…

Git分支操作

Git分支操作 理解分支查看当前分支git branch 查看有几个分支git branch 新分支的名字 创建新分支git checkout -b 分支名 直接创建并切换到该分支下 切换分支git checkout 分支名 切换到指定分支 合并分支git merge 分支名 合并指定名字的分支 删除分支git branch -d 分支 删…

(力扣题库)跳跃游戏II(c++)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] (表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的…

Linux:kubernetes(k8s)探针的简介(7)

相当于我们用于监控容器的一个东西&#xff0c;通过给我们的不同探针来判断容器内的状态情况&#xff0c;实现故障的一个自动恢复。 我们在上一章的yaml文件中写入了一个这个东西 那么他什么情况下重启&#xff0c;就是通过探针进行一个监控&#xff0c;加入监控某一个端口&…

云原生(一)、linux快速上手

Linux是一种开源的Unix-like操作系统内核。它是由Linus Torvalds于1991年首次发布&#xff0c;其后经过全球的自由软件社区的持续开发和改进。Linux内核是操作系统的核心部分&#xff0c;但通常与GNU项目合作&#xff0c;以形成完整的操作系统&#xff0c;被称为Linux发行版&am…

C语言从入门到实战——预处理详解

预处理详解 前言一、预定义符号1.1 __FILE__1.2__LINE__1.3 __DATE__1.4__TIME__1.5__STDC__ 二、 #define定义常量三、 #define定义宏四、 带有副作用的宏参数五、 宏替换的规则六、宏函数的对比七、 #和##7.1 #运算符7.2 ##运算符 八、 命名约定九、 #undef十、命令行定义十一…

ROS从入门到精通4-2:Docker安装ROS、可视化仿真与终端复用

目录 0 专栏介绍1 Docker安装ROS2 Docker可视化仿真2.1 显示配置2.2 启动容器 3 终端复用工具3.1 session操作3.2 window操作3.3 pane操作3.4 其他操作 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS…

C 嵌套 if 语句

在 C 语言中&#xff0c;嵌套 if-else 语句是合法的&#xff0c;这意味着您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 语法 C 语言中 嵌套 if 语句的语法&#xff1a; if( boolean_expression 1) {/* 当布尔表达式 1 为真时执行 */if(boolean_expres…

机器学习项目的流程:从数据到部署

目录 前言1 数据收集1.1 任务定义与数据需求明确1.2 数据采集与清洗 2 模型训练2.1 数据预处理2.2 选择适当的模型2.3 模型训练与调优2.4 模型评估 3 模型部署3.1 部署环境准备3.2 模型集成3.3 测试和优化 4 模型维护和更新4.1 模型性能监测4.2 数据漂移处理4.3 定期更新模型 结…

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

⁴ 大龄IT青年,自动化测试是否是你不错的出路。

转型自动化测试是不是一个很好的职业转变选择。以下是一些步骤和建议&#xff0c;帮助你成功转型为自动化测试工程师&#xff1a; 1. 了解自动化测试的基础知识&#xff1a;自动化测试是通过编写脚本和使用工具来执行测试任务的过程。你需要学习编程语言&#xff08;如Python、…

Node.js概述与安装运行浅记

Node.js概述 Node.js 是一个开源、跨平台的JavaScript运行环境&#xff0c;用于在服务器端执行JavaScript代码。它不是一门新的编程语言&#xff0c;而是基于Google的V8 JavaScript引擎构建的一个平台&#xff0c;允许开发者使用JavaScript编写服务器端应用。Node.js采用了异步…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…

【DAY08 软考中级备考笔记】机组:计算机组成和数据转换

机组&#xff1a;计算机组成和数据转换 3月2日 – 天气&#xff1a;晴 1. 计算机的基本组成结构 计算机的硬件由运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入和输出设备组成其中&#xff0c;控制器和运算器成为CPU控制器又分为了内部存储器和外部存储器。内部…

应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控

作者&#xff1a;古琦 在现代软件架构中&#xff0c;微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能&#xff0c;它们共同工作以提供完整的服务。由于微服务架构的分散特性&#xff0c;监控变得至关重要&#xff0c;有效的微服务监控是…