pdf在线预览 pdf.js的使用

news2025/1/24 11:31:19

1.官网:https://mozilla.github.io/pdf.js/

2、使用方法

1) 通过官网,下载pdfJs插件包,放至项目中;

 window.open("./js/pdfJS/web/viewer.html?file=AngularJS权威指南.pdf" );

在这里插入图片描述
2)将下载的pdfJS插件包放至服务器中将pdfJS项目跑起来,本案例中将pdfJS文件通过tomcat部署
在这里插入图片描述
3)当文件和viewer.html不同路径时(千万注意文件路径,否则无法正常预览)
在这里插入图片描述

4)当文件为远程服务器上的文件,我们有文件的路径时,需要将http路径进行转码:

在这里插入图片描述

function methodsOne() { //法一
				// window.open("./js/pdfJS/web/viewer.html?fileAngularJS权威指南.pdf"  );//文件和viewer.html同路径
				// window.open("http://localhost:8888/pdfJS/web/viewer.html?file=AngularJS权威指南.pdf" );//文件和viewer.html同路径
				// window.open("./js/pdfJS/web/viewer.html?file=/pdf/files/AngularJS权威指南.pdf"); //文件和viewer.html 不同路径,注意路径 
				let fileUrl = encodeURIComponent('http://10.162.201.40:8005/dev/leck/2022/0215/11_.122qqq_1_092319.pdf') //将路径转码
				window.open("http://localhost:8888/pdfJS/web/viewer.html?file=" + fileUrl);
			}

(如预览远程服务器上的文件跨域:

  • 则将vierwe.js中跨域认证注释即可(亲测有效):
  • 将远程文件换成文件流,直接当参数传递:file=文件流数据(未尝试)

注:以上四种写法的效果如下所示:

// window.open("./js/pdfJS/web/viewer.html?fileAngularJS权威指南.pdf"  );//文件和viewer.html同路径
// window.open("http://localhost:8888/pdfJS/web/viewer.html?file=AngularJS权威指南.pdf" );//文件和viewer.html同路径
window.open("./js/pdfJS/web/viewer.html?file=/pdf/files/AngularJS权威指南.pdf");//文件和viewer.html 不同路径,注意路径 

在这里插入图片描述

5)通过引用插件包中的pdf.js,读出pdf文件中的内容,通过画布在页面中渲染出来,
所有该方法有几个弊端:

  1. 只能将pdf一页一页的渲染,需要自己做分页器;
  2. 翻页效果没有上述直接通过路径预览pdf的方式效果美观;
  3. 如果要下载打印等操作,需要自己去实现相关功能,但上述直接通过路径预览pdf的方式中有附带这些功能,也可将其隐藏;

实现该预览方式,主要有以下几个步骤:

  1. 引入pdf.js
  2. 获取pdf信息:pdfjsLib.getDocument(’./files/AngularJS权威指南.pdf’) ,该方法放回的是promise,通过loadingTask.promise.then(function(pdf) {}) 可拿到pdf;
  3. 拿到pdf信息后,对pdf操作,pdf.getPage(pageNum).then(function(page) {}),至此已拿到单独一页的信息,通过canvas将page渲染即可
  4. 代码如下所示:
