yexingyangPDF / reader.html
quejing's picture
Upload 36 files
4cbd2e8 verified
Raw
History Blame Contribute Delete
6.14 kB
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PDF 预览</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%;overflow:hidden}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Microsoft YaHei',sans-serif;background:#0f172a;color:#e2e8f0;display:flex;flex-direction:column}
.topbar{
background:#1e293b;padding:0.5rem 1rem;
display:flex;align-items:center;gap:0.6rem;border-bottom:1px solid #334155;
flex-shrink:0;flex-wrap:wrap;min-height:48px;
}
.topbar .back-btn{
color:#94a3b8;text-decoration:none;font-size:0.82rem;display:flex;align-items:center;gap:0.25rem;
transition:color 0.15s;white-space:nowrap;
}
.topbar .back-btn:hover{color:white}
.topbar .sep{color:#475569;font-size:0.75rem}
.topbar .fname{
font-size:0.85rem;color:#cbd5e1;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:100px;
}
.topbar a.dl-btn{
color:#fbbf24;text-decoration:none;font-size:0.78rem;font-weight:600;
padding:0.3rem 0.7rem;border-radius:6px;border:1px solid rgba(251,191,36,0.35);transition:all 0.15s;white-space:nowrap;
}
.topbar a.dl-btn:hover{background:rgba(251,191,36,0.1)}
/* embed 全屏铺满 */
.embed-wrap{flex:1;position:relative;background:#1a1f2e}
.embed-wrap embed,.embed-wrap iframe{
position:absolute;inset:0;width:100%;height:100%;border:none;
}
.loading-msg{
display:flex;flex-direction:column;align-items:center;justify-content:center;
text-align:center;color:#94a3b8;gap:0.75rem;height:100%;
}
.loading-msg .spinner{width:36px;height:36px;border:3px solid #334155;border-top-color:#6366f1;border-radius:50%;animation:spin 0.7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.error-msg{
display:flex;flex-direction:column;align-items:center;justify-content:center;
text-align:center;color:#94a3b8;padding:2rem;gap:1rem;height:100%;
}
.error-msg .icon{font-size:3rem}
.error-msg p{max-width:420px;line-height:1.6;font-size:0.9rem}
.error-msg a{
display:inline-block;padding:0.55rem 1.5rem;
background:linear-gradient(135deg,#f59e0b,#d97706);color:white;text-decoration:none;
border-radius:10px;font-weight:600;font-size:0.9rem;transition:all 0.15s;
}
.error-msg a:hover{transform:translateY(-1px);box-shadow:0 4px 16px rgba(245,158,11,0.3)}
.error-msg .gdoc-link{
background:linear-gradient(135deg,#6366f1,#4f46e5);
font-size:0.82rem;padding:0.4rem 1rem;
}
.error-msg .gdoc-link:hover{box-shadow:0 4px 16px rgba(99,102,241,0.3)}
</style>
</head>
<body>
<div class="topbar">
<a class="back-btn" href="javascript:history.back()">&larr; 返回列表</a>
<span class="sep">|</span>
<span class="fname" id="fileName">加载中...</span>
<a class="dl-btn" id="downloadBtn" href="" target="_blank" rel="noopener">&#11015; 下载</a>
</div>
<div class="embed-wrap" id="embedWrap">
<div class="loading-msg"><div class="spinner"></div><span>正在加载 PDF...</span></div>
</div>
<script>
const params = new URLSearchParams(window.location.search);
const url = params.get('url') || '';
const name = params.get('name') || '预览';
document.title = name + ' - 预览';
document.getElementById('fileName').textContent = name;
document.getElementById('downloadBtn').href = url;
if (!url) {
document.getElementById('embedWrap').innerHTML = `
<div class="error-msg">
<span class="icon">&#9888;</span>
<h2 style="color:#e2e8f0;font-weight:600;font-size:1.1rem;">无效的文件地址</h2>
<p>请返回列表重新选择文件</p>
</div>`;
} else {
// 方案1: 直接用 <embed> 加载 PDF,和浏览器直接打开一样
const embed = document.createElement('embed');
embed.src = url;
embed.type = 'application/pdf';
embed.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;border:none;';
// 超时回退(PDF 很大时 embed 可能加载慢)
const timeout = setTimeout(() => {
const wrap = document.getElementById('embedWrap');
if (wrap.children.length === 1 && wrap.children[0] === embed) {
// embed 还在加载中,显示回退按钮
const gdocUrl = 'https://docs.google.com/viewer?url=' + encodeURIComponent(url) + '&embedded=true';
wrap.innerHTML = `
<div class="error-msg">
<span class="icon">&#9203;</span>
<h2 style="color:#e2e8f0;font-weight:600;font-size:1.1rem;">加载时间较长</h2>
<p>PDF 文件较大,加载可能需要一些时间。如果长时间没有显示,请尝试以下方式:</p>
<a href="${url}" target="_blank" rel="noopener">&#11015; 直接下载 PDF</a>
<a class="gdoc-link" href="${gdocUrl}" target="_blank" rel="noopener">&#127760; Google 预览</a>
</div>`;
}
}, 15000);
embed.addEventListener('load', () => {
clearTimeout(timeout);
});
embed.addEventListener('error', () => {
clearTimeout(timeout);
const gdocUrl = 'https://docs.google.com/viewer?url=' + encodeURIComponent(url) + '&embedded=true';
document.getElementById('embedWrap').innerHTML = `
<div class="error-msg">
<span class="icon">&#128196;</span>
<h2 style="color:#e2e8f0;font-weight:600;font-size:1.1rem;">PDF 加载失败</h2>
<p>可能由于浏览器限制或网络问题无法直接预览,请尝试以下方式:</p>
<a href="${url}" target="_blank" rel="noopener">&#11015; 直接下载 PDF</a>
<a class="gdoc-link" href="${gdocUrl}" target="_blank" rel="noopener">&#127760; Google 预览</a>
</div>`;
});
document.getElementById('embedWrap').innerHTML = '';
document.getElementById('embedWrap').appendChild(embed);
}
</script>
</body>
</html>