当前位置: 首页 > news >正文

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览,使用pdf.js-dist进行加载

一、应用场景

在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求,原来的系统业务部门是在PC端进行PDF的预览与展示,但是现在设备进行了切换,改成了安卓一体机进行文件预览。因此出现了PDF文件无法显示的问题,此前使用的是vue-pdf插件和PDFObject插件实现的预览,所以这两个插件是无法实现PDF预览了,改为了pdfjs-dist进行PDF的预览。

二、实现方法

法一:通过js代码实现预览

该方法适用于预览后端返回的文件流内容,但是此方法是将pdf展示在画布上,因此无法选中或复制文本内容。

1、定义一个容器用来展示PDF

这个容器可以是div,也可以是canvas,由于pdfjs渲染pdf文件是一页一页进行展示的,因此需要循环进行展示。

<template><div><canvas v-for="pageIndex in pdfPages" :id="`pdf-canvas-` + pageIndex" :key="pageIndex" style="display: block;width:100%"></canvas></div>
</template>
2、加载pdf

由于我这边的文件来自于后端返回的文件流,因此我需要将base64进行转换后进行展示。

<script lang="ts" setup>
import { getDocument } from 'pdfjs-dist'
import * as pdfjsLib from 'pdfjs-dist'
import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.mjs'
let pdfDoc = reactive({}); // 保存加载的pdf文件流
let pdfPages = ref(0); // pdf文件的页数
let pdfScale = ref(1.0); // 缩放比例const pdfLoader = async () => {//...此处为接口请求,返回的res.data.result.fileByte为pdf的文件流内容pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf.worker.min.js';const blob = new Blob([res.data.result.fileByte], { type: 'application/pdf' });let arrayBuffer = base64ToBuffer(res.data.result.fileByte);const loadingTask = pdfjsLib.getDocument(arrayBuffer);loadingTask.promise.then((pdf) => {pdfDoc = pdf; //获取pdf文档流pdfPages.value = pdf.numPages; //获取pdf文件的页数renderPage(1);//从第几页开始渲染});
}
//渲染pdf文件
const renderPage = (num) => {pdfDoc.getPage(num).then((page) => {const canvasId = 'pdf-canvas-' + num;const canvas = document.getElementById(canvasId);const ctx = canvas.getContext('2d');const dpr = window.devicePixelRatio || 1;const bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;const ratio = dpr / bsr;const viewport = page.getViewport({ scale: pdfScale.value });canvas.width = viewport.width * ratio;canvas.height = viewport.height * ratio;canvas.style.width = viewport.width + 'px';canvas.style.height = viewport.height + 'px';ctx.setTransform(ratio, 0, 0, ratio, 0, 0);const renderContext = {canvasContext: ctx,viewport: viewport,};page.render(renderContext);if (num < pdfPages.value) {renderPage(num + 1);}});
};
</script>

法二:通过内置的viewer.html文件进行预览

该方法适用于pdf在本地,或者是通过后端返回url链接的,操作比较简单, 不需要操作API,而且可以复制pdf中的文本内容,如果需要修改部分功能的话,可以直接修改html中的代码进行实现。

1、下载pdf.js官方插件

打开官网的链接(链接地址),找到下方的Stable按钮,下载稳定版本的插件包。

在这里插入图片描述

2、将下载后的文件放到项目中

将下载后的压缩包解压后,会看到这两个文件夹,将这两个文件夹添加到项目中。

在这里插入图片描述

其中在web文件夹中有一个viewer.html文件,下面将借助这个封装好的文件实现pdf的预览。实现原理是将文件的路径传给viewer.html,从而解析该文件进行预览。

如果你的文件在本地,那么可以把这个文件放到与viewer.html同一个路径下,然后实现预览。

window.open("./js/pdfJS/web/viewer.html?file=/pdf/files/compressed.tracemonkey-pldi-09.pdf");//注意路径是否正确

如果你的文件是通过后端拿到的URL,那么需要修改后面的pdf文件的路径,注意需要提前将路径转码。

let fileUrl = encodeURIComponent('http:.....xxx.pdf') //将路径转码
window.open("http:...viewer.html?file=" + fileUrl);

三、注意事项

pdf.js无法直接在本地预览文件,需要启动服务器才能运行,例如tomcat、live-server 插件等。查阅相关资料后,发现是因为 pdf.js 渲染 pdf 文档时使用了 Web Worker 技术,该 Web Worker 无法读取本地文件。

相关文章:

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…...

面试域——面试系统工程

