项目中遇到,如果用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',
},
],
})
),
);
}