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..2d222949 --- /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); + if (Number.isNaN(relativeIndex)) { + relativeIndex = 0; + } + relativeIndex = Math.trunc(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..0f9c9c5f --- /dev/null +++ b/server/src/test/java/cn/keking/PdfViewerCompatibilityTests.java @@ -0,0 +1,35 @@ +package cn.keking; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PdfViewerCompatibilityTests { + + @Test + void shouldLoadCompatibilityModuleBeforePdfJs() throws IOException { + String viewerHtml = readResource("/static/pdfjs/web/viewer.html"); + + assertTrue(viewerHtml.contains("")); + assertTrue(viewerHtml.indexOf("compatibility.mjs") < viewerHtml.indexOf("../build/pdf.mjs")); + } + + @Test + void shouldLoadCompatibilityModuleInPdfWorker() throws IOException { + String workerScript = readResource("/static/pdfjs/build/pdf.worker.mjs"); + + assertTrue(workerScript.contains("import \"../web/compatibility.mjs\";")); + } + + private String readResource(String resourcePath) throws IOException { + try (InputStream inputStream = getClass().getResourceAsStream(resourcePath)) { + assertNotNull(inputStream); + return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + } + } +}