【PDF.js】PDF文件预览

网页在线打开PDF_网站中在线查看PDF之pdf.js pdf.js 使得不需要在计算机上安装 Adobe Reader 或其他 PDF 阅读器就可以在 Web 上阅读 PDF 文档成为可能。pdf.js 是社区驱动的,并由 Mozilla 支持。我们的目标是为解析和呈现 PDF 创建一个通用的、基于 Web 标准的平台。pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素。PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。使用方案:file=(指定自己的pdf文件地址即可)pdf.js是一个免费的开源软件。 阅读详情
AI摘要

本文介绍了如何在Vue项目中使用PDF.js实现PDF文件的预览,包括下载库、引入方法、跨域问题的解决,以及如何动态调整文件预览区域大小和响应式布局。


使用PDFJS实现pdf文件的预览,支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。

一、PDF.js

官方地址
文档地址

二、PDF.js 下载

1、下载PDF.js

下载地址

在这里插入图片描述

2、在项目中引入

将下载的压缩包解压并放入到项目中的public文件夹下,我这里下载的是pdfjs-4.0.379-dist版本,如下
在这里插入图片描述

3、屏蔽跨域错误

在 pdfjs-4.0.379-dist/web/viewer.mjs 内搜索 throw new Error(“file origin does not match viewer’s”) 并注释,如果不注释,可能会出现跨域错误,无法正常预览文件。
在这里插入图片描述

三、项目中使用

内容区域结构(文件预览区域、滑块区域、问答区域)
滑块区域:滑动改变pdf文件预览区域的大小

<div
    v-if="filePreviewStore.getFilePreviewFlag"
    ref="resizeBox"
    class="resize"
    @mousedown="onResizeMouseDown"
  />
<el-main ref="mainContent" class="main-content">
  <!-- 文件预览区域 -->
  <div
    v-if="filePreviewStore.getFilePreviewFlag"
    class="preview-box"
    :style="{width: `${previewBoxWidth}px`}"
  >
    <!-- <PdfPreview v-if="['ppt', 'pptx', 'pdf'].includes(filePreviewStore.getFileType)" /> -->
    <PDF v-if="['ppt', 'pptx', 'pdf'].includes(filePreviewStore.getFileType)" />
    <ExcelPreview v-if="['xls', 'xlsx'].includes(filePreviewStore.getFileType)" />
    <WordPreview v-if="['doc', 'docx'].includes(filePreviewStore.getFileType)" />
    <TxtPreview v-if="filePreviewStore.getFileType === 'txt'" />
  </div>
  <div
    v-if="filePreviewStore.getFilePreviewFlag"
    ref="resizeBox"
    class="resize"
    @mousedown="onResizeMouseDown"
  />
  <!-- 问答区域 -->
  <div class="main_side3 flex1 column-flex">
    <div class="show_content flex1" ref="chatShowRef"> <ChatShow /> </div>
    <div class="chat">
      <askInput />
    </div>
  </div>
</el-main>

下面是PDF组件完整代码

<template>
  <div class="container">
    <iframe id="myIframe" :src="pdfUrl" width="100%" height="100%"></iframe>
  </div>
</template>

<script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
import { useFilePreviewStore } from "@/stores";
import { fileRouteUrl } from "@/utils/fileRouteUrl"

const filePreviewStore = useFilePreviewStore()
const pdfUrl = ref('') // pdf文件地址
const fileUrl = '/static/dist/pdfjs-4.0.379-dist/web/viewer.html?file=' // pdfjs文件地址

onMounted(() => {
  // encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
  // 核心就是将 iframe 的 src 属性设置为 pdfjs 的地址,然后将 pdf 文件的地址作为参数传递给 pdfjs
  // 例如:http://localhost:8080/pdfjs-4.0.189-dist/web/viewer.html?file=http%3A%2F%2Flocalhost%3A8080%2Fpdf%2Ftest.pdf
  const url = filePreviewStore.getFileUrl.replace(fileRouteUrl, '/file')
  pdfUrl.value = fileUrl + encodeURIComponent(url) + `&page=${filePreviewStore.getPageNum}`
})

