P粉2983052662023-08-18 15:50:09
在renderPdfPage
函數中,您建立了一個包含渲染PDF頁面的canvas
元素的div
元素。然後將這些div
元素附加到一個canvas
元素上。然而,如果瀏覽器支援canvas
元素,則不會渲染canvas
元素的後代元素。根據canvas元素的規範:
回退內容的定義如下:
您需要將父級canvas
變更為適當的元素。在下面的演示中,我使用了一個div
:
const { StrictMode, useRef } = React; const { createRoot } = ReactDOM; const styles = {}; const Previewer = (props) => { const pdfContainerRef = useRef(null); React.useEffect(() => { if (props.pdfUrl) { initPdf(props.pdfUrl); } }, []); // Converted async/await function to use promise because Stack Snippet's Babel version does not support async/await const initPdf = (pdfUrl) => { // Reference CDN version of PDF.js instead of using ES6 import const pdfJS = pdfjsLib; pdfJS.GlobalWorkerOptions.workerSrc = "https://unpkg.com/pdfjs-dist@3.9.179/build/pdf.worker.js"; return pdfJS.getDocument({ url: pdfUrl, cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.9.179/cmaps/', cMapPacked: true, }).promise.then((pdf) => { const totalPages = pdf.numPages; for (let i = 0; i < totalPages; i++) { renderPdfPage(pdf, pdfJS, i + 1); } }); } // Converted async/await function to use promise because Stack Snippet's Babel version does not support async/await const renderPdfPage = (pdf, pdfJS, pageNum) => { return pdf.getPage(pageNum).then((page) => { const viewport = page.getViewport({ scale: 1.0 }); let divPage = window.document.createElement("div"); if(!pdfContainerRef || !pdfContainerRef.current) return; let canvas = divPage.appendChild(window.document.createElement("canvas")); const canvasContext = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext, viewport }; const renderTask = page.render(renderContext); renderTask.promise.then(function () { const textContent = page.getTextContent(); return textContent; }).then(function (textContent) { const textLayer = document.querySelector(`.${styles.textLayer}`); if (!textLayer) return; textLayer.style.left = canvas.offsetLeft + 'px'; textLayer.style.top = canvas.offsetTop + 'px'; textLayer.style.height = canvas.offsetHeight + 'px'; textLayer.style.width = canvas.offsetWidth + 'px'; textLayer.style.setProperty('--scale-factor', '1.0'); pdfJS.renderTextLayer({ textContentSource: textContent, container: textLayer, viewport: viewport, textDivs: [] }); }); pdfContainerRef.current.appendChild(divPage); }); } return ( <div className={styles.cavasLayer}> <div id="pdf-container" ref={pdfContainerRef} /> {/**<div className={styles.textLayer}></div>**/} </div> ); } const pdfUrl = "https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf" const root = createRoot(document.getElementById("root")); root.render(<StrictMode><Previewer pdfUrl={pdfUrl} /></StrictMode>);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <script crossorigin src="https://unpkg.com/pdfjs-dist@3.9.179/build/pdf.js"></script> <div id="root"></div>