Fix blank scanned PDF pages
Browse files- scripts/copy_reader_vendor.mjs +8 -1
- static/reader.js +2 -1
scripts/copy_reader_vendor.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import { createHash } from "node:crypto";
|
| 2 |
import { mkdirSync, writeFileSync } from "node:fs";
|
| 3 |
import { get } from "node:https";
|
| 4 |
-
import { join } from "node:path";
|
| 5 |
|
| 6 |
const output = process.argv[2] || "static/vendor";
|
| 7 |
mkdirSync(output, { recursive: true });
|
|
@@ -42,6 +42,11 @@ async function main() {
|
|
| 42 |
for (const [url, target, expected] of [
|
| 43 |
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/build/pdf.min.mjs", "pdf.min.mjs", "e0be3863c23c8af2305b16548febd58e7f8874a460253317d7771cddbc1c0f6d"],
|
| 44 |
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/build/pdf.worker.min.mjs", "pdf.worker.min.mjs", "0613f41490dd6aaceed7a93fbbd38c85e6d6aa60474b6588c6e7709cfbe18cb3"],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
["https://cdn.jsdelivr.net/npm/epubjs@0.3.93/dist/epub.min.js", "epub.min.js", "06eae15745107b4aa508c95538275251f69bfb9f1175621fc458d9f42ed082d4"],
|
| 46 |
["https://cdn.jsdelivr.net/npm/marked@18.0.10/lib/marked.umd.js", "marked.min.js", "eaccee2fb9fb3b2c09e873a5504da82507850d9e677bd720122ac49e2a03982a"],
|
| 47 |
["https://cdn.jsdelivr.net/npm/dompurify@3.4.14/dist/purify.min.js", "purify.min.js", "c2f26ea4fc0d88141c9aa430eb515ac86fce59418ceebd85fa475b87a8d6c3e6"],
|
|
@@ -51,9 +56,11 @@ for (const [url, target, expected] of [
|
|
| 51 |
const bytes = await downloadWithRetry(url);
|
| 52 |
const actual = createHash("sha256").update(bytes).digest("hex");
|
| 53 |
if (actual !== expected) throw new Error(`${url}: SHA-256 ${actual} does not match ${expected}`);
|
|
|
|
| 54 |
writeFileSync(join(output, target), bytes);
|
| 55 |
const dot = target.lastIndexOf(".");
|
| 56 |
const versioned = `${target.slice(0, dot)}.${actual.slice(0, 12)}${target.slice(dot)}`;
|
|
|
|
| 57 |
writeFileSync(join(output, versioned), bytes);
|
| 58 |
}
|
| 59 |
}
|
|
|
|
| 1 |
import { createHash } from "node:crypto";
|
| 2 |
import { mkdirSync, writeFileSync } from "node:fs";
|
| 3 |
import { get } from "node:https";
|
| 4 |
+
import { dirname, join } from "node:path";
|
| 5 |
|
| 6 |
const output = process.argv[2] || "static/vendor";
|
| 7 |
mkdirSync(output, { recursive: true });
|
|
|
|
| 42 |
for (const [url, target, expected] of [
|
| 43 |
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/build/pdf.min.mjs", "pdf.min.mjs", "e0be3863c23c8af2305b16548febd58e7f8874a460253317d7771cddbc1c0f6d"],
|
| 44 |
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/build/pdf.worker.min.mjs", "pdf.worker.min.mjs", "0613f41490dd6aaceed7a93fbbd38c85e6d6aa60474b6588c6e7709cfbe18cb3"],
|
| 45 |
+
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/wasm/jbig2.wasm", "wasm/jbig2.wasm", "e6bee67724a7b5436fe8162638e3708cfc8d52b6342db69a49715e30ff27cfdc"],
|
| 46 |
+
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/wasm/jbig2_nowasm_fallback.js", "wasm/jbig2_nowasm_fallback.js", "04c795a6657a4553a64b781ea3e85256203d913c3b71b72b85fa3ce00622f458"],
|
| 47 |
+
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/wasm/openjpeg.wasm", "wasm/openjpeg.wasm", "004a0e62db930ba9ff2a22212f4554d0bb57a0635a8287caf70f98117cee14ba"],
|
| 48 |
+
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/wasm/openjpeg_nowasm_fallback.js", "wasm/openjpeg_nowasm_fallback.js", "0f998419819da4491d8302222aa9e2ff2494685641aa2a6c21c3760c29f3e319"],
|
| 49 |
+
["https://cdn.jsdelivr.net/npm/pdfjs-dist@6.2.108/wasm/qcms_bg.wasm", "wasm/qcms_bg.wasm", "663d86126d5f5fcb1c61490f94353e2a8375660b8c5498ab3ebab5a34b08800e"],
|
| 50 |
["https://cdn.jsdelivr.net/npm/epubjs@0.3.93/dist/epub.min.js", "epub.min.js", "06eae15745107b4aa508c95538275251f69bfb9f1175621fc458d9f42ed082d4"],
|
| 51 |
["https://cdn.jsdelivr.net/npm/marked@18.0.10/lib/marked.umd.js", "marked.min.js", "eaccee2fb9fb3b2c09e873a5504da82507850d9e677bd720122ac49e2a03982a"],
|
| 52 |
["https://cdn.jsdelivr.net/npm/dompurify@3.4.14/dist/purify.min.js", "purify.min.js", "c2f26ea4fc0d88141c9aa430eb515ac86fce59418ceebd85fa475b87a8d6c3e6"],
|
|
|
|
| 56 |
const bytes = await downloadWithRetry(url);
|
| 57 |
const actual = createHash("sha256").update(bytes).digest("hex");
|
| 58 |
if (actual !== expected) throw new Error(`${url}: SHA-256 ${actual} does not match ${expected}`);
|
| 59 |
+
mkdirSync(dirname(join(output, target)), { recursive: true });
|
| 60 |
writeFileSync(join(output, target), bytes);
|
| 61 |
const dot = target.lastIndexOf(".");
|
| 62 |
const versioned = `${target.slice(0, dot)}.${actual.slice(0, 12)}${target.slice(dot)}`;
|
| 63 |
+
mkdirSync(dirname(join(output, versioned)), { recursive: true });
|
| 64 |
writeFileSync(join(output, versioned), bytes);
|
| 65 |
}
|
| 66 |
}
|
static/reader.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
const PDFJS_URL = "/static/vendor/pdf.min.e0be3863c23c.mjs";
|
| 2 |
const PDFJS_WORKER_URL = "/static/pdf-worker-wrapper.mjs";
|
|
|
|
| 3 |
const EPUB_URL = "/static/vendor/epub.min.06eae1574510.js";
|
| 4 |
const MARKED_URL = "/static/vendor/marked.min.eaccee2fb9fb.js";
|
| 5 |
const PURIFY_URL = "/static/vendor/purify.min.c2f26ea4fc0d.js";
|
|
@@ -404,7 +405,7 @@ async function start() {
|
|
| 404 |
} catch (error) { console.error(error); fail("原文件加载失败,请检查网络后重试,或下载原文件。"); }
|
| 405 |
}
|
| 406 |
function prepareDocument() {
|
| 407 |
-
if (capability.mode === "pdf") return import(PDFJS_URL).then((pdfjs) => { pdfjs.GlobalWorkerOptions.workerSrc = PDFJS_WORKER_URL;
|
| 408 |
if (capability.mode === "markdown") return Promise.all([fetch(contentUrl), Promise.all([loadScript(MARKED_URL), loadScript(PURIFY_URL)])]).then(([response, engines]) => ({ response, engines }));
|
| 409 |
if (capability.mode === "text") return fetch(contentUrl).then((response) => ({ response }));
|
| 410 |
if (capability.mode === "epub") return Promise.all([fetch(contentUrl), loadScript(JSZIP_URL).then(() => loadScript(EPUB_URL))]);
|
|
|
|
| 1 |
const PDFJS_URL = "/static/vendor/pdf.min.e0be3863c23c.mjs";
|
| 2 |
const PDFJS_WORKER_URL = "/static/pdf-worker-wrapper.mjs";
|
| 3 |
+
const PDFJS_WASM_URL = "/static/vendor/wasm/";
|
| 4 |
const EPUB_URL = "/static/vendor/epub.min.06eae1574510.js";
|
| 5 |
const MARKED_URL = "/static/vendor/marked.min.eaccee2fb9fb.js";
|
| 6 |
const PURIFY_URL = "/static/vendor/purify.min.c2f26ea4fc0d.js";
|
|
|
|
| 405 |
} catch (error) { console.error(error); fail("原文件加载失败,请检查网络后重试,或下载原文件。"); }
|
| 406 |
}
|
| 407 |
function prepareDocument() {
|
| 408 |
+
if (capability.mode === "pdf") return import(PDFJS_URL).then((pdfjs) => { pdfjs.GlobalWorkerOptions.workerSrc = PDFJS_WORKER_URL; const options = (url) => ({ url, wasmUrl: PDFJS_WASM_URL, withCredentials: false }); return pdfjs.getDocument(options(contentUrl)).promise.catch(() => pdfjs.getDocument(options(sourceUrl)).promise); });
|
| 409 |
if (capability.mode === "markdown") return Promise.all([fetch(contentUrl), Promise.all([loadScript(MARKED_URL), loadScript(PURIFY_URL)])]).then(([response, engines]) => ({ response, engines }));
|
| 410 |
if (capability.mode === "text") return fetch(contentUrl).then((response) => ({ response }));
|
| 411 |
if (capability.mode === "epub") return Promise.all([fetch(contentUrl), loadScript(JSZIP_URL).then(() => loadScript(EPUB_URL))]);
|