diff --git a/server/src/main/resources/static/pdfjs/build/pdf.worker.mjs b/server/src/main/resources/static/pdfjs/build/pdf.worker.mjs
index 34462b0c..af9a06bb 100644
--- a/server/src/main/resources/static/pdfjs/build/pdf.worker.mjs
+++ b/server/src/main/resources/static/pdfjs/build/pdf.worker.mjs
@@ -24,6 +24,7 @@
* pdfjsVersion = 5.4.530
* pdfjsBuild = 50cc4adac
*/
+import "../web/compatibility.mjs";
/******/ var __webpack_modules__ = ({
/***/ 34:
@@ -66999,4 +67000,4 @@ globalThis.pdfjsWorker = {
export { WorkerMessageHandler };
-//# sourceMappingURL=pdf.worker.mjs.map
\ No newline at end of file
+//# sourceMappingURL=pdf.worker.mjs.map
diff --git a/server/src/main/resources/static/pdfjs/web/compatibility.mjs b/server/src/main/resources/static/pdfjs/web/compatibility.mjs
new file mode 100644
index 00000000..794fc716
--- /dev/null
+++ b/server/src/main/resources/static/pdfjs/web/compatibility.mjs
@@ -0,0 +1,42 @@
+const atTargets = [
+ Array,
+ String,
+ Int8Array,
+ Uint8Array,
+ Uint8ClampedArray,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ globalThis.BigInt64Array,
+ globalThis.BigUint64Array,
+];
+
+function installAtPolyfill(target) {
+ if (!target?.prototype || typeof target.prototype.at === "function") {
+ return;
+ }
+ Object.defineProperty(target.prototype, "at", {
+ value(index) {
+ const length = this.length >>> 0;
+ let relativeIndex = Number(index) || 0;
+ if (!Number.isFinite(relativeIndex)) {
+ relativeIndex = 0;
+ }
+ relativeIndex = relativeIndex < 0 ? Math.ceil(relativeIndex) : Math.floor(relativeIndex);
+ const resolvedIndex = relativeIndex >= 0 ? relativeIndex : length + relativeIndex;
+ if (resolvedIndex < 0 || resolvedIndex >= length) {
+ return undefined;
+ }
+ return this[resolvedIndex];
+ },
+ writable: true,
+ configurable: true,
+ });
+}
+
+for (const target of atTargets) {
+ installAtPolyfill(target);
+}
diff --git a/server/src/main/resources/static/pdfjs/web/viewer.html b/server/src/main/resources/static/pdfjs/web/viewer.html
index 6a4ba5d1..629bb858 100644
--- a/server/src/main/resources/static/pdfjs/web/viewer.html
+++ b/server/src/main/resources/static/pdfjs/web/viewer.html
@@ -29,6 +29,7 @@ See https://github.com/adobe-type-tools/cmap-resources
+
diff --git a/server/src/test/java/cn/keking/PdfViewerCompatibilityTests.java b/server/src/test/java/cn/keking/PdfViewerCompatibilityTests.java
new file mode 100644
index 00000000..84f92633
--- /dev/null
+++ b/server/src/test/java/cn/keking/PdfViewerCompatibilityTests.java
@@ -0,0 +1,32 @@
+package cn.keking;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+public class PdfViewerCompatibilityTests {
+
+ @Test
+ void shouldLoadCompatibilityModuleBeforePdfJs() throws IOException {
+ String viewerHtml = readResource("/static/pdfjs/web/viewer.html");
+
+ assert viewerHtml.contains("");
+ assert viewerHtml.indexOf("compatibility.mjs") < viewerHtml.indexOf("../build/pdf.mjs");
+ }
+
+ @Test
+ void shouldLoadCompatibilityModuleInPdfWorker() throws IOException {
+ String workerScript = readResource("/static/pdfjs/build/pdf.worker.mjs");
+
+ assert workerScript.contains("import \"../web/compatibility.mjs\";");
+ }
+
+ private String readResource(String resourcePath) throws IOException {
+ try (InputStream inputStream = getClass().getResourceAsStream(resourcePath)) {
+ assert inputStream != null;
+ return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+ }
+ }
+}