pdfjs优化,实现按需加载,节省流量和内存

2023-11-13

1 问题

  当使用pdfjs来实现预览功能的时候,遇到了2个问题:

  一是带宽占用过大,会下载整个pdf文件,这对部署在公网的应用来说,成本压力很大,因为云服务带宽是很贵的。

  二是内存占用过大,一个80M的pdf,在预览时占用内存高达600M,在一些内存较小的手机上容易发生崩溃。

  pdfjs默认配置下,会加载所有的分片(内容),即使只预览一个页面也会加载整个文件。能不能实现按需加载呢?只加载所预览的页面?答案是可以,下面我就详细地介绍如何做。

2 测试环境

pdfjs 1.10.100 prebuild

chrome 76

springboot 2.1

3 步骤

3.1 原理

  要实现按需下载,需要用到HTTP协议的范围(Range)请求。MSN站点中有关Range的介绍如下:

The Range HTTP request header indicates the part of a document that the server should return. Several parts can be requested with one Range header at once, and the server may send back these ranges in a multipart document. If the server sends back ranges, it uses the 206 Partial Content for the response. If the ranges are invalid, the server returns the 416 Range Not Satisfiable error. The server can also ignore the Range header and return the whole document with a 200 status code.

  这段文字的大概意思是,客户端使用Range请求头,可以要求服务端返回文档的某个部分。如果服务端不支持,则响应200状态码并直接返回整个文档的内容。如果服务端支持,则在响应中使用206状态码并返回部分内容。

Range示例:
Range: bytes=200-1000
Range: bytes=0-499, -500

  在HTTP服务器上,当它支持Range请求头时,也就实现了所谓的“分片下载”、“断点续传”功能。为行文的方便,下面都使用’分片下载’这个术语。

3.2 HTTP服务器启用分片下载功能

  服务器要启用功能,springboot web默认开启了这个功能,不需要再额外配置。

  如果使用其它的技术栈,一定要确保开启这个功能!这是必要条件。

  那如何测试HTTP服务器是否开启了分片?可以使用chrome开发者模式来确认,如果看到有很多状态码为206的报文,就说明开启了,如下图所示:

clip_image002

3.3 pdfjs关闭自动获取

  在pdfjs发行包的web/viewer.js文件中,找到配置项disableAutoFetch,可以看到它的默认值是false,意味着会自动获取所有分片。

clip_image004

  将它改为true,意味着关闭自动获取,它仅仅会下载所需要的分片,实现了按需加载。

3.4 效果确认

  可以看到,除了加载开头的几个分片之外(这几个分片中包含pdf元数据,目录等),不会再加载其它。只有等到要访问某个页面的时候,才会接着发起请求,做到了按需加载。如下图所示。

clip_image006

4 参考资料

Range - HTTP | MDN

PDF.js

转载于:pdfjs优化,实现按需加载,节省流量和内存 - 何德海 - 博客园 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pdfjs优化,实现按需加载,节省流量和内存 的相关文章

