自动加载加密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>