pdfjs-dist的进阶使用:手动触发pdf文件跳转到指定页码

链接

与此相关的文章地址:

背景

通过前面几篇文章中的路线,其实已经实现了使用pdfjs-dist来预览PDF,它与我们通过pre标签等简单预览的直接区别就是:可以包含的功能比较多,如页面跳转、搜索、打开导航窗格等等,就是一个完整的pdf功能。

那么问题来了,在这个插件中进行页面跳转各种操作都行。现在需要在**外部来触发插件内部的事件,实现pdf文件的页面定位**。

举个例子就是:

javascript 复制代码
<button>页面跳转</button>

<iframe id="pdf-container" url="http://pdf-server/show.pdf"></iframe>

iframe是用来承载pdf的容器,但是需要通过一个外部的button,来触发iframe内部的pdf文件翻页。

实现

主要思路就是修改pdfjs-dist源码,然后自己部署。在此次修改中,主要涉及两个问题需要注意:

  1. iframe跨域
  2. pdfjs-dist源码阅读

父组件

在需要触发页面跳转的位置,使用以下代码:

javascript 复制代码
// 获取嵌入pdfjs服务的iframe
const frame = document.getElementById('pdf-container')

// 使用postMessage向pdfjs服务发送消息

// 向pdf发送的数据
const sendData = {
	page: currentPage.value,
	origin: window.location.origin
}
// pdfjs-dist部署的域名
const pdfServer = 'http://xxxxx.amazonaws.com'
frame?.contentWindow?.postMessage(sendData , pdfServer )

子组件:pdfjs-dist

indWindowEvents()方法中,添加以下监听:

javascript 复制代码
// 接收来自父组件的消息
window.addEventListener(
   "message",
   event => {
     console.log("🤑 event = ", event);
     const { data, origin } = event;
     // 判断:当域名相同时才触发下列动作
     if (origin === data.origin) {
     
     	// 从父组件传来的数据中获取page
       let page = data.page;

       if (page === null || page === "" || page > this.toolbar.pagesCount) {
         page = 1;
       }
       document.getElementById("pageNumber").value = page * 1;
       
       this.pdfViewer.currentPageNumber = page * 1;
       
       this.toolbar?.setPageNumber(page * 1, page * 1);
       
       this.secondaryToolbar?.setPageNumber(page * 1);
     }
   },
   { signal }
 );

DONE!!!搞定!

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端