@anaralabs/lector 3.12.3 → 3.12.4
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.js +68 -14
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1285,18 +1285,36 @@ var useCanvasLayer = ({ background }) => {
|
|
|
1285
1285
|
baseCanvas.style.visibility = "hidden";
|
|
1286
1286
|
let cancelled = false;
|
|
1287
1287
|
const viewport = pdfPageProxy.getViewport({ scale: baseScale });
|
|
1288
|
+
const buffer = document.createElement("canvas");
|
|
1289
|
+
buffer.width = baseCanvas.width;
|
|
1290
|
+
buffer.height = baseCanvas.height;
|
|
1291
|
+
const bufferCtx = buffer.getContext("2d");
|
|
1292
|
+
const useBuffer = bufferCtx !== null;
|
|
1293
|
+
const renderCanvas = useBuffer ? buffer : baseCanvas;
|
|
1294
|
+
const renderCtx = bufferCtx ?? context;
|
|
1288
1295
|
const renderingTask = pdfPageProxy.render({
|
|
1289
|
-
canvas:
|
|
1290
|
-
canvasContext:
|
|
1296
|
+
canvas: renderCanvas,
|
|
1297
|
+
canvasContext: renderCtx,
|
|
1291
1298
|
viewport,
|
|
1292
1299
|
background
|
|
1293
1300
|
});
|
|
1301
|
+
const releaseBuffer = () => {
|
|
1302
|
+
buffer.width = 0;
|
|
1303
|
+
buffer.height = 0;
|
|
1304
|
+
};
|
|
1294
1305
|
renderingTask.promise.then(() => {
|
|
1295
|
-
if (cancelled)
|
|
1306
|
+
if (cancelled) {
|
|
1307
|
+
releaseBuffer();
|
|
1308
|
+
return;
|
|
1309
|
+
}
|
|
1310
|
+
if (useBuffer) {
|
|
1311
|
+
context.clearRect(0, 0, baseCanvas.width, baseCanvas.height);
|
|
1312
|
+
context.drawImage(buffer, 0, 0);
|
|
1313
|
+
}
|
|
1296
1314
|
baseCanvas.style.visibility = "";
|
|
1297
1315
|
markPageRendered(pageNumber);
|
|
1298
1316
|
if (typeof createImageBitmap !== "undefined") {
|
|
1299
|
-
createImageBitmap(
|
|
1317
|
+
createImageBitmap(renderCanvas).then((bitmap) => {
|
|
1300
1318
|
if (cancelled) {
|
|
1301
1319
|
bitmap.close();
|
|
1302
1320
|
return;
|
|
@@ -1309,9 +1327,12 @@ var useCanvasLayer = ({ background }) => {
|
|
|
1309
1327
|
bitmap
|
|
1310
1328
|
);
|
|
1311
1329
|
}).catch(() => {
|
|
1312
|
-
});
|
|
1330
|
+
}).finally(releaseBuffer);
|
|
1331
|
+
} else {
|
|
1332
|
+
releaseBuffer();
|
|
1313
1333
|
}
|
|
1314
1334
|
}).catch((error) => {
|
|
1335
|
+
releaseBuffer();
|
|
1315
1336
|
if (cancelled) return;
|
|
1316
1337
|
if (error?.name === "RenderingCancelledException") return;
|
|
1317
1338
|
baseCanvas.style.visibility = "";
|
|
@@ -3036,18 +3057,32 @@ var useScrollFn = () => {
|
|
|
3036
3057
|
);
|
|
3037
3058
|
return { scrollToFn };
|
|
3038
3059
|
};
|
|
3039
|
-
var useVisiblePage = ({
|
|
3060
|
+
var useVisiblePage = ({
|
|
3061
|
+
items,
|
|
3062
|
+
scrollOffset
|
|
3063
|
+
}) => {
|
|
3040
3064
|
const zoomLevel = usePdf((state) => state.zoom);
|
|
3041
3065
|
const isPinching = usePdf((state) => state.isPinching);
|
|
3042
3066
|
const setCurrentPage = usePdf((state) => state.setCurrentPage);
|
|
3043
3067
|
const scrollElement = usePdf((state) => state.viewportRef?.current);
|
|
3044
3068
|
const lastPageRef = useRef(0);
|
|
3069
|
+
const [viewportHeight, setViewportHeight] = useState(0);
|
|
3070
|
+
useEffect(() => {
|
|
3071
|
+
if (!scrollElement) return;
|
|
3072
|
+
const measure = () => setViewportHeight(scrollElement.clientHeight);
|
|
3073
|
+
measure();
|
|
3074
|
+
if (typeof ResizeObserver === "undefined") {
|
|
3075
|
+
window.addEventListener("resize", measure);
|
|
3076
|
+
return () => window.removeEventListener("resize", measure);
|
|
3077
|
+
}
|
|
3078
|
+
const observer = new ResizeObserver(measure);
|
|
3079
|
+
observer.observe(scrollElement);
|
|
3080
|
+
return () => observer.disconnect();
|
|
3081
|
+
}, [scrollElement]);
|
|
3045
3082
|
const calculateVisiblePageIndex = useCallback(
|
|
3046
3083
|
(virtualItems) => {
|
|
3047
|
-
if (
|
|
3048
|
-
const
|
|
3049
|
-
const viewportHeight = scrollElement.clientHeight / zoomLevel;
|
|
3050
|
-
const viewportCenter = scrollTop + viewportHeight / 2;
|
|
3084
|
+
if (virtualItems.length === 0 || scrollOffset == null) return 0;
|
|
3085
|
+
const viewportCenter = scrollOffset + viewportHeight / zoomLevel / 2;
|
|
3051
3086
|
let closestIndex = 0;
|
|
3052
3087
|
let smallestDistance = Infinity;
|
|
3053
3088
|
for (const item of virtualItems) {
|
|
@@ -3060,10 +3095,17 @@ var useVisiblePage = ({ items }) => {
|
|
|
3060
3095
|
}
|
|
3061
3096
|
return closestIndex;
|
|
3062
3097
|
},
|
|
3063
|
-
[
|
|
3098
|
+
[scrollOffset, zoomLevel, viewportHeight]
|
|
3064
3099
|
);
|
|
3065
3100
|
useEffect(() => {
|
|
3066
|
-
if (
|
|
3101
|
+
if (viewportHeight === 0 && scrollElement) {
|
|
3102
|
+
const h = scrollElement.clientHeight;
|
|
3103
|
+
if (h > 0) {
|
|
3104
|
+
setViewportHeight(h);
|
|
3105
|
+
return;
|
|
3106
|
+
}
|
|
3107
|
+
}
|
|
3108
|
+
if (!isPinching && items.length > 0 && viewportHeight > 0 && scrollOffset != null) {
|
|
3067
3109
|
const mostVisibleIndex = calculateVisiblePageIndex(items);
|
|
3068
3110
|
const page = mostVisibleIndex + 1;
|
|
3069
3111
|
if (page !== lastPageRef.current) {
|
|
@@ -3071,7 +3113,15 @@ var useVisiblePage = ({ items }) => {
|
|
|
3071
3113
|
setCurrentPage?.(page);
|
|
3072
3114
|
}
|
|
3073
3115
|
}
|
|
3074
|
-
}, [
|
|
3116
|
+
}, [
|
|
3117
|
+
items,
|
|
3118
|
+
isPinching,
|
|
3119
|
+
calculateVisiblePageIndex,
|
|
3120
|
+
setCurrentPage,
|
|
3121
|
+
viewportHeight,
|
|
3122
|
+
scrollOffset,
|
|
3123
|
+
scrollElement
|
|
3124
|
+
]);
|
|
3075
3125
|
return null;
|
|
3076
3126
|
};
|
|
3077
3127
|
|
|
@@ -5267,7 +5317,11 @@ var Pages = ({
|
|
|
5267
5317
|
const virtualizerItems = virtualizer?.getVirtualItems() ?? [];
|
|
5268
5318
|
const items = tempItems.length ? tempItems : virtualizerItems;
|
|
5269
5319
|
useVisiblePage({
|
|
5270
|
-
items
|
|
5320
|
+
items,
|
|
5321
|
+
// Pass through nullish (pre-measure) rather than coercing to 0, so the
|
|
5322
|
+
// hook doesn't publish a top-of-document page before the real offset
|
|
5323
|
+
// (incl. a restored/deep-linked one) arrives.
|
|
5324
|
+
scrollOffset: virtualizer.scrollOffset ?? null
|
|
5271
5325
|
});
|
|
5272
5326
|
useFitWidth({ viewportRef: containerRef });
|
|
5273
5327
|
const largestPageWidth = usePdf(selectLargestPageWidth);
|