摘要 1. 当前就业面试场景 1.1. 招聘市场的“551 定律” 你知道招聘市场的“551 定律”吗&#xff1f; 551 定律&#xff1a;每一层筛选环节都会有百分之十的折损率。一个岗位从接收简历到发下 Offer 至少要筛选 500 份左右的简历、面试 50 人左右、只有 5 人左右通过面试&am…...

PHP-FPM 性能配置优化

4 核 8 G 服务器大约可以开启 500 个 PHP-FPM&#xff0c;极限吞吐量在 580 qps &#xff08;Query Per Second 每秒查询数&#xff09;左右。 Nginx php-fpm 是怎么工作的&#xff1f; php-fpm 全称是 PHP FastCGI Process Manager 的简称&#xff0c;从名字可得知&#xff…...

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入&#xff08;也称为延时注入&#xff09;是SQL注入攻击的一种特殊形式&#xff0c;它属于盲注&#xff08;Blind SQL Injection&#xff09;的一种。在盲注中&#xff0c;攻击…...

Unity - UGUI动静分离

原理&#xff1a;UGUI 是基于Canvas来进行合并计算的 1.不同Cavans的UI元素&#xff0c;是无法合批渲染&#xff0c;无法实现同一个drawcall 2. 每次合批的时候&#xff0c;会合并计算Canvas下所有的UI元素 , 具体流程: Step1: 对Cavans下所有的UI元素进行合批计算 Step2: …...

arm 体系架构-过程调用约定

ref&#xff1a; ARM体系结构学习笔记&#xff1a;过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-CSDN博客 ARM软件逆向工程入门 01 - ARM调用约定&#xff08;Calling Convention&#xff09;_armv7函数调用约定-CSDN博客 ARM学习&#xff08;17&…...

STM32基于LL库的USART+DMA使用

时隔两年半再次更新LL库&#xff0c;本次带来USART DMA 实现接收不定长。 1、开发思路 使用USART DMA接收不定长的功能的思路是&#xff1a;借助USART的空闲中断、DMA发送完成中断。 打开F103的手册可得知&#xff0c;USART的空闲中断触发条件是在接收完成后触发&#xff0…...

设计模式06-结构型模式1(适配器/桥接/组合模式/Java)

#1024程序员节&#xff5c;征文# 4.1 适配器模式 结构型模式&#xff08;Structural Pattern&#xff09;的主要目的就是将不同的类和对象组合在一起&#xff0c;形成更大或者更复杂的结构体。结构性模式的分类&#xff1a; ​ 类结构型模式关心类的组合&#xff0c;由多个类…...

【损害和风险评估&坑洼】路面坑洼检测系统源码&数据集全套:改进yolo11-DCNV3

改进yolo11-DLKA等200全套创新点大全&#xff1a;路面坑洼检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…...

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…...

gitlab 配置ssh keys

settings -- 终端配置&#xff1a; git config --global user.email "yxthotmail.cm" 配置gitlab 账号邮箱 git config --global user.name "xt.yao" 配置gitlab账号用户名 生成SSH key&#xff0c;输入命令ssh-keygen -t rsa&#xff0c;一直按回车…...

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列&#xff0c;PDF转换为图片工具的开发实战&#xff0c;感兴趣的朋友可以一起来学习一下&#xff01…...

我有两台120kw充电桩一天能赚多少钱

&#xff08;当前是理想状态下&#xff0c;当然还要看场地费用&#xff0c;还有物业&#xff0c;变压器&#xff0c;等等&#xff09; ———————————————————— ———————————————————— 要计算两台120kW充电桩能赚多少钱&#xff0c;我们…...

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…...

stable-zero123模型构建指南

一、介绍 stabilityai出品&#xff0c;能够对有简单背景的物体进行三维视角图片的生成&#xff0c;简单来说也就是通过调整变换观察的视角生成对应视角的图片。 本项目通过comfyui实现。 二、容器构建说明 1. 部署ComfyUI &#xff08;1&#xff09;使用命令克隆ComfyUI g…...

算法题解记录32+++最长连续序列(百题筑基)

你们好&#xff0c;我是蚊子码农&#xff0c;好久不见。由于秋招求职的繁琐事情&#xff0c;我有很长一段时间没更新博客&#xff0c;希望我的粉丝们能够谅解。 秋招我拿到了一些offer&#xff0c;最终决定去一个主要做“网络安全”业务的公司工作&#xff0c;也许明天会更好&a…...

全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家

全国给孩子起名最好的大师颜廷利教授在其最新的哲学探索中&#xff0c;提出了《升命学说》这一前沿理论观点&#xff0c;该理论不仅深刻地回应了古今中外众多哲学流派和思想体系的精髓&#xff0c;还巧妙地融合了实用主义、理想主义以及经验主义的核心理念。通过这一独特的视角…...

Flink Rest API