<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#pdfBD {
				margin-left: 50%;
				transform: translateX(-50%);
			}

			#pdf-pagination {
				position: fixed;
				width: 100%;
				font-size: 14px;
				top: 100px;
				left: 10 px;
				z-index: 100;
			}

			span {
				margin-right: 10px;
				cursor: pointer;
			}
		</style>
	</head>

	<body>
		<canvas id="pdfBD"> </canvas>
		<div id="pdf-pagination">
			<span id="before" onclick="paginationClick(-1)">上一页</span>
			<span id="current">1</span>
			<span id="next" onclick="paginationClick(1)">下一页</span>
		</div>
	</body>
	<!-- <script src="https://lib.baomitu.com/pdf.js/2.7.570/pdf.js" type="text/javascript" charset="utf-8"></script> -->
	<script src="js/pdfJS/build/pdf.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		let pdfValue = null;
		let pageContent = {//法二,读取到的pdf信息记录
			currentPage: 0,//当前页
			countPage: 0,//总页数 
		}
		window.onload = function() {
			// methodsOne()
			methodsTwo()
		}

		function methodsOne() { //法一
			// window.open("./js/pdfJS/web/viewer.html?fileAngularJS权威指南.pdf"  );//文件和viewer.html同路径
			// window.open("http://localhost:8888/pdfJS/web/viewer.html?file=AngularJS权威指南.pdf" );//文件和viewer.html同路径
			window.open("./js/pdfJS/web/viewer.html?file=/pdf/files/AngularJS权威指南.pdf"); //文件和viewer.html 不同路径,注意路径 
			document.getElementById("pdf-pagination").display = 'none'; //隐藏分页器
		}

		function methodsTwo() { //法二
			var loadingTask = pdfjsLib.getDocument('./files/AngularJS权威指南.pdf');
			loadingTask.promise.then(function(pdf) {
				console.log(pdf)
				pdfValue = pdf;
				pageContent.countPage = pdf.numPages;
				changePage(pdf, 1)
			});
			document.getElementById("pdf-pagination").display = 'block'; //显示分页器
		}

		//翻页 type:1 下一页;-1:上一页
		function paginationClick(type) {
			if (type == 1) {
				//下一页
				pageContent.currentPage == pageContent.countPage ? "" : pageContent.currentPage += 1
			} else {
				//上一页
				pageContent.currentPage == 1 ? "" : pageContent.currentPage -= 1
			}
			document.getElementById("current").innerHTML = pageContent.currentPage
			changePage(pdfValue, pageContent.currentPage)
		}
		//通过页码,渲染当前页currentPage信息:pdf:读取的总的pdf信息,pageNum:需要获取的页数
		function changePage(pdf, pageNum) {
			if (pdf == null) return;
			pdf.getPage(pageNum).then(function(page) {
				// you can now use *page* here
				var scale = 1.5;//放大倍数
				var viewport = page.getViewport({
					scale: scale,
				}); 
				// Support HiDPI-screens.
				var outputScale = window.devicePixelRatio || 1;

				var canvas = document.getElementById('pdfBD');
				var context = canvas.getContext('2d');

				canvas.width = Math.floor(viewport.width * outputScale);
				canvas.height = Math.floor(viewport.height * outputScale);
				canvas.style.width = Math.floor(viewport.width) + "px";
				canvas.style.height = Math.floor(viewport.height) + "px";

				var transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] :
					null;
				var renderContext = {
					canvasContext: context,
					transform: transform,
					viewport: viewport
				};
				page.render(renderContext);
			});
		}
	</script>

</html>

注:
该方法的预览效果如下(此处页面布局和分页器仅简单实现功能)
在这里插入图片描述
【完】

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

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

相关文章

uniapp封装axios?大可不必那么麻烦。

最近群里的一个小明同学问 uniapp可以使用axios请求吗&#xff1f;我当时就一愣 反问为什么要使用axios&#xff0c;是 uni.request 不香了吗&#xff1f; 小明&#xff1a;因为axios可以像vue的项目一样&#xff0c;在request里面封装巴拉巴拉一堆。 我&#xff1a;那uni.re…

微信小程序开发使用onreachBottom实现页面触底加载及分页

目录 一 简要介绍一下onreachBottom事件 二 实例展示 三 遇到的一些问题 一 简要介绍一下onreachBottom事件 onreachBottom和onLoad以及onShow一样&#xff0c;都属于小程序的生命周期事件&#xff0c;作用就是在页面下拉到底部时触发这个事件&#xff0c;一般适用于数据比较…

一次跨域的坑Faild to load response data: No resourse with given identifier found

有一个导出接口&#xff0c;前后端都没有动过&#xff0c;之前也测试过没有问题。上到测试环境后&#xff0c;测试环境加了证书&#xff0c;报错了。 先是后端小朋友和我说了这个问题&#xff1a; 浏览器控制台打印信息(聊天记录中那张图)&#xff1a;然后我问他操作了哪个页面…

vue3.0教程——搭建Vue脚手架【简化版】

目录 哈喽&#xff0c;大家好丫&#xff0c;你们的小郭子又来啦 ~ 一、环境要求 &#xff08;1&#xff09;node安装&#xff08;前端开发环境&#xff09; &#xff08;2&#xff09;vue-cli脚手架安装 二、安装依赖 &#xff08;1&#xff09;使用命令行安装以下依赖 &a…

Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理

Vue 之 vue-seamless-scroll 实现简单自动无缝滚动&#xff0c;且添加对应点击事件的简单整理 目录 Vue 之 vue-seamless-scroll 实现简单自动无缝滚动&#xff0c;且添加对应点击事件的简单整理 一、简单介绍 二、安装和使用 三、效果图 四、vue-seamless-scroll 点击事件…

(网页开发/前端)配置VsCode,让您拥有更舒适的开发环境

vscode&#xff0c;微软旗下的一款强大的IDE集成开发环境&#xff0c;现在&#xff0c;越来越多的网页开发人员选择使用vscode来敲代码。 但是&#xff0c;在不添加任何扩展的vscode中&#xff0c;想要享受“丝滑”的开发体验是比较困难的。所以&#xff0c;接下来&#xff0c;…

js从地址栏获取参数

一、过程分四步&#xff1a; 1.获取地址栏&#xff1b; var loclocation.href; 2.获取地址栏的长度 var n1loc.length; 3.获取地址栏中第一个等号的位置&#xff1b; var n2loc.indexOf()&#xff1b; 4.以等号位置&#xff0c;截取后面的内容&#xff1b; var strloc.slice(n2…

