翼度科技»论坛 编程开发 JavaScript 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
PDF.js是一个用于在网页中显示PDF文档的JavaScript库。它是由Mozilla开发的,是一个完全免费、开源的工具。
安装 PDF.js
安装PDF.js有两种方法:
方法1:通过npm安装
可以通过npm安装PDF.js,使用以下命令:
  1. 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转为图片,尤其适合电子发票打印
示例代码
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8" />
  5.                 <title>PDF文件转图片</title>
  6.                 <script type="text/javascript" src="js/jquery-3.6.4.min.js"></script>
  7.                
  8.                 <script type="text/javascript" src="js/2.2.228pdf.min.js"></script>
  9.                 <script type="text/javascript" src="js/2.2.228.pdf.worker.min.js"></script>
  10.                
  11.         <!--
  12.                
  13.                
  14.                 <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>
  15.                 <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>
  16.                  -->
  17.                 <script type="text/javascript" src="js/jszip.js"></script>
  18.                 <script type="text/javascript" src="js/FileSaver.js"></script>
  19.                 <style type="text/css">
  20.                         button {
  21.                                 width: 120px;
  22.                                 height: 30px;
  23.                                 background: none;
  24.                                 border: 1px solid #b1afaf;
  25.                                 border-radius: 5px;
  26.                                 font-size: 12px;
  27.                                 font-weight: 1000;
  28.                                 color: #384240;
  29.                                 cursor: pointer;
  30.                                 outline: none;
  31.                                 margin: 0 0.5%
  32.                         }

  33.                         button:hover {
  34.                                 background: #ccc;
  35.                         }

  36.                         #container {
  37.                                 width: 65%;
  38.                                 height: 75%;
  39.                                 margin-top: 1%;
  40.                                 border-radius: 2px;
  41.                                 /*border: 2px solid #a29b9b;*/
  42.                         }

  43.                         .pdfInfos {
  44.                                 margin: 0 2%;
  45.                         }
  46.                 </style>
  47.         </head>
  48.         <body>

  49.                 <div class="showdata" style="margin-top:1%">
  50.                     <button id="pdf_tourl">合并多个pdf为一个</button>
  51.                         <button id="prevpage">上一页</button>
  52.                         <button id="nextpage">下一页</button>
  53.                         <button id="exportImg">导出每一张图片</button>
  54.                         <button onclick="wind_print()">打印</button>
  55.                         <button onclick="choosePdf()">选择多个pdf文件</button>
  56.                         <input style="display:none" id='chooseFile' type='file' accept="application/pdf" multiple="multiple">
  57.                 </div>
  58.                 <div  class="showdata" style="margin-top:1%">
  59.                         <span class="pdfInfos">页码:<span id="currentPages"></span><span id="totalPages"></span></span>
  60.                         <span class="pdfInfos">文件名:<span id="fileName"></span></span>
  61.                         <span class="pdfInfos">文件大小:<span id="fileSize"></span></span>
  62.                 </div>
  63.                 <div style="position: relative;">
  64.                         <div id="container"></div>
  65.                         <img id="imgloading" style="position: absolute;top: 20%;left: 2%;display:none" src="loading.gif">
  66.                 </div>
  67.         </body>
  68.         <script>
  69.                         $("#pdf_tourl").click(function(){
  70.                         alert("可以使用PDF Arranger软件");
  71.                         });
  72.                         function wind_print(){
  73.                         $(".showdata").hide();
  74.                         $("#container").css("width","100%");
  75.                         $("#container").css("height","100%");
  76.                                 window.print();
  77.                          $(".showdata").show();
  78.                          $("#container").css("width","65%");
  79.                         $("#container").css("height","75%");
  80.                         }

  81.                 var currentPages, totalPages //声明一个当前页码及总页数变量
  82.                 var scale = 2; //设置缩放比例,越大生成图片越清晰
  83.                 $('#chooseFile').change(function() {
  84.                         var pdfFilePath = $('#chooseFile').val();
  85.                         if (pdfFilePath) {
  86.                                 //$("#imgloading").css('display', 'block');
  87.                                 $("#container").empty(); //清空上一PDF文件展示图
  88.                                 currentPages = 1; //重置当前页数
  89.                                 totalPages = 0; //重置总页数
  90.                                 debugger
  91.                                 var filesdata = $('#chooseFile')[0].files; //jquery获取到文件 返回属性的值
  92.                                 //文件大小
  93.                                 var fileSize=0;
  94.                                 for (let i = 0; i < filesdata.length; i++) {
  95.                                         fileSize += filesdata[i].size;
  96.                                 }


  97.                                 var mb;
  98.                                 if (fileSize) {
  99.                                         mb = fileSize / 1048576;
  100.                                         if (mb > 10) {
  101.                                                 alert("文件大小不能>10M");
  102.                                                 return;
  103.                                         }
  104.                                 }

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

  109.                                 }
  110.                                 $("#fileSize").text(mb.toFixed(2) + "Mb");


  111.                                 //reader.readAsDataURL(filesdata[0]); //将文件读取为 DataURL

  112.                                 for (let j = 0; j < filesdata.length; j++) {
  113.                                         var reader = new FileReader();
  114.                                         reader.readAsDataURL(filesdata[j]);


  115.                                 reader.onload = function(e) { //文件读取成功完成时触发
  116.                                         pdfjsLib.getDocument(this.result).then(function(pdf) { //调用pdf.js获取文件
  117.                                                 if (pdf) {
  118.                                                         totalPages = pdf.numPages; //获取pdf文件总页数
  119.                                                         $("#currentPages").text("1/");
  120.                                                         $("#totalPages").text(totalPages);
  121.                                                         //遍历动态创建canvas
  122.                                                         for (var i = 1; i <= totalPages; i++) {
  123.                                                                 var canvas = document.createElement('canvas');
  124.                                                                 var cid=j+i;
  125.                                                                 canvas.id = "pageNum" + cid;
  126.                                                                 $("#container").append(canvas);
  127.                                                                 var context = canvas.getContext('2d');
  128.                                                                 renderImg(pdf, i, context);
  129.                                                         }
  130.                                                 }
  131.                                         });
  132.                                 };

  133.                                 }
  134.                         }
  135.                 });


  136.                 //渲染生成图片
  137.                 function renderImg(pdfFile, pageNumber, canvasContext) {
  138.                         pdfFile.getPage(pageNumber).then(function(page) { //逐页解析PDF
  139.                                 var viewport = page.getViewport(scale); // 页面缩放比例
  140.                                 var newcanvas = canvasContext.canvas;
  141.                                 //设置canvas真实宽高
  142.                                 newcanvas.width = viewport.width;
  143.                                 newcanvas.height = viewport.height;
  144.                                 //设置canvas在浏览中宽高
  145.                                 newcanvas.style.width = "100%";
  146.                                 newcanvas.style.height = "100%";
  147.                                 //默认显示第一页,其他页隐藏
  148.                                 if (pageNumber != 1) {
  149.                                         newcanvas.style.display = "none";
  150.                                 }
  151.                                 var renderContext = {
  152.                                         canvasContext: canvasContext,
  153.                                         viewport: viewport
  154.                                 };
  155.                                 page.render(renderContext); //渲染生成
  156.                         });
  157.                         //$("#imgloading").css('display', 'none');
  158.                         return;
  159.                 };
  160.                 //上一页
  161.                 $("#prevpage").click(function() {
  162.                         if (!currentPages || currentPages <= 1) {
  163.                                 return;
  164.                         }
  165.                         nowpage = currentPages;
  166.                         currentPages--;
  167.                         $("#currentPages").text(currentPages + "/");
  168.                         var prevcanvas = document.getElementById("pageNum" + currentPages);
  169.                         var currentcanvas = document.getElementById("pageNum" + nowpage);
  170.                         currentcanvas.style.display = "none";
  171.                         prevcanvas.style.display = "block";
  172.                 })
  173.                 //下一页
  174.                 $("#nextpage").click(function() {
  175.                         if (!currentPages || currentPages >= totalPages) {
  176.                                 return;
  177.                         }
  178.                         nowpage = currentPages;
  179.                         currentPages++;
  180.                         $("#currentPages").text(currentPages + "/");
  181.                         var nextcanvas = document.getElementById("pageNum" + currentPages);
  182.                         var currentcanvas = document.getElementById("pageNum" + nowpage);
  183.                         currentcanvas.style.display = "none";
  184.                         nextcanvas.style.display = "block";
  185.                 })
  186.                 //导出图片
  187.                 $("#exportImg").click(function() {
  188.                         if (!$('#chooseFile').val()) {
  189.                                 alert('请先上传pdf文件')
  190.                                 return false;
  191.                         }
  192.                         //$("#imgloading").css('display', 'block');
  193.                         var zip = new JSZip(); //创建一个JSZip实例
  194.                         var images = zip.folder("images"); //创建一个文件夹用来存放图片
  195.                         //遍历canvas,将其生成图片放进文件夹images中
  196.                         $("canvas").each(function(index, ele) {
  197.                                 var canvas = document.getElementById("pageNum" + (index + 1));

  198.                                 //将图片放进文件夹images中
  199.                                 //参数1为图片名称,参数2为图片数据(格式为base64,需去除base64前缀 data:image/png;base64)
  200.                                 images.file("photo-" + (index + 1) + ".png", splitBase64(canvas.toDataURL("image/png", 1.0)), {
  201.                                         base64: true
  202.                                 });
  203.                         })
  204.                         //打包下载
  205.                         zip.generateAsync({
  206.                                 type: "blob"
  207.                         }).then(function(content) {
  208.                                 //saveAs(content, "picture.zip"); //saveAs依赖的js文件是FileSaver.js
  209.                                 saveAs(content, "imgFiles.zip"); //saveAs依赖的js文件是FileSaver.js
  210.                                 //$("#imgloading").css('display', 'none');
  211.                         });
  212.                 });
  213.                 //截取base64前缀
  214.                 function splitBase64(dataurl) {
  215.                         var arr = dataurl.split(',')
  216.                         return arr[1]
  217.                 }

  218.                 function choosePdf() {
  219.                         $("#chooseFile").click()
  220.                 }
  221.         </script>
  222. </html>
复制代码
效果图

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

来源:https://www.jb51.net/javascript/319231l2d.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具