当前位置: 代码网 > it编程>编程语言>Javascript > 前端使用pdf.js实现pdf转为图片

前端使用pdf.js实现pdf转为图片

2024年05月15日 Javascript 我要评论
pdf.js是一个用于在网页中显示pdf文档的javascript库。它是由mozilla开发的,是一个完全免费、开源的工具。安装 pdf.js安装pdf.js有两种方法:方法1:通过npm安装可以通

pdf.js是一个用于在网页中显示pdf文档的javascript库。它是由mozilla开发的,是一个完全免费、开源的工具。

安装 pdf.js

安装pdf.js有两种方法:

方法1:通过npm安装

可以通过npm安装pdf.js,使用以下命令:

npm install pdfjs-dist

这样就会在你的项目中安装pdf.js。

方法2:手动下载

也可以从官方网站https://mozilla.github.io/pdf.js/getting_started/手动下载pdf.js。下载后,将pdf.js和pdf.worker.js文件放到你的项目中。

前端pdf.js将pdf转为图片,尤其适合电子发票打印

示例代码

<!doctype html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>pdf文件转图片</title>
		<script type="text/javascript" src="js/jquery-3.6.4.min.js"></script>
		
		<script type="text/javascript" src="js/2.2.228pdf.min.js"></script>
		<script type="text/javascript" src="js/2.2.228.pdf.worker.min.js"></script>
		
	<!--
		
		
		<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.min.js" integrity="sha512-q0syicpjyvojmj28rdpmcxi0drmc9cr7fbquw2f5f7yis0ytwtbbltd+h5byhaa7izpm6nyixauppqfdm6zt1w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.worker.min.js" integrity="sha512-kxbikbdcuhwvfvznzvsre+1mj2mshfe5+wvucdttun3oho/3gwpduhio0jtfcucs+vnsk6bmgyc3iguwe3qxvg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
		 -->
		<script type="text/javascript" src="js/jszip.js"></script>
		<script type="text/javascript" src="js/filesaver.js"></script>
		<style type="text/css">
			button {
				width: 120px;
				height: 30px;
				background: none;
				border: 1px solid #b1afaf;
				border-radius: 5px;
				font-size: 12px;
				font-weight: 1000;
				color: #384240;
				cursor: pointer;
				outline: none;
				margin: 0 0.5%
			}

			button:hover {
				background: #ccc;
			}

			#container {
				width: 65%;
				height: 75%;
				margin-top: 1%;
				border-radius: 2px;
				/*border: 2px solid #a29b9b;*/
			}

			.pdfinfos {
				margin: 0 2%;
			}
		</style>
	</head>
	<body>

		<div class="showdata" style="margin-top:1%">
		    <button id="pdf_tourl">合并多个pdf为一个</button>
			<button id="prevpage">上一页</button>
			<button id="nextpage">下一页</button>
			<button id="exportimg">导出每一张图片</button>
			<button onclick="wind_print()">打印</button>
			<button onclick="choosepdf()">选择多个pdf文件</button>
			<input style="display:none" id='choosefile' type='file' accept="application/pdf" multiple="multiple">
		</div>
		<div  class="showdata" style="margin-top:1%">
			<span class="pdfinfos">页码:<span id="currentpages"></span><span id="totalpages"></span></span>
			<span class="pdfinfos">文件名:<span id="filename"></span></span>
			<span class="pdfinfos">文件大小:<span id="filesize"></span></span>
		</div>
		<div style="position: relative;">
			<div id="container"></div>
			<img id="imgloading" style="position: absolute;top: 20%;left: 2%;display:none" src="loading.gif">
		</div>
	</body>
	<script>
			$("#pdf_tourl").click(function(){
			alert("可以使用pdf arranger软件");
			});
			function wind_print(){
			$(".showdata").hide();
			$("#container").css("width","100%");
			$("#container").css("height","100%");
				window.print();
			 $(".showdata").show();
			 $("#container").css("width","65%");
			$("#container").css("height","75%");
			}

		var currentpages, totalpages //声明一个当前页码及总页数变量
		var scale = 2; //设置缩放比例,越大生成图片越清晰
		$('#choosefile').change(function() {
			var pdffilepath = $('#choosefile').val();
			if (pdffilepath) {
				//$("#imgloading").css('display', 'block');
				$("#container").empty(); //清空上一pdf文件展示图
				currentpages = 1; //重置当前页数
				totalpages = 0; //重置总页数
				debugger
				var filesdata = $('#choosefile')[0].files; //jquery获取到文件 返回属性的值
				//文件大小
				var filesize=0;
				for (let i = 0; i < filesdata.length; i++) {
					filesize += filesdata[i].size;
				}


				var mb;
				if (filesize) {
					mb = filesize / 1048576;
					if (mb > 10) {
						alert("文件大小不能>10m");
						return;
					}
				}

				if (filesdata.length === 1) {
					$("#filename").text(filesdata[0].name);
				} else {
					$("#filename").text(filesdata[0].name + "等 " + filesdata.length + " 个文件");

				}
				$("#filesize").text(mb.tofixed(2) + "mb");


				//reader.readasdataurl(filesdata[0]); //将文件读取为 dataurl

				for (let j = 0; j < filesdata.length; j++) {
					var reader = new filereader();
					reader.readasdataurl(filesdata[j]);


				reader.onload = function(e) { //文件读取成功完成时触发
					pdfjslib.getdocument(this.result).then(function(pdf) { //调用pdf.js获取文件
						if (pdf) {
							totalpages = pdf.numpages; //获取pdf文件总页数
							$("#currentpages").text("1/");
							$("#totalpages").text(totalpages);
							//遍历动态创建canvas
							for (var i = 1; i <= totalpages; i++) {
								var canvas = document.createelement('canvas');
								var cid=j+i;
								canvas.id = "pagenum" + cid;
								$("#container").append(canvas);
								var context = canvas.getcontext('2d');
								renderimg(pdf, i, context);
							}
						}
					});
				};

				}
			}
		});


		//渲染生成图片
		function renderimg(pdffile, pagenumber, canvascontext) {
			pdffile.getpage(pagenumber).then(function(page) { //逐页解析pdf
				var viewport = page.getviewport(scale); // 页面缩放比例
				var newcanvas = canvascontext.canvas;
				//设置canvas真实宽高
				newcanvas.width = viewport.width;
				newcanvas.height = viewport.height;
				//设置canvas在浏览中宽高
				newcanvas.style.width = "100%";
				newcanvas.style.height = "100%";
				//默认显示第一页,其他页隐藏
				if (pagenumber != 1) {
					newcanvas.style.display = "none";
				}
				var rendercontext = {
					canvascontext: canvascontext,
					viewport: viewport
				};
				page.render(rendercontext); //渲染生成
			});
			//$("#imgloading").css('display', 'none');
			return;
		};
		//上一页
		$("#prevpage").click(function() {
			if (!currentpages || currentpages <= 1) {
				return;
			}
			nowpage = currentpages;
			currentpages--;
			$("#currentpages").text(currentpages + "/");
			var prevcanvas = document.getelementbyid("pagenum" + currentpages);
			var currentcanvas = document.getelementbyid("pagenum" + nowpage);
			currentcanvas.style.display = "none";
			prevcanvas.style.display = "block";
		})
		//下一页
		$("#nextpage").click(function() {
			if (!currentpages || currentpages >= totalpages) {
				return;
			}
			nowpage = currentpages;
			currentpages++;
			$("#currentpages").text(currentpages + "/");
			var nextcanvas = document.getelementbyid("pagenum" + currentpages);
			var currentcanvas = document.getelementbyid("pagenum" + nowpage);
			currentcanvas.style.display = "none";
			nextcanvas.style.display = "block";
		})
		//导出图片
		$("#exportimg").click(function() {
			if (!$('#choosefile').val()) {
				alert('请先上传pdf文件')
				return false;
			}
			//$("#imgloading").css('display', 'block');
			var zip = new jszip(); //创建一个jszip实例
			var images = zip.folder("images"); //创建一个文件夹用来存放图片
			//遍历canvas,将其生成图片放进文件夹images中
			$("canvas").each(function(index, ele) {
				var canvas = document.getelementbyid("pagenum" + (index + 1));

				//将图片放进文件夹images中
				//参数1为图片名称,参数2为图片数据(格式为base64,需去除base64前缀 data:image/png;base64)
				images.file("photo-" + (index + 1) + ".png", splitbase64(canvas.todataurl("image/png", 1.0)), {
					base64: true
				});
			})
			//打包下载
			zip.generateasync({
				type: "blob"
			}).then(function(content) {
				//saveas(content, "picture.zip"); //saveas依赖的js文件是filesaver.js
				saveas(content, "imgfiles.zip"); //saveas依赖的js文件是filesaver.js
				//$("#imgloading").css('display', 'none');
			});
		});
		//截取base64前缀
		function splitbase64(dataurl) {
			var arr = dataurl.split(',')
			return arr[1]
		}

		function choosepdf() {
			$("#choosefile").click()
		}
	</script>
</html>

效果图

到此这篇关于前端使用pdf.js实现pdf转为图片的文章就介绍到这了,更多相关pdf.js实现pdf转图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com