// 当文档页码修改时,重新预览当前页的文档内容
watch(() => filePreviewStore.getPageNum,
  (val) => {
    if (val) {
      // 页码修改时,需要重新保存记录文档页码,否则会出现点击与第一次相同的页码时,不会切换
      filePreviewStore.setFilePage(val)
      const pdfFrame = document.getElementById('myIframe').contentWindow
      // 传递参数,跳转到指定页
      pdfFrame.PDFViewerApplication.pdfViewer.scrollPageIntoView({
        pageNumber: val
      })
    }
  }
)

// 当预览的文件地址修改时,预览新的文档
watch(() => filePreviewStore.getFileUrl,
  (val) => {
    if (val) {
      // 服务器文档地址
      const pdfFileUrl = val.replace(fileRouteUrl, '/file');
      // 加载PDF文件
      pdfUrl.value = fileUrl + encodeURIComponent(pdfFileUrl) + `&page=${filePreviewStore.getPageNum}`
    }
  }
)

</script>

<style scoped lang="less">
.container {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  box-sizing: border-box;
  #myIframe {
    border: none;
  }
}
</style>

四、说明

1)在文件地址后面添加参数page(预览指定页)
在这里插入图片描述
2)在 pdfjs-4.0.379-dist/web/viewer.mjs中的setInitialView方法中添加如下代码
在这里插入图片描述
3)改变文件预览区域的宽度

// 修改左侧文件预览区域的宽度
const previewBoxWidth = ref(0)
const mainContent = ref()
const resizeBox = ref()
const mainContentWidth = ref(0)
const onResizeMouseDown = (e: MouseEvent) => {
  const startX = e.clientX
  resizeBox.value.left = resizeBox.value.offsetLeft
  // 解决预览pdf文档时,鼠标移入iframe后,无法捕获移动和抬起操作
  const myIframe = document.querySelector('iframe')
  myIframe && (myIframe.style['pointer-events'] = 'none')
  const onDocumentMouseMove = (e: MouseEvent) => {
    const endX = e.clientX
    const previewWidth = resizeBox.value.left + (endX - startX) - side1Width.value - 20
    // 文件预览区域宽度最小为内容区域的30%,最大为内容区域的70%
    if (previewWidth >= mainContentWidth.value * 0.7) {
      previewBoxWidth.value = mainContentWidth.value * 0.7
    } else if (previewWidth <= mainContentWidth.value * 0.3) {
      previewBoxWidth.value = mainContentWidth.value * 0.3
    } else {
      previewBoxWidth.value = previewWidth
    }
  }

  const onDocumentMouseUp = () => {
    myIframe && (myIframe.style['pointer-events'] = 'auto')
    document.removeEventListener('mousemove', onDocumentMouseMove)
    document.removeEventListener('mouseup', onDocumentMouseUp)
    resizeBox.value.releaseCapture && resizeBox.value.releaseCapture()
  }

  document.addEventListener('mousemove', onDocumentMouseMove)
  document.addEventListener('mouseup', onDocumentMouseUp)
  resizeBox.value.setCapture && resizeBox.value.setCapture()
}

// 
const { width } = useWindowSize() // 响应式获取窗口尺寸
// 当浏览器窗口尺寸改变时,重新修改设置文件预览区域的宽度
watch(() => width.value,
  (val) => {
    val && (previewBoxWidth.value = mainContentWidth.value * 0.7)
  }
)

// 获取内容区域的宽度
useResizeObserver(mainContent , (entries) => {
  const entry = entries[0]
  const { width } = entry.contentRect
  mainContentWidth.value = width
})

这里需要注意,因为在PDF组件中使用了iframe,当鼠标移入iframe区域时,无法捕获到鼠标的移动和抬起动作,会出现鼠标移出iframe区域后有可以改变该区域宽度,解决办法如下:
在这里插入图片描述

五、实现效果

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2b286a949f564cd8958e352b8afe50b9.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7fc5171aca4e4542b6817910ecab54e9.png

