如何快速的用pdfjs建立一个网页可以在线阅读你的PDF文件

#如何快速的用pdfjs建立一个网页可以在线阅读你的PDF文件#

也许很多人都用过这个pdfjs,我之前也用过,但是每次配置也是挺麻烦的,于是就写了一个页面远程调用CDN文件,这样一个页面就可以搞定,话不多说直接上代码:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PDF Viewer</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <style>
        #pdf-container {
            width: 100%;
            height: 100vh;
            overflow: auto;
            display: flex;
            flex-direction: column;
            align-items: center;
            touch-action: pan-y pinch-zoom;
            position: relative;
        }
        #pdf-viewer {
            margin: 20px 0;
            max-width: 100%;
            height: auto;
        }
        #controls {
            position: fixed;
            bottom: 0;
            left: 0;
            right: 0;
            background: rgba(255, 255, 255, 0.95);
            padding: 15px;
            border-radius: 15px 15px 0 0;
            box-shadow: 0 -2px 10px rgba(0,0,0,0.1);
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 10px;
            align-items: center;
            z-index: 1000;
        }
        button {
            padding: 8px 20px;
            cursor: pointer;
            background: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            font-size: 16px;
            min-width: 44px;
            min-height: 44px;
            touch-action: manipulation;
        }
        button:disabled {
            background: #ccc;
            cursor: not-allowed;
        }
        #page-info {
            margin: 0 10px;
            font-size: 16px;
        }
        #loading-overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(255, 255, 255, 0.9);
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            z-index: 2000;
        }
        .loading-spinner {
            width: 50px;
            height: 50px;
            border: 5px solid #f3f3f3;
            border-top: 5px solid #4CAF50;
            border-radius: 50%;
            animation: spin 1s linear infinite;
            margin-bottom: 20px;
        }
        .loading-text {
            font-size: 18px;
            color: #333;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        @media (max-width: 600px) {
            #controls {
                padding: 10px;
                gap: 5px;
            }
            button {
                padding: 8px 15px;
                font-size: 14px;
            }
            #page-info {
                font-size: 14px;
                width: 100%;
                text-align: center;
                order: -1;
            }
        }
    </style>
</head>
<body>
    <div id="pdf-container">
        <canvas id="pdf-viewer"></canvas>
        <div id="controls">
            <button id="prev-page" disabled>Previous</button>
            <span id="page-info">Page 1 of 1</span>
            <button id="next-page" disabled>Next</button>
            <button id="zoom-out">Zoom Out</button>
            <button id="zoom-in">Zoom In</button>
        </div>
        <div id="loading-overlay">
            <div class="loading-spinner"></div>
            <div class="loading-text">Loading PDF file...</div>
        </div>
    </div>

    <script>
        // 配置 PDF.js worker
        pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';

        let currentPage = 1;
        let currentScale = 1.5;
        let pdfDoc = null;

        // 更新页面信息
        const updatePageInfo = () => {
            document.getElementById('page-info').textContent = `Page ${currentPage} of ${pdfDoc.numPages}`;
            document.getElementById('prev-page').disabled = currentPage <= 1;
            document.getElementById('next-page').disabled = currentPage >= pdfDoc.numPages;
        };

        // 渲染当前页面
        const renderPage = async () => {
            const page = await pdfDoc.getPage(currentPage);
            const canvas = document.getElementById('pdf-viewer');
            const context = canvas.getContext('2d');

            const viewport = page.getViewport({ scale: currentScale });
            canvas.height = viewport.height;
            canvas.width = viewport.width;

            const renderContext = {
                canvasContext: context,
                viewport: viewport
            };
            await page.render(renderContext);
            updatePageInfo();
        };

        // 加载PDF文件
        const loadPDF = async () => {
            const loadingOverlay = document.getElementById('loading-overlay');
            try {
                const loadingTask = pdfjsLib.getDocument('file/file.pdf');
                loadingTask.onProgress = function(progress) {
                    const percent = (progress.loaded / progress.total * 100).toFixed(0);
                    document.querySelector('.loading-text').textContent = `Loading PDF file... ${percent}%`;
                };
                pdfDoc = await loadingTask.promise;
                await renderPage();
                loadingOverlay.style.display = 'none';

                // 绑定按钮事件
                document.getElementById('prev-page').onclick = async () => {
                    if (currentPage > 1) {
                        currentPage--;
                        await renderPage();
                    }
                };

                document.getElementById('next-page').onclick = async () => {
                    if (currentPage < pdfDoc.numPages) {
                        currentPage++;
                        await renderPage();
                    }
                };

                document.getElementById('zoom-in').onclick = async () => {
                    currentScale += 0.25;
                    await renderPage();
                };

                document.getElementById('zoom-out').onclick = async () => {
                    if (currentScale > 0.5) {
                        currentScale -= 0.25;
                        await renderPage();
                    }
                };
            } catch (error) {
                console.error('Error loading PDF:', error);
                loadingOverlay.querySelector('.loading-text').textContent = 'Failed to load PDF file. Please ensure the file exists and is accessible.';
                loadingOverlay.querySelector('.loading-spinner').style.display = 'none';
            }
        };

        // 页面加载完成后执行
        window.onload = loadPDF;
    </script>
</body>
</html>

页面js和css都写好了,当这个文件很大,需要加载一些时间的时候页面也会出现加载的进度条。

喜欢的拿去直接用吧。

相关推荐
开开心心_Every5 小时前
免费进销存管理软件:云端本地双部署
java·游戏·微信·eclipse·pdf·excel·语音识别
winfredzhang8 小时前
从零构建:手写一个支持“高度定制化排版”的 Chrome 网页摘录插件
chrome·pdf·插件·epub·零碎信息归档
裴嘉靖9 小时前
前端获取二进制文件并预览的完整指南
前端·pdf
KG_LLM图谱增强大模型9 小时前
[20页中英文PDF]生物制药企业新一代知识管理:用知识图谱+大模型构建“第二大脑“
人工智能·pdf·知识图谱
开开心心就好10 小时前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
helloworld也报错?10 小时前
保存网页为PDF
前端·javascript·pdf
东方-教育技术博主10 小时前
PDF文件夹去重
pdf
eybk10 小时前
拖放pdf转化为txt文件多进程多线程合并分词版
java·python·pdf
梦凡尘10 小时前
前端web端解析 Word、Pdf 文档文本内容
pdf·js
白典典11 小时前
iTextPDF生成手册时目录页码与实际页码不匹配问题求助
java·spring·pdf·intellij-idea