Object.entries()

Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组。 其排列与使用 for...in 循环遍历该对象时返回的顺序一致&#xff08;区别在于 for-in 循环还会枚举原型链中的属性&#xff09;。 语法 Object.entries(obj) 参数 obj&#xff1a;可以返回其可枚举属性…

VS2022(Visual Studio)发布ASP.NET Core Web API应用到Web服务器(IIS)

概述 写完代码后&#xff0c;最常用、简单的发布方式&#xff0c;就是将应用发布到文件夹&#xff0c;然后将publish文件夹复制到要部署的机器上&#xff08;本地、局域网服务器、云服务器等&#xff09;。 但是在实际工作中&#xff0c;可能会遇到需要频繁地发布&#xff0c…

vue--后台管理系统问题和功能实现思路集锦

目录 一、动态菜单 1、问题&#xff1a;点击菜单&#xff0c;其他菜单都会打开&#xff0c;且选中某个菜单&#xff0c;其他菜单都会选中 2、问题&#xff1a;home页面代码内动态菜单数据获取的位置 二、动态路由 1、问题&#xff1a;刷新home页面后&#xff0c;页面报错&…

微信小程序开发(遇到的报错和注释)

一开始验证文章出错了&#xff0c;一直运行不起来&#xff0c;取消设置&#xff0c;可以正常调用。 页面小程序窗口组件部分&#xff1a;navigationbar导航栏区域&#xff0c;background背景区域&#xff08;默认不可见&#xff0c;下拉才显示&#xff09;、页面的主题区域&am…

教你一文解决 js 数字精度丢失问题

文章目录一、关于为什么要解决精度丢失二、怎么解决js的计算精度丢失问题&#xff1f;三、toPrecision 特定方法返回四舍五入长度字符串结语一、关于为什么要解决精度丢失 可以看下例子&#xff0c;因为js失去精度问题也是常见的问题&#xff0c;正常我们可以四舍五入或者 toF…

vue3中使用ant-design-vue的layout组件实现动态导航栏功能(1~2级)

目录 0 前言 1 准备工作 1.1 安装ant-design-vue 1.2 安装图标组件包 2 选择组件 3 路由文件 4 Vue导航页面 5 最终效果 0 前言 最近在自己搞一个前后端小项目&#xff0c;前端想使用ant-design-vue的layout组件实现动态导航栏和面包屑&#xff0c;但是网上的资料较少&…

新星微前端MicroApp的基础教程

目录 什么是微前端&#xff1f; 使用场景 microApp介绍 概念图 micorApp的优势 microApp项目的应用 基座 基座路由 子应用 react项目中路由位置进行使用 跨域的问题 react项目中跨域 vue项目中跨域 micorApp基础介绍 micorApp传值&#xff08;重要&#xff09; …

Vue 2项目如何升级到Vue 3?

应不应该从 Vue 2 升级到 Vue 3 应不应该升级&#xff1f;这个问题不能一概而论。 首先&#xff0c;如果你要开启一个新项目&#xff0c;那直接使用 Vue 3 是最佳选择。后面课程里&#xff0c;我也会带你使用 Vue 3 的新特性和新语法开发一个项目。 以前我独立使用 Vue 2 开…

【vue】vuex常见面试题

【vue】vuex常见面试题 文章目录【vue】vuex常见面试题一、vuex简介对vuex的理解各模块在流程中的功能&#xff1a;Vuex实例应用二、常见面试题1.Vuex 为什么要分模块并且加命名空间2.Vuex和单纯的全局对象有什么区别&#xff1f;3.为什么 Vuex 的 mutation 中不能做异步操作&a…

css宽高自适应

1. 宽高自适应 举个例子看看什么是宽高自适应&#xff0c; &#xff08;1&#xff09;先正常创建一个div标签&#xff0c;有宽和高&#xff1a; 结果&#xff1a; &#xff08;2&#xff09;去掉div的宽度&#xff0c;观察结果 结果&#xff1a; 结果占满了整个屏幕&#xff0…

HTML表格样式

9675人阅读 行跟列背景颜色的选择&#xff0c;合并等 列的颜色选择代码 <colgroup span"1" bgcolor"lightgreen"></colgroup> <colgroup span"1" bgcolor"lightyellow"></colgroup> <colgroup span"…

一大波 ChatGPT 开源项目,诞生了!

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01;大家好&#xff0c;我是小 G。本月初 ChatGPT 问世&#xff0c;犹如平地惊雷般&#xff0c;在技术圈中引起了广泛讨论。作为全球最大的开发者社区&#xff0c;GitHub 平台也在近期诞生了多个…

Ant vue中表单验证(动态校验、部分校验)

前提&#xff1a;写了超级复杂的表单&#xff0c;其中涉及了很多表单验证的地方&#xff0c;现一一记录一下&#xff1b; ant-vue 版本1.7.8 vue 版本2.6.11 校验的原理大体相似&#xff0c;灵活应用&#xff01;&#xff01; 1.动态校验 需求&#xff1a; 1根据读写方式去动态…