项目中遇到,如果用iframe加载pdf文件时,会自带pdf预览的一些样式,如果需要去掉这些样式,就需要使用pdf.js来解决。
这里需要去遍历pdf的页数,然后再渲染处理。
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta charset="utf-8" /> <link rel="shortcut icon" href="./favicon.ico" /> <meta http-equiv="Cache-Control" content="no-cache" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="theme-color" content="#000000" /> <link rel="manifest" href="./manifest.json" /> <style> @font-face { body { margin: 0; background: #1a2023; } .pdf-header { position: fixed; width: 100%; top: 0; background: #1a2023; padding: 24px; border-bottom: 1px solid hsla(0, 0%, 100%, 0.15); } .pdf-info { word-wrap: break-word; font-size: 20px; font-weight: 600; line-height: 28px; display: flex; align-items: center; color: #fff; } .pdf-logo { height: 16px; flex-shrink: 0; position: absolute; } #pdf-title { flex: 1 1; text-align: center; } #canvas-container { margin-top: 77px; text-align: center; } </style> <title>Pdf 预览</title> <script src="./pdfjs-dist/build/pdf.min.js"></script> <script> const queryObject = () => { let q = {}; window.location.search.replace(/([^?&=]+)=([^&]+)/g, (_, k, v) => (q[k] = v)); return q; }; //多页展示 const renderPage = (pdf, pageNumber) => { pdf.getPage(pageNumber).then(function (page) { const scale = 1.5; const viewport = page.getViewport({ scale: scale }); // Prepare canvas using PDF page dimensions const canvas = document.getElementById(`the-canvas-${pageNumber}`); const context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // Render PDF page into canvas context const renderContext = { canvasContext: context, viewport: viewport, }; const renderTask = page.render(renderContext); renderTask.promise.then(function () { console.log('Page rendered'); }); }); }; const init = () => {
//url=xxx.com?url=xxx&fileName=xxx // const { url = '', fileName = '' } = queryObject(); const search = decodeURIComponent(location.search); let fileName = search.split('&')[1].split('=')[1]; const url = search.split('&')[0].split('=')[1]; document.getElementById('pdf-title').innerText = fileName; if (url === '') { return; } const pdfjsLib = window['pdfjs-dist/build/pdf']; pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.min.js'; let canvasData = []; // Asynchronous download of PDF const loadingTask = pdfjsLib.getDocument(url); loadingTask.promise .then( function (pdf) { for (let i = 0; i < pdf._pdfInfo.numPages; i++) { canvasData.push(i + 1); } let canvas; let container = document.getElementById('canvas-container'); canvasData.forEach(i => { canvas = document.createElement('canvas'); canvas.id = `the-canvas-${i}`; container.appendChild(canvas); }); return pdf; }, e => { console.log(e); } ) .then( function (pdf) { for (let i = 0; i < pdf._pdfInfo.numPages; i++) { renderPage(pdf, i + 1); } }, e => { console.log(e); } ) .catch(e => { console.log(e); }); }; window.addEventListener('load', init); </script> </head> <body version="VERSION"> <div class="pdf-header"> <div class="pdf-info"> <img src="./imgs/logo.png" alt="" class="pdf-logo" /> <div id="pdf-title"></div> </div> </div> <div> <div id="canvas-container"></div> </div> </body> </html>
config-overrides.js:
const {addWebpackAlias,addWebpackPlugin} = require('customize-cra'); module.exports = { webpack: override( addWebpackAlias({ '@': path.resolve(__dirname, 'src'), _styles: path.resolve(__dirname, 'src/styles'), }), addWebpackPlugin( new CopyWebpackPlugin({ patterns: [ { from: 'node_modules/pdfjs-dist', to: 'pdfjs-dist', }, { from: 'node_modules/pdfjs-dist/build/pdf.worker.min.js', to: 'pdfjs-dist/build', transform(content) { return content.toString().replace('"Sig"', '"DebugSig"'); }, }, { from: 'node_modules/pdfjs-dist/build/pdf.min.js', to: 'pdfjs-dist/build', }, ], }) ), ); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2018-07-11 input 文本框,对中文长度校验