(function() { function fileExists(url) { // file:// 场景下 fetch 会被 CORS 限制,直接认为存在,交给浏览器下载失败再说 if (location.protocol === 'file:') return Promise.resolve(true); return fetch(url, { method: 'HEAD' }).then(function(res) { return res.ok; }).catch(function() { return false; }); } function getStaticBase() { // 通过当前脚本(download_pdf.js)已解析后的 src 反推出版本根路径,再拼接 _static/ try { var scripts = document.getElementsByTagName('script'); for (var i = 0; i < scripts.length; i++) { var src = scripts[i].getAttribute('src') || ''; if (src.indexOf('download_pdf.js') !== -1) { var abs = new URL(src, window.location.href).href; // 去掉末尾 '_static/download_pdf.js' var base = abs.replace(/_static\/download_pdf\.js.*$/, ''); return base + '_static/'; } } } catch (e) {} // 兜底:相对当前页面(可能在子目录下,路径可能不正确) return '_static/'; } function loadProjectInfo(staticBase) { // file:// 场景下尝试读取 window.projectInfo(由 project_info.js 提供) if (location.protocol === 'file:') { if (window.projectInfo) return Promise.resolve(window.projectInfo); // 注入一个