一个基于 Vue 3 + Vite + pdfjs-dist 的轻量 H5 PDF 在线预览与下载示例,支持通过地址栏参数或输入框加载任意可公开访问的 PDF 链接,并提供分页与缩放操作。项目包含一个用于绕过 CORS 的简单反向代理(EdgeOne Pages Functions)。

?url=PDF直链pdf-viewer-h5 ├── functions/ # EdgeOne Pages Functions (服务端代理) │ └── api/ │ └── index.js # /api?url=... 反向代理以解决 CORS ├── src/ │ ├── components/ │ │ └── PdfViewer.vue # PDF 渲染与分页/缩放 │ ├── App.vue # UI、输入与下载逻辑 │ └── main.js # Vue 应用入口与路由 ├── index.html ├── vite.config.js └── package.json
npm install
npm run dev
前端默认通过以下地址请求代理:
https://pdfviewer.airmole.cn/api?url= (见 src/App.vue 中 api 常量)你可以用 EdgeOne CLI 在本地运行 Pages Functions:
npm install -g edgeone
edgeone pages dev
/api?url=... 将通过 functions/api/index.js 进行反代到真实 PDF 链接,并设置 Content-Type: application/pdf 与 CORS 响应头。npm run builddistfunctions/ 目录)/api 代理会在同一域名下工作npm run build
npm run preview
?url=PDF直链,示例:
http://localhost:8080/?url=https://example.com/sample.pdf
Content-Disposition 或原始 URL 推断文件名修改默认代理地址:编辑 src/App.vue 中的
const api = ref('https://pdfviewer.airmole.cn/api?url=')
建议改造为从环境变量读取,例如结合 Vite 环境变量(import.meta.env)与 .env 文件。
Pdf.js 工作线程:
src/components/PdfViewer.vue 已使用 ESM 入口并通过
import workerUrl from 'pdfjs-dist/build/pdf.worker.mjs?url' GlobalWorkerOptions.workerSrc = workerUrl
正确配置了 worker。若构建环境发生变化,请确保静态资源可被正确加载。
预览空白或跨域错误
edgeone pages devsrc/App.vue 的 api 地址与代理端口一致下载失败
functions/api/index.js 中扩展functions/api/index.js 仅用于演示最小可用的 CORS 代理,请勿用于开放匿名任意转发到受限资源的生产环境。