@koi-br/ocr-web-sdk 1.0.37 → 1.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-DThQgmjy.js → index-B1uZCXKP.js} +84 -84
- package/dist/{index-Dq2fZsJv.mjs → index-CSqGQ8S7.mjs} +7965 -7919
- package/dist/index.cjs.js +2 -2
- package/dist/index.esm.js +2 -2
- package/dist/{tiff.min-QOtd-CZv.mjs → tiff.min-CqXFy9Hv.mjs} +1 -1
- package/dist/{tiff.min--tAcEsx1.js → tiff.min-D3W7y7O-.js} +1 -1
- package/package.json +1 -1
- package/preview/ImagePreview.vue +142 -9
package/package.json
CHANGED
package/preview/ImagePreview.vue
CHANGED
|
@@ -116,7 +116,17 @@
|
|
|
116
116
|
@mouseleave="stopPan"
|
|
117
117
|
@scroll="handleScroll"
|
|
118
118
|
>
|
|
119
|
-
|
|
119
|
+
<!-- 自适应宽度计算 Loading -->
|
|
120
|
+
<div v-if="isCalculatingAutoFit && autoFitWidth" class="auto-fit-loading">
|
|
121
|
+
<div class="loading-spinner"></div>
|
|
122
|
+
<div class="loading-text">加载中...</div>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div
|
|
126
|
+
class="image-wrapper-container"
|
|
127
|
+
:style="containerStyle"
|
|
128
|
+
:class="{ 'image-hidden': !isImageReady && autoFitWidth }"
|
|
129
|
+
>
|
|
120
130
|
<!-- 渲染所有图片页面 -->
|
|
121
131
|
<div
|
|
122
132
|
v-for="(imageUrl, pageIndex) in imageUrls"
|
|
@@ -390,6 +400,24 @@ const position = ref({ x: 0, y: 0 });
|
|
|
390
400
|
const isPanning = ref(false);
|
|
391
401
|
const lastPosition = ref({ x: 0, y: 0 });
|
|
392
402
|
const initialAutoFitScale = ref<number | null>(null); // 记录初始自适应缩放比例
|
|
403
|
+
const isCalculatingAutoFit = ref(false); // 标记是否正在计算自适应宽度(显示 loading)
|
|
404
|
+
const isImageReady = ref(false); // 标记图片是否已准备好显示(自适应宽度计算完成)
|
|
405
|
+
|
|
406
|
+
// 监听图片URL变化,当有新图片时立即隐藏(等待自适应宽度计算)
|
|
407
|
+
watch(
|
|
408
|
+
() => imageUrls.value,
|
|
409
|
+
(newUrls, oldUrls) => {
|
|
410
|
+
// 如果有新的图片URL,且启用自适应宽度,立即隐藏图片
|
|
411
|
+
if (newUrls && newUrls.length > 0 && props.autoFitWidth) {
|
|
412
|
+
isImageReady.value = false;
|
|
413
|
+
isCalculatingAutoFit.value = true;
|
|
414
|
+
} else if (!props.autoFitWidth) {
|
|
415
|
+
// 如果没有启用自适应宽度,立即显示
|
|
416
|
+
isImageReady.value = true;
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
{ immediate: true }
|
|
420
|
+
);
|
|
393
421
|
const isUserZooming = ref(false); // 标记用户是否主动缩放
|
|
394
422
|
|
|
395
423
|
// 滚动翻页相关
|
|
@@ -938,20 +966,49 @@ const onImageLoad = (event: Event, pageNum: number) => {
|
|
|
938
966
|
if (pageNum === 1 && props.autoFitWidth) {
|
|
939
967
|
// 重置用户缩放标记
|
|
940
968
|
isUserZooming.value = false;
|
|
969
|
+
|
|
970
|
+
// 确保图片是隐藏的(watch 已经设置了,这里再次确认)
|
|
971
|
+
if (!isImageReady.value) {
|
|
972
|
+
isCalculatingAutoFit.value = true;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// 设置超时保护,防止一直显示 loading(最多等待 3 秒)
|
|
976
|
+
const timeoutId = setTimeout(() => {
|
|
977
|
+
console.warn('自适应宽度计算超时,强制显示图片');
|
|
978
|
+
isCalculatingAutoFit.value = false;
|
|
979
|
+
isImageReady.value = true;
|
|
980
|
+
}, 3000);
|
|
941
981
|
|
|
942
982
|
// 使用双重 nextTick 确保容器尺寸已确定
|
|
943
983
|
nextTick(() => {
|
|
944
984
|
nextTick(() => {
|
|
945
985
|
// 添加小延迟确保容器完全渲染
|
|
946
986
|
setTimeout(() => {
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
987
|
+
try {
|
|
988
|
+
const autoScale = calculateAutoFitScale();
|
|
989
|
+
if (autoScale > 0) {
|
|
990
|
+
scale.value = autoScale;
|
|
991
|
+
initialAutoFitScale.value = autoScale; // 记录初始自适应缩放比例
|
|
992
|
+
}
|
|
993
|
+
} catch (error) {
|
|
994
|
+
console.warn('计算自适应宽度失败:', error);
|
|
995
|
+
} finally {
|
|
996
|
+
// 清除超时保护
|
|
997
|
+
clearTimeout(timeoutId);
|
|
998
|
+
// 无论计算结果如何,都要更新状态,避免一直显示 loading
|
|
999
|
+
isCalculatingAutoFit.value = false;
|
|
1000
|
+
// 使用 requestAnimationFrame 确保在下一帧显示,避免闪烁
|
|
1001
|
+
requestAnimationFrame(() => {
|
|
1002
|
+
isImageReady.value = true;
|
|
1003
|
+
});
|
|
951
1004
|
}
|
|
952
1005
|
}, 100); // 增加延迟,确保所有图片都已加载
|
|
953
1006
|
});
|
|
954
1007
|
});
|
|
1008
|
+
} else if (!props.autoFitWidth) {
|
|
1009
|
+
// 如果没有启用自适应宽度,立即显示图片
|
|
1010
|
+
isImageReady.value = true;
|
|
1011
|
+
isCalculatingAutoFit.value = false;
|
|
955
1012
|
}
|
|
956
1013
|
|
|
957
1014
|
// 如果第一页已经加载完成,且当前页不是第一页,也应用自适应宽度
|
|
@@ -2270,6 +2327,10 @@ const handleContainerResize = () => {
|
|
|
2270
2327
|
resizeTimer = null;
|
|
2271
2328
|
}
|
|
2272
2329
|
|
|
2330
|
+
// 隐藏图片,显示 loading
|
|
2331
|
+
isImageReady.value = false;
|
|
2332
|
+
isCalculatingAutoFit.value = true;
|
|
2333
|
+
|
|
2273
2334
|
// 立即计算并应用新的缩放比例,避免过渡期间露出底色
|
|
2274
2335
|
// 使用 requestAnimationFrame 确保在浏览器重绘前更新
|
|
2275
2336
|
requestAnimationFrame(() => {
|
|
@@ -2287,6 +2348,11 @@ const handleContainerResize = () => {
|
|
|
2287
2348
|
scale.value = finalScale;
|
|
2288
2349
|
initialAutoFitScale.value = finalScale;
|
|
2289
2350
|
}
|
|
2351
|
+
// 计算完成后,显示图片并隐藏 loading
|
|
2352
|
+
isCalculatingAutoFit.value = false;
|
|
2353
|
+
requestAnimationFrame(() => {
|
|
2354
|
+
isImageReady.value = true;
|
|
2355
|
+
});
|
|
2290
2356
|
}, 350); // 350ms 延迟,略大于过渡动画时间(300ms),确保过渡完成后稳定
|
|
2291
2357
|
});
|
|
2292
2358
|
};
|
|
@@ -2300,18 +2366,44 @@ onMounted(() => {
|
|
|
2300
2366
|
if (firstPageImage && firstPageImage.complete && props.autoFitWidth) {
|
|
2301
2367
|
const firstPageSize = imageSizes.get(1);
|
|
2302
2368
|
if (firstPageSize && firstPageSize.width > 0) {
|
|
2369
|
+
// 隐藏图片,显示 loading
|
|
2370
|
+
isImageReady.value = false;
|
|
2371
|
+
isCalculatingAutoFit.value = true;
|
|
2372
|
+
|
|
2373
|
+
// 设置超时保护,防止一直显示 loading(最多等待 3 秒)
|
|
2374
|
+
const timeoutId = setTimeout(() => {
|
|
2375
|
+
console.warn('自适应宽度计算超时,强制显示图片');
|
|
2376
|
+
isCalculatingAutoFit.value = false;
|
|
2377
|
+
isImageReady.value = true;
|
|
2378
|
+
}, 3000);
|
|
2379
|
+
|
|
2303
2380
|
nextTick(() => {
|
|
2304
2381
|
nextTick(() => {
|
|
2305
2382
|
setTimeout(() => {
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2383
|
+
try {
|
|
2384
|
+
const autoScale = calculateAutoFitScale();
|
|
2385
|
+
if (autoScale > 0) {
|
|
2386
|
+
scale.value = autoScale;
|
|
2387
|
+
initialAutoFitScale.value = autoScale;
|
|
2388
|
+
}
|
|
2389
|
+
} catch (error) {
|
|
2390
|
+
console.warn('计算自适应宽度失败:', error);
|
|
2391
|
+
} finally {
|
|
2392
|
+
// 清除超时保护
|
|
2393
|
+
clearTimeout(timeoutId);
|
|
2394
|
+
// 无论计算结果如何,都要更新状态,避免一直显示 loading
|
|
2395
|
+
isCalculatingAutoFit.value = false;
|
|
2396
|
+
requestAnimationFrame(() => {
|
|
2397
|
+
isImageReady.value = true;
|
|
2398
|
+
});
|
|
2310
2399
|
}
|
|
2311
2400
|
}, 100);
|
|
2312
2401
|
});
|
|
2313
2402
|
});
|
|
2314
2403
|
}
|
|
2404
|
+
} else if (!props.autoFitWidth) {
|
|
2405
|
+
// 如果没有启用自适应宽度,立即显示图片
|
|
2406
|
+
isImageReady.value = true;
|
|
2315
2407
|
}
|
|
2316
2408
|
|
|
2317
2409
|
// 监听容器尺寸变化(用于响应外部收起/展开操作)
|
|
@@ -2381,6 +2473,47 @@ defineExpose({
|
|
|
2381
2473
|
overflow: auto;
|
|
2382
2474
|
}
|
|
2383
2475
|
|
|
2476
|
+
// 自适应宽度计算 Loading
|
|
2477
|
+
.auto-fit-loading {
|
|
2478
|
+
position: absolute;
|
|
2479
|
+
top: 50%;
|
|
2480
|
+
left: 50%;
|
|
2481
|
+
transform: translate(-50%, -50%);
|
|
2482
|
+
z-index: 1000;
|
|
2483
|
+
display: flex;
|
|
2484
|
+
flex-direction: column;
|
|
2485
|
+
align-items: center;
|
|
2486
|
+
gap: 12px;
|
|
2487
|
+
padding: 20px 30px;
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2490
|
+
.loading-spinner {
|
|
2491
|
+
width: 32px;
|
|
2492
|
+
height: 32px;
|
|
2493
|
+
border: 3px solid #e5e7eb;
|
|
2494
|
+
border-top-color: #1890ff;
|
|
2495
|
+
border-radius: 50%;
|
|
2496
|
+
animation: spin 0.8s linear infinite;
|
|
2497
|
+
}
|
|
2498
|
+
|
|
2499
|
+
@keyframes spin {
|
|
2500
|
+
to {
|
|
2501
|
+
transform: rotate(360deg);
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
.loading-text {
|
|
2506
|
+
font-size: 14px;
|
|
2507
|
+
color: #666;
|
|
2508
|
+
white-space: nowrap;
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
// 图片隐藏状态(自适应宽度计算完成前)
|
|
2512
|
+
// 使用 display: none 确保图片完全不可见,不会在加载过程中显示
|
|
2513
|
+
.image-wrapper-container.image-hidden {
|
|
2514
|
+
display: none !important;
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2384
2517
|
// 页码信息样式
|
|
2385
2518
|
.page-info {
|
|
2386
2519
|
display: inline-flex;
|