vue2中使用pdf.js浏览pdf文件,包括pdf显示、跳转指定页面、高亮关键词等功能 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考虑手机上面的,最好下载低版本的,这里是v2.16.105版本。出现这个错误就是跨域的问题,找到pdfjs/web/viewer.js文件,注销跨域代码就可以。利用 web里面的viewer.html就可以直接打开pdf,里面有默认的一个pdf文档。在本地static里面创建文件夹pdfjs,然后将下载包里面的文件放进pdfjs。根据pdf.js内置函数,可直接修改当前页面,没有太大的跳动,利用Iframe。比如按照以上步骤方法为。 阅读详情

相关推荐

pdf.js 使用实例以及实现过程中碰到的问题

** pdf.js 使用实例以及使用过程中碰到的问题 ** pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件 pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 项目中使用pdf.js实现pdf在线预览 的功能,浏览过不少的技术帖,感觉技术点都比较零散,花了点时间总结了下我在使用pdf.js的过程,总结下:1.防止自己忘记 2.供大家参考借鉴 一、下载方式: 1.官方下载:http://mozilla

weixin_45611625的博客 2571

PDF.js简介

pdf.js 是一个由 Mozilla 开发的 JavaScript 库,可以在 Web 浏览器中显示 PDF 文档。pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素,并使用 JavaScript 控制文档的呈现和交互。pdf.js 使得不需要在计算机上安装 Adobe Reader 或其他 PDF 阅读器就可以在 Web 上阅读 PDF 文档成为可能。pdf.js是一个免费的开源软件,使用和修改都非常方便。

github_36738403的博客 2万+

pdf.js使用(在线预览pdf文件)

最近公司需要pdf在线预览,于是找到pdf.js这个插件 , 好处就在于 pc端和移动端 不需要花过多的精力去调。 1:需要到官网下载源码:https://mozilla.github.io/pdf.js/          2:将源码加入到项目中目录如下: 在web下有如下: 这里我们需要改动viewer.js ,打开其中有一段: 只需要将DEFAULT_URL  默认值去

chen_3010的博客 8万+

PDF.js介绍以及使用

总的来说,PDF.js提供了一种在Web浏览器中展示和操作PDF文件的解决方案,使用户能够直接在浏览器中浏览和使用PDF,而无需依赖外部的PDF阅读器插件或专门的PDF编辑工具。PDF.js是一个JavaScript库,可以在现代Web浏览器中渲染和显示PDF文件。同时,需要确保PDF.js和相关依赖的正确引入,以及正确指定PDF文件的路径和文件名。这段代码是使用PDF.js库在浏览器中显示PDF文件的示例。// 将PDF页面渲染到元素中。// 将元素添加到容器中。

php-yyds 2万+

openOffice+pdf.js文件在线预览

openOffice+pdf.js在线预览

故小曲啊 1599

利用 pdf.js 实现在前端预览 .pdf 文件

目录 1. 下载地址: 2. 任务描述: 3. 测试流程: 4. 代码内容: 1)pdf 转成 base64 编码方法,filePath 指定文件路径 2)base64 编码转成 pdf 方法 3)前端 HTML 文件,利用 iframe ,指定 src 的路径 4)Js文件,这边可能需要根据自身的实际情况改动 5. 效果图: 6. 缺陷: 注:有些注释可能不够权威,大家发现...

qq_35420936的博客 13万+

js在线预览pdf文件

js在线预览PDF文件  一、效果预览 二、实现代码: js图片在线预览 //预览PDF文件 function preViewPDF(obj){ var fileUrl=$(obj).attr("fileUrl"); var title=$(obj).attr("title"); $("#pdfDiv").attr("src",fi

八月长安w的博客 3991

JavaScript实现PDF文件在线预览实战指南

还允许我们自定义工具栏和页面控制选项,这包括添加或隐藏旋转按钮、缩放控件、页面导航器等。这些控制选项可以被放置在页面的任意位置,并可以定制样式以融入网站的整体风格。在这个代码示例中,方法创建了一个新的按钮,我们可以通过x和y属性来设置按钮的位置,通过width和height来定义按钮的尺寸,和fontColor则分别设置了按钮的背景和文字颜色。这样,我们不仅优化了PDF文档的显示效果,还增加了页面的互动性,提升了用户体验。

weixin_42515340的博客 894

一篇文章教你使用 PDF.JS 在线预览 PDF (本地文件,服务器文件)

前言   最近开发项目时有个需求是在线预览 PDF 文件,然后百度了好久选出来一个功能比较强大并且好用的插件 PDF.JS,GitHub 下载地址(不知道最近咋了每次都想唠一会水一会)差点忘了说了,本文主要是讲使用过程中的常见错误,嗯,次要是讲咋使用 安装   下载版本的话我们下在稳定版本的就可以了,没必要非追求最新版,当然也可以下载最新版本的,用法都一样,下载好了之后就找一个位置解压就可以了,或...

平凡的人类的博客 2万+

SpringBoot+Maven打包实战:把项目变成SDK供其他团队调用

本文详细介绍了如何将SpringBoot项目改造并打包成可被其他项目依赖的SDK。通过调整Maven配置,剥离SpringBoot父依赖与启动类,并定制打包插件,最终生成标准的JAR依赖库,实现从“可执行应用”到“组件化SDK”的优雅转变,便于团队间功能复用。

assembly8low的博客 826

医药领域知识图谱快速及医药问答项目(项目全过程)

该项目是中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目 Github项目地址:mirrors / liuhuanyong / qasystemonmedicalkg · GitCode 一、项目环境搭建 该部分要十分注意,由于版本升级的问题,一些用法及格式已经不兼容了。 python3.8 下载地址:Python Release Python 3.8.10 | Python.orght...

qq_52062182的博客 9916

pdf.js预览pdf文件流(base64)

pdf.js预览pdf文件流(base64)

西洲 1万+

网络系统实现技术之IPX与SPX

IPX/SPXNovell NetWare网络Novell公司为适应网络发展,将主机网络转换为PC网络,开发了Novell NetWare网络系统。该系统中基于客户机/服务器模式。以普通PC机做为客户机,以性能强大的服务器做为服务器,为客户机提供文件服务、数据库服务及其他服务。与前面的SNA模型一样,Novell NetWare也早于OSI模型,所以不能与OSI模型严格对应,但也有很明

成片的大树 9164

前端使用PDF.js把返回的base64或二进制文件流格式,实现pdf文件预览

PDF.js是一个JavaScript库,可在浏览器中无插件显示PDF文件,提供缩放、翻页、文本搜索等功能。本文介绍了其基本使用方法和示例代码,如添加翻页和搜索功能。下面会把简单时间文件预览的代码呈现出来,如果您想要进一步优化和学习PDF.js,可以打开。我这个举例的项目是一个H5,但是引入的有vue,所以写法是在H5的页面使用vue;上面代码只是简单的展示出来文件,没有实现分页,和缩放,如果需要可以自己去查询一下;如果您使用的是纯vue项目可以通过npm/pnpm/yarn安装依赖。

前端探险家的博客 3503

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2146

【AVRCP】规范精讲[19]: 媒体属性全解析,让你的蓝牙设备显示完整歌曲信息

AVRCP协议中的媒体属性是蓝牙音频设备传输歌曲元数据的关键,包含标题、艺术家、专辑等32位ID标识的键值对信息。规范要求字符串属性必须使用UTF-8编码,但乱码问题频发(如中文显示异常),主因是设备未遵循编码标准或使用GBK等非规范格式。常见问题包括信息不全(仅显示标题)、封面缺失(因带宽限制或格式不支持)及更新延迟(通知机制未启用)。解决方案包括强制UTF-8编码、优化封面大小(如300x300像素JPEG)、主动请求缺失属性。Android示例代码展示了通过广播接收器解析媒体属性的方法。

byte轻骑兵的技术小窝 1万+

