前台2

74 阅读1分钟
自动加载加密PDF
正在加载 PDF...
<script>
    // 页面加载完成后自动执行
    window.addEventListener('DOMContentLoaded', async () => {
        try {
            // 1. 显示加载提示
            document.getElementById('loading').style.display = 'block';

            // 2. 从后端获取加密数据
            const response = await fetch('/api/encrypted-pdf');
            if (!response.ok) throw new Error('请求失败');
            const { data, key, iv } = await response.json();

            // 3. Base64 转 ArrayBuffer
            const encryptedData = base64ToArrayBuffer(data);
            const keyBuffer = base64ToArrayBuffer(key);
            const ivBuffer = base64ToArrayBuffer(iv);

            // 4. 解密数据
            const cryptoKey = await window.crypto.subtle.importKey(
                'raw',
                keyBuffer,
                { name: 'AES-CBC' },
                false,
                ['decrypt']
            );

            const decryptedData = await window.crypto.subtle.decrypt(
                { name: 'AES-CBC', iv: ivBuffer },
                cryptoKey,
                encryptedData
            );

            // 5. 生成 Blob URL
            const blob = new Blob([decryptedData], { type: 'application/pdf' });
            const blobUrl = URL.createObjectURL(blob);

            // 6. 自动跳转到 viewer.html(通过 iframe 或新窗口)
            const viewerUrl = `/pdfjs/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;
            
            // 方式一:在当前页面通过 iframe 嵌入
            const iframe = document.createElement('iframe');
            iframe.src = viewerUrl;
            iframe.style.width = '100%';
            iframe.style.height = '100vh';
            document.body.appendChild(iframe);

            // 方式二:直接跳转到新窗口(取消注释以下行)
            // window.location.href = viewerUrl;

            // 隐藏加载提示
            document.getElementById('loading').style.display = 'none';

        } catch (error) {
            console.error('加载失败:', error);
            document.getElementById('loading').style.display = 'none';
            document.getElementById('error').style.display = 'block';
            document.getElementById('error').innerText = `加载失败: ${error.message}`;
        }
    });

    // Base64 转 ArrayBuffer 工具函数
    function base64ToArrayBuffer(base64) {
        const binaryString = window.atob(base64);
        const len = binaryString.length;
        const bytes = new Uint8Array(len);
        for (let i = 0; i < len; i++) {
            bytes[i] = binaryString.charCodeAt(i);
        }
        return bytes.buffer;
    }
</script>