Android 打开 在线 pdf 文件

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>H5 PDF 预览</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script>
    <style>
        body { margin: 0; padding: 10px; box-sizing: border-box; }
        #pdfContainer { width: 100%; min-height: 80vh; border: 1px solid #eee; }
        .loading { text-align: center; padding: 20px; color: #666; }
        .error { text-align: center; padding: 20px; color: red; }
    </style>
</head>
<body>
<div class="loading" id="loading">正在加载PDF...</div>
<div class="error" id="error" style="display: none;"></div>
<div id="pdfContainer"></div>

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

    // 从URL参数获取PDF地址
    function getPdfUrlFromParams() {
        const urlParams = new URLSearchParams(window.location.search);
        return urlParams.get('pdfUrl');
    }

    // 初始化PDF渲染
    async function renderPdf() {
        const container = document.getElementById('pdfContainer');
        const loading = document.getElementById('loading');
        const errorDiv = document.getElementById('error');

        // 获取PDF URL
        const pdfUrl = getPdfUrlFromParams();

        if (!pdfUrl) {
            loading.style.display = 'none';
            errorDiv.style.display = 'block';
            errorDiv.textContent = '未提供PDF文件地址';
            return;
        }

        try {
            // 获取PDF文档
            const pdfDoc = await pdfjsLib.getDocument(pdfUrl).promise;
            loading.style.display = 'none';

            // 渲染每一页PDF
            for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) {
                const page = await pdfDoc.getPage(pageNum);
                // 设置渲染尺寸(适配移动端宽度)
                const viewport = page.getViewport({ scale: 1 });
                const scale = window.innerWidth / viewport.width;
                const scaledViewport = page.getViewport({ scale: scale });

                // 创建画布容器
                const canvas = document.createElement('canvas');
                const context = canvas.getContext('2d');
                canvas.width = scaledViewport.width;
                canvas.height = scaledViewport.height;
                container.appendChild(canvas);

                // 渲染页面
                await page.render({
                    canvasContext: context,
                    viewport: scaledViewport
                }).promise;
            }
        } catch (error) {
            loading.style.display = 'none';
            errorDiv.style.display = 'block';
            errorDiv.textContent = 'PDF加载失败,请检查文件地址';
            console.error('PDF加载错误:', error);
        }
    }

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

将这个文件放在服务器上,让后直接用webView打开,拼接上 pdfUrl= 链接,就Ok了

相关推荐
weixin_440784115 小时前
【HandlerThread实现原理】
android·java·开发语言
唐诺8 小时前
Android USB ADB 调试方案完全解析
android·adb·usb
寰宇星城12 小时前
AppActuator - 让 AI Agent 直接理解并操作运行中的 Android App
android
波罗丁牌12 小时前
uni-app 实现视频聊天、屏幕分享,支持Android、HarmonyOS、iOS
android·uni-app·音视频
峥嵘life12 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
jieyucx13 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
凡泰AI14 小时前
APP同时覆盖了iOS、安卓和鸿蒙,如何选择混合开发架构才能减少重复建设,提高功能上线效率~
android·ios·harmonyos·mpaas·uni·小程序容器
叶辞树15 小时前
死锁问题分析
android
TimeFine15 小时前
让 Codex “用上”Android Studio:JetBrains MCP Server 接入与实践
android
随手工具-Excel, pdf, SQL16 小时前
多个 PDF 怎么合并成一个?免费在线工具,还能混入图片和 Word
pdf·word·效率工具·在线工具·pdf合并·合并pdf