REST API | Apache Flink Flink官网API 通过curl 或者Rest API工具测试web UI对应的接口返回信息 Flink 提交yarn任务 ./bin/flink run -t yarn-per-job historyServer ../bin/historyserver.sh start...

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器&#xff1a;逻辑&#xff0c;冒烟测试版发布二 Zig 语言是一种新的系统编程语言&#xff0c;其生态位类同与 C&#xff0c;是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust&#xff0c;尤其是在开发过程中无穷无尽抛错的过程&#x…...

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求&#xff1a; 我想知道同一个手机号出现几次&#xff0c;并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…...

物联网接入层技术剖析(四):当epoll遇见MQTT

Netty与高性能网络服务、Linux高并发网络编程实战、从epoll到Netty&#xff1a;物联网接入层技术剖析、深入理解I/O多路复用、服务端网络编程进阶指南 Netty与物联网&#xff1a;当epoll遇见MQTT 0 写在前面 这个系列写了三篇&#xff0c;从 select 到 epoll&#xff0c;从内…...

面试官问CyclicBarrier和CountDownLatch区别?这样回答直接拿Offer(附源码级对比和避坑点)

面试官问CyclicBarrier和CountDownLatch区别&#xff1f;这样回答直接拿Offer&#xff08;附源码级对比和避坑点&#xff09; 在Java并发编程的面试中&#xff0c;CyclicBarrier和CountDownLatch的区别几乎是必问的高频考点。但真正能打动面试官的&#xff0c;绝不仅仅是背诵教…...

城通网盘下载速度慢?3分钟学会ctfileGet终极免费提速方案

城通网盘下载速度慢&#xff1f;3分钟学会ctfileGet终极免费提速方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经被城通网盘的龟速下载折磨得抓狂&#xff1f;面对50KB/s的限速、无尽的验…...

50 ubuntu22.04

联系IT&#xff0c;制作U盘启动盘 进BIOS关闭安全启动 格式化磁盘&#xff1a;https://blog.csdn.net/zhg2546179328/article/details/136223186 系统安装&#xff0c;并配置&#xff1a;https://blog.csdn.net/m0_75114321/article/details/155456810...

SwinFusion论文精读与代码复现:拆解‘跨域远程学习’如何让图像融合效果开挂

SwinFusion技术解析&#xff1a;跨域远程学习如何重塑图像融合范式 图像融合技术正经历一场由Transformer架构引领的范式变革。传统方法在全局依赖建模和跨域交互方面的局限性&#xff0c;催生了基于Swin Transformer的创新解决方案。本文将深入剖析SwinFusion这一通用图像融合…...

“冠珠·美乐童行”公益行动走进广州市增城区高滩小学,唱响爱、筑就美

在520爱家日十周年之际&#xff0c;冠珠瓷砖积极响应国家美育浸润与乡村教育振兴的政策号召&#xff0c;暖心开启 “冠珠美乐童行”公益行动。首站活动由冠珠瓷砖、广州市越秀山体育中心共同主办&#xff0c;以 “乐动童心美育同行” 为主题&#xff0c;走进广州市增城区高滩小…...

三年级下册语文第四单元作文:中华传统节日

三年级下册语文《中华传统节日》作文&#xff0c;一般会写&#xff1a;春节元宵节端午节中秋节重点不是介绍很多知识&#xff0c;而是&#xff1a; ✅ 节日习俗 ✅ 自己的经历 ✅ 节日气氛 ✅ 感受我用夸克网盘分享了「三年级下册语文作文1-8单元」&#xff0c;链接&#xff1a…...

AI赋能·精准适配——API风险监测系统筑牢教育数据流转安全防线

一、概要提示&#xff1a;本文围绕数据流转安全与静态数据安全的核心差异&#xff0c;结合教育行业数字化转型特性&#xff0c;系统阐述API风险监测系统的核心逻辑、核心能力、常见疑问及发展趋势&#xff0c;全面呈现系统在教育场景中的数据化应用成效&#xff0c;凸显“AI赋能…...

通过curl命令快速测试Taotoken上不同大模型的响应效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken上不同大模型的响应效果 对于开发者而言&#xff0c;在集成大模型能力时&#xff0c;快速验证接口连…...

Image2.0生成的PPT图片转换成可编辑的PPT的一种方法

老弟&#xff0c;PPT不想做&#xff0c;用AI生成的PPT图片编辑不了很烦恼是吧&#xff0c;俺有一法&#xff01;~ Edit Banana&#xff08;最强&#xff0c;开源免费&#xff09; 能把 AI 图→可编辑 PPTX / DrawIO / SVG 原理&#xff1a;用 SAM 分割图标 / 形状&#xff0c;用…...