随机推荐

  • 毕业设计-基于 Matlab 的蚁群算法求解旅行商问题

    目录 前言 课题背景和意义 实现技术思路 一 蚁群算法原理 二 蚁群算法 三 蚁群算法的应用 基于蚁群算法求解旅行商问题 四 有关算法实现的部分程序展示 五 生成数据以及部分图形显示 代码部分 实现效果图样例 最后 前言 大四是整个大学期间
  • [docker]nvidia容器内nvidia driver,cuda driver,cuda toolkit的关系

    下图对三者的关系进行了表述 我们安装的显卡驱动是在主机上的 包括显卡驱动和CUDA driver 我们安装的CUDA则主要是CUDA toolkit 需要另外在docker容器内安装 或者 也可以直接拉取nvidia docker的镜像 参
  • Django N+1 ORM问题以及优化实现

    N 1 问题 理解 yH N 1 问题 理解实现 yH 直接上各段代码的试验 来源 QuerySet API 参考 Django 文档 Django models from django db import models from xxx
  • LeetCode-11

    11 盛最多水的容器 给你 n 个非负整数 a 1 a 2
  • [计算机毕设]基于java的题库及试卷管理系统设计与实现(源代码+项目报告)

    项目说明报告 Smart系统 题库及试卷管理模块的设计与开发 SMART系统是一个采用新思路 新架构 新技术开发出来的一个新型智能在线考试信息管理系统 该系统主要实现了学生在线考试与评估以及对各种评估信息的管理和维护 本文针对教育工作的具体
  • BES2300x笔记(13) -- 主从耳关键log解析

    哈喽大家好 这是该系列博文的第十三篇 篇 lt lt 系列博文索引 快速通道 gt gt 一 前言 对于BES平台 因为没有可视化的IDE 所以串口log就成了我们Debug时的主要辅助手段 通过添加串口打印信息 几乎可以调试我们开发时遇到
  • 企业监控服务器Cacti、nagios服务器

    Cacti监控服务器入门详解 作为一名Linux SA 日常最重要的就是保证网站正常稳定的运行 我们需要实时监控网站 服务器的运行状态 这时需要借助开源软件 cacti nagios zabbix等 监控来实现 Cacti是用php语言实现
  • 2021年4月记录(整合redis,springboot加载配置文件顺序)

    1 springboot 2整合redis 参考 1 1 连不上redis 改redis配置Unable to connect to Redis nested exception is io lettuce core RedisConnec
  • c++ 优先级队列priority_queue的使用

    c priority queue是对其他容器元素顺序的调整包装 堆的原理 1 定义 priority queue
  • Mac neo4j忘记密码,不删除数据处理方法

    首先进入neo4j的目录 比如 cd Users hhhhh Software neo4j community 4 3 3 如果neo4j启动 需要关闭neo4j服务 bin neo4j stop 然后打开配置文件 修改一下设置 vim c
  • PHP数据类型转换

    http www blogjava net zuofei bie archive 2010 03 31 317092 html PHP的数据类型转换属于强制转换 允许转换的PHP数据类型有 int integer 转换成整形 float d
  • 大模型系列活动现已开放全球讲者报名通道

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 AI TIME大模型系列活动定期特邀来自全球知名高校与研究机构的青年学者 分享最新大模型前沿动态 思辨大模型未来之路 今年以来 已邀请海内外150多位讲者 沉淀了近50场大模型系
  • SpringBoot整合调用微信模板方法实现微信公众号消息通知推送,Java实现微信公众号给关注用户推送自定义消息通知(手把手从0到1)

    目录 概述 公众号给关注用户推送自定义消息 一 申请公众号模板消息 二 获取安装 web开发者工具 三 微信网页授权说明 四 微信网页授权 流程时序图 五 HTTPClient 实现微信公众号消息推送与发布 四步走 六 通过weixin j
  • [转][QNX]对存储设备分区

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 email 174176320 qq com 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 命令格式 fdisk
  • acwing蓝桥杯刷题

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 第一讲 递归与递推 1 递归实现指数型枚举 2 递归实现排列型枚举 3 简单斐波那契 4 费解的开关 5 递归实现组合型枚举 6 带分数 7 飞行员兄弟 8 翻硬币 9 总结
  • WSL2文件迁移到D盘

    查看当前wsl 通过输出看到当前的wsl名称是Ubuntu wsl l 适用于 Linux 的 Windows 子系统分发版 Ubuntu 默认 导出 导出到D盘 文件名为ubuntu tar 这里需要等一段时间 wsl export Ub
  • CS安装卸载测试总结

    最近在执行C S控制客户端安装卸载的测试 通过自己的测试经历和网上的资料 总结以下安装卸载测试点 安装测试 1 GUI测试 安装过程中所有的界面显示 提示信息等是否正确 2 兼容性测试 在不同的操作系统 不同配置的主机上能否正常安装 3 安
  • 从 Microsoft Dynamics CRM 4.0 server迁移到 Microsoft Dynamics CRM 2013 Server

    不能就地升级早于 Microsoft Dynamics CRM Server 2011 的版本号 比方 Microsoft Dynamics CRM 4 0 server 可是 能够在升级过程中使用 Microsoft Dynamics C
  • ssd颗粒查看工具_SSD又降价了,但是使用前一定要做这几件事

    前段时间是618大促 各品类产品都开启了促销模式 SSD也是如此 相信不少朋友都买了SSD 来为系统加速 没来得及上车的玩家也不要伤心 根据业界的预测 接下来SSD价格还要走低 第三季度闪存价格又要陷入一个跌价周期 预计下滑5 以内 而第四
  • pdfjs优化,实现按需加载,节省流量和内存

    1 问题 当使用pdfjs来实现预览功能的时候 遇到了2个问题 一是带宽占用过大 会下载整个pdf文件 这对部署在公网的应用来说 成本压力很大 因为云服务带宽是很贵的 二是内存占用过大 一个80M的pdf 在预览时占用内存高达600M 在一