草庐IT

PC端与手机端h5页面pdf展示 pdfh5.js 与 pdf.js

散落凡尘的雨 2024-01-17 原文

PC端与手机端h5页面pdf展示

我们web经常会遇到对于pdf文件的展示,对于PC端我们可以直接通过浏览器打开pdf进行预览。但是对于手机端,我们的h5页面中连接的pdf文件在安卓上会跳转到下载,在IOS上会直接打开。对于这种需要兼容pc端与手机端的展示我们可以使用pdf.js来做。

解决方案:
1,pdf.js
2,pdfh5.js

下面的pdfh5.js是对上面pdf.js的封装,pdf.js对于2.0.xx版本与2.1.xx版本的使用有些许区别。pdfh5.js的使用起来更加简单
我这里是传统开发模式,没有使用npm进行安装。

pdfh5.js 使用

原pdfh5.js博客:https://www.gjtool.cn/archives/pdfh5

pdfh5.js 使用步骤:
1,引入css

	<link rel="stylesheet" href="css/pdfh5.css" />

2,引入js

	<script src="js/pdf.js" type="text/javascript" charset="utf-8"></script>
	<script src="js/pdf.worker.js" type="text/javascript" charset="utf-8"></script>
	<script src="js/jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script>
	<script src="js/pdfh5.js" type="text/javascript" charset="utf-8"></script>

3,创建div

	<div id="demo" ></div>

4,实例化

	var pdfh5 = new Pdfh5('#demo', {
	  	pdfurl: "./default.pdf"
	});

5,其他方法

// $.ajax({
	// 	url: "页面崩溃PDF(1).pdf", //假设这是pdf文件流的请求接口
	// 	type: "get",
	// 	mimeType: 'text/plain; charset=x-user-defined', //jq ajax请求文件流的方式
	// 	// dataType: 'arraybuffer',
	// 	success: function(data) {
	// 		pdfh5 = new Pdfh5('#demo', {
	// 			data: data,
	// 		});
	// 		pdfh5.on("success", function(time) {
	// 			time = time / 1000
	// 			console.log("pdf渲染完成,总耗时" + time + "秒");
	// 			//滚动到第3页
	// 			// pdfh5.goto(3);
	// 			this.download("2222",function(){
	// 				console.log(11111)
	// 			})
	// 		})
	// 	}
	// });
	// axios.get("https://www.gjtool.cn/pdfh5/git.pdf", {
	// 	responseType: "arraybuffer"
	// }).then(res => {
	// 	pdfh5 = new Pdfh5('#demo', {
	// 		data: res.data
	// 	});
	// 	pdfh5.on("success", function(time) {
	// 		time = time / 1000
	// 		console.log("pdf渲染完成,总耗时" + time + "秒");
	// 		//滚动到第3页
	// 		// pdfh5.goto(3);
	// 		this.download()
	// 	})
	// })
	pdfh5 = new Pdfh5('#demo', {
		pdfurl: "test.pdf",
		URIenable:true,
		goto: 0,
		//&nbsp;scrollEnable:&nbsp;false&nbsp;//&nbsp;是否允许pdf滚动
		zoomEnable: false, //&nbsp;是否允许pdf手势缩放
		//&nbsp;limit:&nbsp;3
	});
	// //监听pdf渲染成功
	// pdfh5.on("success", function(time) {
	// 	time = time / 1000
	// 	console.log("pdf渲染完成,总耗时" + time + "秒");
	// 	//滚动到第3页
	// 	// pdfh5.goto(3);
	// 	this.download("xxxx",function(){
	// 		console.log(11111)
	// 	})
	// })
	// pdfh5.on("zoom", function(scale) {
	// 	console.log(scale)
	// })
	// new Pdfh5('#demo2', {
	// 	pdfurl: "222.pdf"
	// });
	// new Pdfh5('#demo3', {
	// 	pdfurl: "git.pdf"
	// });
	// setTimeout(() => {
	//     var pdfh5 = new Pdfh5('#demo', {
	//         pdfurl: "https://www.gjtool.cn/pdfh5/git.pdf"
	//     });
	//     setTimeout(() => {
	//         var pdfh5 = new Pdfh5('#demo', {
	//             pdfurl: "1.pdf"
	//         });
	//         setTimeout(() => {
	//             var pdfh5 = new Pdfh5('#demo', {
	//                 pdfurl: "test.pdf"
	//             });
	//             pdfh5.on("complete", function (status, msg, time) {
	//                 console.log("状态:" + status + ",信息:" + msg + ",耗时:" + time + "毫秒,总页数:" + this.totalNum)
	//             })
	//         }, 5000);
	//     }, 5000);
	// }, 5000);

	//配置项参数 renderType:"svg" 渲染模式为svg,默认canvas
	// var pdfh5 = new Pdfh5('#demo', {
	//     pdfurl: "./default.pdf",
	//     renderType:"svg"
	// });

	//配置项参数 lazy:true 开启懒加载,默认是false,不开启懒加载
	// var pdfh5 = new Pdfh5('#demo', {
	//     pdfurl: "./default.pdf",
	//     lazy:true 
	// });

	//配置项参数 URIenable:true 开启获取地址栏file参数,获取地址栏pdf路径?file=xxx.pdf,默认false不开启
	// var pdfh5 = new Pdfh5('#demo', {
	//     URIenable:false,
	//     pdfurl: "./default.pdf"
	// });

	//配置项参数 是否显示小部件 顶部绿色加载进度条loadingBar 左上角页码显示pageNum 右下角回到顶部按钮backTop  默认显示
	//		var pdfh5 = new Pdfh5('#demo', {
	// 			 loadingBar: false,
	//           pageNum:false,
	//           backTop:false
	// 		});

	//配置项参数data,文件流形式传入  pdfurl和data二选一
	//		var pdfh5 = new Pdfh5('#demo', {
	// 			data: data
	// 		});

	//配置项参数scrollEnable:false不允许pdf滚动,true允许pdf滚动  默认允许
	//		var pdfh5 = new Pdfh5('#demo', {
	// 			scrollEnable:false,//是否允许pdf滚动
	// 			pdfurl: url
	// 		});
	//pdfh5.scrollEnable(true)允许pdf滚动,pdfh5.scrollEnable(false)不允许pdf滚动

	//配置项参数zoomEnable:false不允许pdf手势缩放,true允许pdf手势缩放  默认允许
	//		var pdfh5 = new Pdfh5('#demo', {
	// 			zoomEnable:false,//是否允许pdf手势缩放
	// 			pdfurl: url
	// 		});
	//pdfh5.zoomEnable(true)允许pdf手势缩放,pdfh5.zoomEnable(false)不允许pdf手势缩放

	//pdfh5还原、销毁(附带回调函数):   pdfh5.reset pdfh5.destroy 
	//pdfh5显示、隐藏(附带回调函数):   pdfh5.show pdfh5.hide 

	//pdf准备开始渲染,此时可以拿到pdf总页数
	// pdfh5.on("ready", function() {
	// 	console.log("pdf准备开始渲染,总页数:" + this.totalNum)
	// })

	//监听pdf渲染失败
	// pdfh5.on("error", function (time) {
	//     console.log("渲染失败,总耗时" + time + "毫秒")
	// })
	//监听完成事件,加载失败、渲染成功都会触发
	// pdfh5.on("complete", function(status, msg, time) {
	// 	console.log("状态:" + status + ",总耗时:" + time + "毫秒,总页数:" + this.totalNum, msg)
	// })

	//监听渲染中事件
	// pdfh5.on("render", function(currentNum, time, currentPageDom) {
	// 	// currentPageDom.append("<span class='name-logo'>张三</span>")
	// 	console.log("当前页码:" + currentNum)
	// })
	//on方法,监听事件: 开始初始化 init 准备渲染pdf ready 加载完成 complete 加载失败 error 加载成功 success 渲染pdf中 render
	// 缩放zoom   滚动scroll 显示show  隐藏hide 还原reset 销毁destroy  允许缩放zoomEnable 允许滚动scrollEnable

	//pdfh5支持在线预览 
	//http://www.gjtool.cn/pdfh5/pdf.html?file=http://www.gjtool.cn/pdfh5/default.pdf