pdf.js前端插件——在线预览PDF文件的利器

pdf.js前端插件——在线预览PDF文件的利器 【下载地址】pdf.js前端插件在线预览PDF文件的利器 pdf.js前端插件是一款专为在线预览PDF文件而设计的强大工具,无需下载或安装额外软件即可在网页上直接浏览PDF内容。只需简单调用代码,即可实现PDF文件的在线查看,操作便捷,适合各类网页应用。该插件支持大多数主...

gitblog_06785的博客 787

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

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

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

VT_馒头的博客 1万+

Labview如何0基础自学快速入门?(纯干货帖)

讲解了如何学习Labview,Labview如何0基础入门,自学Labview的方法。什么都不会如何学好Labview的分享,欢迎关注文章~文章提供《Labview宝典》pdf下载,和《Labview虚拟仪器数据采集与通信控制》pdf下载

关注我,更多技术问题欢迎私聊~ 2万+

YOLO11 改进系列 | 引入2023年 MLCA 的 C3k2_MLCA 模块,近零参数开销的本地-全局通道注意力,适合检测与分割特征增强

本文提出将MLCA(混合局部通道注意力)模块嵌入YOLOv11的C3k2框架中,形成C3k2_MLCA改进结构。该模块通过5×5局部池化和1×1全局池化双路融合,结合ECA式Conv1d生成通道注意力,在几乎不增加参数量的前提下(仅增加66个参数),实现了局部空间信息与全局通道统计的联合建模。相比传统SE和ECA注意力,MLCA保留了空间分布信息,更适合实例分割等需要精细定位的任务。实验表明改进后模型参数量仅增加0.002%,计算量基本不变,是一种高效的注意力增强方案。

qq_44224801的博客 92

读取解析预览pdf文件的插件之pdf.js

最近有这样一个需求,需要在线预览pdf文件,于是就去找这方面的插件。最后筛选了一下,选择了pdf.js这个插件。 我们先看一下pdf.js定义: pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件 pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 pdf.js本质上是用canvas渲染的,p...

时清云的博客 4395

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SpringBoot使用pdf.js实现pdf文件在线预览

1、pdf.js下载地址 https://github.com/mozilla/pdf.js 2、文件目录如图示例 针对于pdf方面有用的只是pdf这个包下面,和viewer.html这个html页面 3、viewer.html是我们用来展示pdf的页面不需要改 4、但是viewer.js中有些东西使我们需要注意的 (1)webViewerInitialized()这个方法 ...

南巷清风 2906

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pdf.js在线预览demo:实现浏览器内PDF文件预览的利器

pdf.js在线预览demo:实现浏览器内PDF文件预览的利器 【下载地址】pdf.js在线预览demo 这是一个基于pdf.js的在线PDF预览工具,无需复杂配置,直接在浏览器中即可运行。通过这个简洁的示例demo,您可以快速体验并实现PDF文件的在线预览功能,适合开发者快速集成到自己的项目中,提升用户体验。无论是学习...

gitblog_06789的博客 1049

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

在线预览pdf文件,使用pdf.js

1. 下载pdf.js pdf.js官方下载地址 2. 解压 3. 运行启动 项目在本地环境(url以file://开头)无法运行,需要服务器环境。 使用nginx,修改配置文件 nginx安装目录/conf/nginx.conf server { listen 8888; location / { root D:/studyspace/pdfjs-2.5.207-dist; } location /pdf/ { proxy_pass http://127

AdleyTales的技术博客 2550

PDF.JS PDF文件预览插件

前言 本篇文章主要介绍一款好用的pdf预览插件pdf.js,使用方式简单只要参考官网实例即可。 PDF.js使用教程 下载pdf.js PDF.js下载链接 引入pdf-js <!-- pdf.js 文件预览--> <div th:fragment="pdf-js"> <script th:src="@{/ajax/libs/pdfjs-2.2.228-dist/b...

DMW2016的博客 2535
上一篇: vue自定义懒加载指令
伦为JAY下囚
博客等级 码龄7年 52粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值