|
|
@@ -20,42 +20,48 @@
|
|
|
<script setup>
|
|
|
import { ref, onMounted } from "vue"
|
|
|
import * as PDF from "pdfjs-dist"
|
|
|
+// 引入 Vite 识别的 worker URL(处理哈希路径)
|
|
|
+import localWorkerUrl from "pdfjs-dist/build/pdf.worker.mjs?url"
|
|
|
|
|
|
let workerBlobUrl = null
|
|
|
|
|
|
const initWorker = async () => {
|
|
|
if (workerBlobUrl) return
|
|
|
|
|
|
- // 尝试多个可能的 Worker 路径
|
|
|
+ const pdfjsVersion = PDF.version
|
|
|
const urls = [
|
|
|
- // 1. 生产环境:相对于库文件的路径(已在 build:lib 时拷贝并重命名为 .js)
|
|
|
+ // 1. 优先使用 CDN,规避所有本地服务器配置问题
|
|
|
+ `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsVersion}/pdf.worker.min.mjs`,
|
|
|
+ `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdfjsVersion}/build/pdf.worker.min.mjs`,
|
|
|
+ `https://unpkg.com/pdfjs-dist@${pdfjsVersion}/build/pdf.worker.min.mjs`,
|
|
|
+ // 2. 本地备选:Vite 处理后的路径
|
|
|
+ localWorkerUrl,
|
|
|
+ // 3. 库模式下的路径
|
|
|
new URL("./pdf.worker.js", import.meta.url).toString(),
|
|
|
- // 2. 开发环境:node_modules 路径
|
|
|
- new URL("pdfjs-dist/build/pdf.worker.mjs", import.meta.url).toString(),
|
|
|
]
|
|
|
|
|
|
let lastError = null
|
|
|
for (const url of urls) {
|
|
|
try {
|
|
|
- // 方案:通过 Fetch 获取 worker 内容并转换为 Blob URL
|
|
|
- // 这样可以绕过服务器对 .mjs 文件的 MIME 类型校验(application/octet-stream)
|
|
|
const response = await fetch(url)
|
|
|
if (!response.ok) continue
|
|
|
|
|
|
const arrayBuffer = await response.arrayBuffer()
|
|
|
- const blob = new Blob([arrayBuffer], { type: "application/javascript" })
|
|
|
+ // 强制指定为 ESM 模块
|
|
|
+ const blob = new Blob([arrayBuffer], { type: "text/javascript" })
|
|
|
workerBlobUrl = URL.createObjectURL(blob)
|
|
|
PDF.GlobalWorkerOptions.workerSrc = workerBlobUrl
|
|
|
- return // 成功加载则退出
|
|
|
+ console.log("PDF Worker loaded successfully from:", url)
|
|
|
+ return
|
|
|
} catch (e) {
|
|
|
lastError = e
|
|
|
continue
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- console.warn("All PDF worker paths failed, using fallback", lastError)
|
|
|
- // 最后的保底方案
|
|
|
- PDF.GlobalWorkerOptions.workerSrc = urls[urls.length - 1]
|
|
|
+ console.error("All PDF worker paths failed", lastError)
|
|
|
+ // 最后保底:直接尝试 localWorkerUrl
|
|
|
+ PDF.GlobalWorkerOptions.workerSrc = localWorkerUrl
|
|
|
}
|
|
|
|
|
|
const props = defineProps({
|