首页 > 其他分享 >pdf在前端网页的显示

pdf在前端网页的显示

时间:2024-04-11 20:56:28浏览次数:22  
标签:scale 网页 前端 width pdfRefList pdf page const

背景:react框架
实现插件:pdfjs-dist: "^2.0.943"   (还有其他插件  react-pdf , react-pdf-js , pdf.js 都可以尝试一下呢)

实现效果:

实现代码 如下:

index.jsx

import React, { useState, useEffect } from 'react'; import { Spin } from 'antd'; import { RightOutlined, LeftOutlined, PlusOutlined, MinusOutlined } from '@ant-design/icons'; import testPdf from 'public/pdf/面试总结.pdf'; import './index.less'; const pdfjsLib = require('pdfjs-dist/build/pdf.min.js'); pdfjsLib.GlobalWorkerOptions.workerSrc = (typeof window !== 'undefined' ? window : {} ).pdfjsWorker = require('pdfjs-dist/build/pdf.worker.min.js'); const PdfTest = (props) => { const [pdfRefList, setPdfRefList] = useState([]); const [page, setPage] = useState(1); //当前页 const [pages, setPages] = useState(null); //总页数 const [scale, setScale] = useState(1.5); const [loadingPage, setLoadingPage] = useState(false); useEffect(() => { setLoadingPage(true); getDocument(page, testPdf); }, [page]); useEffect(() => { pdfRefList && pdfRefList.map((pdf) => { pdf.detail && pdf.detail.getPage(page).then(function (page) { const viewport = page.getViewport(scale); const canvas = document.getElementById('pdfCanvas'); const canvasContext = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext: canvasContext, viewport: viewport.clone({ rotation: 0 }), background: '#ddd' }; page.render(renderContext); setLoadingPage(false); }); }); }, [pdfRefList, scale]); const getDocument = (pageNum, href) => { const loadingTask = pdfjsLib.getDocument({ url: href, // pdf文件地址 或者 请求资源地址 cMapPacked: true // 此参数需要设为true }); loadingTask.promise.then((loadedPdf) => { const pdf = [{ id: pageNum, detail: loadedPdf }]; setPages(loadedPdf.numPages); setPage(pageNum); setPdfRefList(pdf); }); }; const renderPagination = (page, pages) => { if (!pages) { return null; } let previousButton = ( <li className="previous" onClick={() => setPage(page - 1)}> <LeftOutlined /> </li> ); if (page === 1) { previousButton = ( <li className="previous disabled"> <LeftOutlined /> </li> ); } let nextButton = ( <li className="next" onClick={() => setPage(page + 1)}> <RightOutlined /> </li> ); if (page === pages) { nextButton = ( <li className="next disabled"> <RightOutlined /> </li> ); } return ( <ul className="pager"> {previousButton} <li className="pageNum">{page + '/' + pages}</li> {nextButton} </ul> ); }; const zoomIn = (val) => { if (scale > 0.75 || scale < 2) { if (val == '+') { setScale(scale + 0.25); } else { setScale(scale - 0.25); } } }; return ( <div className="page-content"> {/* pdf显示 */} <div className="viewer"> {pdfRefList && pdfRefList.map((pdf) => { return ( <div className="canvasWrapper" key={pdf.id}> <Spin spinning={loadingPage}> <canvas id="pdfCanvas"></canvas> </Spin> </div> ); })} </div> <div className="pdfOperation"> {/* 分页 */} {renderPagination(page, pages)} {/* 缩放按钮 */} <div className="pdfTool"> <span className="zoomBtn" onClick={() => zoomIn('-')}> <MinusOutlined /> </span> <span className="scale">{scale * 100 + '%'}</span> <span className="zoomBtn" onClick={() => zoomIn('+')}> <PlusOutlined /> </span> </div> </div> </div> ); }; export default PdfTest;
index.less
.page-content{
    background: #f2f2f2;
    width: 100%;
    height: 100vh;
    overflow-y: auto;
    .viewer{
        overflow-y: auto;
        .ant-spin-container{
            margin: 0 auto;
            display: flex;
            justify-content: center;
        }
    }
    .pdfOperation{
        width: 100%;
        background: #f2f2f2;
        height: 32px;
        position: fixed;
        bottom: 0;
        left: 0;
        box-shadow: 0 -2px 2px 0 rgba(0, 0, 0, 0.05);
        z-index: 21;
        .pdfTool{
            display: flex;
            align-items: center;
            justify-content: center;
            position: absolute;
            right: 30%;
            top: 50%;
            transform: translateY(-50%);
            width: 100px;
            border-radius: 4px;
            .zoomBtn{
              font-size: 14px;
              color: rgba(#000,0.6);
              cursor: pointer;
            }
            .scale{
              padding: 0 12px;
              font-size: 12px;
            }
          }
      
          .pager{
            display: block;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 32px;
            border-radius: 4px;
            width: 140px;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            .pageNum{
              width: 100px;
              text-align: center;
              border-radius: 4px;
            }
            .previous,.next{
              padding: 0 16px;
              color: rgba(#000,0.8);
              cursor: pointer;
            }
            .disabled{
              color: rgba(#000,0.2);
              cursor: default;
            }
           
          }
    }
}

 

 

 

  

 

标签:scale,网页,前端,width,pdfRefList,pdf,page,const
From: https://www.cnblogs.com/susu2020/p/18130008

相关文章

  • 前端纯原生js数据监控,更新视图
    还没完善好,先记录一部分 binding.js//定义Model类,用于存储数据和监听数据变化functionModel(value=""){this._value=value;//存储数据的值this._listeners=[];//存储监听数据变化的函数}//定义Model类的set方法,用于设置数据的值Model.prototype.set......
  • Python+Django+Html网页版人脸识别考勤打卡系统
    程序示例精选Python+Django+Html人脸识别考勤打卡系统如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!前言这篇博客针对《Python+Django+Html网页版人脸识别考勤打卡系统》编写代码,代码整洁,规则,易读。学习与应用推荐首选。运行结果文章......
  • PDF文件批量拆分为图片文件
    文章目录前言一、PDF如何快速拆分成图片?二、准备搞起来!!!1.执行代码2.简易GUI前端总结前言一、PDF如何快速拆分成图片?先在百度进行了搜索,好多都是在线的工具,用几次还可以,但是拆分的文件多了,或者文件比较大就会有限制,思来想去,不如自己写一个本地脚本,用着方便也便捷,说......
  • VScode里用MPE插件导出带大纲的HTML和PDF文件
    前置条件:1.在VScode里安装好MarkdownPreviewEnhanced插件2.导出PDF文件,需要用到Prince软件,要先在电脑上安装Prince软件,可以去它的官网下载                Prince-DownloadPrince(princexml.com)windows系统的,选这个就可以了,解压后放在自己想放的......
  • 一个PDF文件含有多篇不同的内容,如何把这些内容分离出来?
    一,PDF的含义PDF,全称PortableDocumentFormat,即便携式文档格式,是一种由AdobeSystems开发的文件格式,用于呈现文档,包括文本、图像、向量图形、字体、颜色、页面布局等,并可在不同的操作系统、设备和软件平台上进行查看和打印。PDF文件的设计初衷是为了解决不同操作系统和应用程......
  • 社交圈子系统,包含Uni前端源码 ,App+H5+小程序 ,后端thinkphp源码+商业版
    系统介绍系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;我们为你准备了完善的后台管理,不需要你懂PHP,按照教程10分钟安装完即可使用,堪比深夜的杜蕾斯还方便。......
  • (二)网页前端开发基础之HTML
    HTML是一种在因特网上常见的网页制作标注性语言,但因缺少程序设计语言所应有的特征,不能算作一种程序设计语言。它通过浏览器的翻译将网页中的内容呈现给用户。对于网站设计人员,HTLM和CSS是一起用的,它俩的关系是“内容”和“形式”,由HTML确定网页的内容,CSS实现页面的表现形式。两......
  • 前端学习-vue视频学习015-其他API
    尚硅谷视频教程shallowRefshallowReactive浅层次的响应式数据(仅第一层)shallowRef:只能整体修改person.value可以修改,但是person.value.name无法修改shallowReactive:只能修改对象的第一层数据car.brand可以修改,但是car.options.color无法修改主要用处在于:如果数据量非常......
  • 前端使用 Konva 实现可视化设计器(3)
    github/giteeStar终于有几个了!从这章开始,难度算是(或者说细节较多)升级,是不是值得更多的Star呢?!继续求Star,希望大家多多一键三连,十分感谢大家的支持~创作不易,Star50个,创作加速!github源码gitee源码示例地址选择框准备工作想要拖动一个元素,可以考虑使用节点的drag......
  • 前后端分离开发和接口文档管理平台YAPI以及前端工程化(Vue-cli)
    前后端分离开发和接口文档管理平台YAPI以及前端工程化(Vue-cli)前后端分离开发需求分析=>接口定义(API接口文档)=>前后端并行开发(遵守规范)=>测试(前端、后端)=>前后端联调测试YApi1.介绍:YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服......