所需的js 与 css在 资源下载

pdf.js 2.13.216版本的使用

原pdf.js官网:http://mozilla.github.io/pdf.js/
pdf.js参考博文 https://www.jb51.net/html5/771927.html

从官网上下载的pdf.js:

从官网上下载的文件有两个文件夹,分别对应着两种使用方式:
1,build文件夹的使用方式是h5页面,使用的是canvas来进行将pdf文件绘制出来,一页一图的绘制。

<script type='text/javascript' src='./build/pdf.js'></script>
<div id="canvas"></div>

pdfjsLib.GlobalWorkerOptions.workerSrc = './build/pdf.worker.js'; 

var url = './111.pdf';
loadPDF(url); // 渲染页面

//读取pdf文件,并加载到页面中
	function loadPDF(fileURL) {
		pdfjsLib.getDocument(fileURL).then(function (pdf) {
			//用 promise 获取页面
			var id = '';
			var idTemplate = 'cw-pdf-';
			var pageNum = pdf.numPages;
			//根据页码创建画布
			createSeriesCanvas(pageNum, idTemplate);
			//将pdf渲染到画布上去
			for (var i = 1; i <= pageNum; i++) {
				id = idTemplate + i;
				renderPDF(pdf, i, id);
			}
		});
	}

function createPdfContainer(id, className) {
		var pdfContainer = document.getElementById('canvas');
		var canvasNew = document.createElement('canvas');
		
		canvasNew.id = id;
		canvasNew.className = className;
		pdfContainer.appendChild(canvasNew);
	};

//渲染pdf
	//建议给定pdf宽度
	function renderPDF(pdf, i, id) {
		pdf.getPage(i).then(function (page) {
	 
			var scale = 0.5;
			var viewport = page.getViewport(scale);
	 
			//
			//  准备用于渲染的 canvas 元素
			//
	 
			var canvas = document.getElementById(id);
			var context = canvas.getContext('2d');
			canvas.height = viewport.height;
			canvas.width = document.documentElement.clientWidth;
			//
			// 将 PDF 页面渲染到 canvas 上下文中
			//
			var renderContext = {
				canvasContext: context,
				viewport: viewport,
				enableWebGL: false,
				renderInteractiveForms: false
			};
			page.render(renderContext);
			
		});
		
	};
	//创建和pdf页数等同的canvas数
	function createSeriesCanvas(num, template) {
		var id = '';
		for (var j = 1; j <= num; j++) {
			id = template + j;
			createPdfContainer(id, 'pdfClass');
		}
	}
	

上述代码渲染出来的pdf在手机端和PC端的都显示的比较模糊,几乎不存在可用性,网上也有关于显示模糊的处理方案。这里我没有实践过就不多写了。

2,web文件夹使用的方式是将web文件夹放置到服务器上,然后通过viewer.html?file=123.pdf进行访问或者viewer.html?file=123.action直接使用后台输出的pdf流来使用。具体的网上资料可以自行参考。

所需资源下载:资源下载

有关PC端与手机端h5页面pdf展示 pdfh5.js 与 pdf.js的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Prawn PDF : I need to generate nested tables - 2

    我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested

  3. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  4. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  5. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  6. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  7. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  8. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  9. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  10. ruby-on-rails - RoR && "coming soon"页面 - 2

    我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/

随机推荐