Скан PDF с JBIG2 не рисовался: wasmUrl для pdf.js и копирование wasm (#32, AURORA-1635) #33

Merged
aep merged 1 commits from feat/32-pdfjs-jbig2 into test 2026-10-16 12:34:35 +03:00
Owner

Суть

AURORA-1635: в «Проверке распознавания» панель «Исходный документ» пустая (заголовки страниц есть, скан нет), в консоли Jbig2 failed to initialize, Unable to decode image.

Причина (подтверждена)

Сканы банка сжаты JBIG2. pdf.js 5.7.284 декодирует JBIG2, JPEG2000 и ICC-профили через wasm-файлы (jbig2.wasm, openjpeg.wasm, qcms_bg.wasm) и ищет их по опции wasmUrl в getDocument. В arm-web опция не задана, файлов в сборке нет. Проверено по исходникам pdfjs-dist/legacy/build/pdf.worker.mjs (getJsModule, fetchBinaryData(wasmUrl + "jbig2.wasm"), fallback wasmUrl + "jbig2_nowasm_fallback.js") и воспроизведено: собрал минимальный PDF с JBIG2 (MMR-регион 64x64) — без wasmUrl pdf.js печатает ровно те же JBig2 failed to initialize / Unable to decode image, с wasmUrl — декодирует без ошибок.

Решение

  • rsbuild.config.ts: output.copy кладёт node_modules/pdfjs-dist/wasm в dist/static/pdfjs/wasm.
  • src/widgets/DocumentReview/pdfjsOptions.ts: pdfjsWasmUrl(appAddress) строит адрес каталога с учётом ROOT_PATH (/aurora/apps/fastapi-dkb-armka/static/pdfjs/wasm/, слэш в конце обязателен). Тест pdfjsOptions.test.ts.
  • PdfPages.tsx: getDocument({ data, wasmUrl: pdfjsWasmUrl(Config.APP_ADDRESS) }).
  • Legacy-сборка pdf.js (#22) не тронута.

Как проверить

  1. make check, затем ls dist/static/pdfjs/wasm — есть jbig2.wasm, openjpeg.wasm, qcms_bg.wasm.
  2. На стенде открыть документ ББ/ОФР «Славянская производственная компания» 1 кв. 2024 — скан рисуется; в Network запрос .../static/pdfjs/wasm/jbig2.wasm = 200, application/wasm; в консоли нет JBIG2-ошибок.
  3. Если wasm отдаётся 404 — проверить, что платформа публикует весь dist/, включая static/pdfjs/.

Не проверено: ручной прогон в браузере на реальном PDF банка (файла нет в fixtures; в fixtures нет JBIG2). Проверено: node-декодирование JBIG2 с wasmUrl, rsbuild dev с REACT_APP_ROOT_PATH=/aurora/apps/fastapi-dkb-armka отдаёт jbig2.wasm по префиксу (200, application/wasm).

make check

Зелёный (exit 0): biome, ESLint (7 старых предупреждений в чужих файлах), Prettier, tsc, vitest, rsbuild build (wasm в dist).

Rulings I made

  • R-1: копируем только каталог wasm, без cmaps, standard_fonts, iccs — они не нужны для найденной ошибки, ~несколько МБ лишнего; fixed (этот коммит) / при появлении ошибок про шрифты — отдельная задача.
  • R-2: адрес берём из Config.APP_ADDRESS (тот же префикс, что у роутера), а не из assetPrefix сборки: тот при незаданном ROOT_PATH равен ./ и в воркере не работает; fixed (этот коммит).
  • R-3: тест на JBIG2 в vitest не добавлен (нужен wasm+worker в node, тяжело); покрыта чистая функция адреса; rejected (избыточно для bounded).

Closes #32. Jira: AURORA-1635. После merge — синхронизация arm-core/web (make -C docs sync-web).

🤖 Generated with Claude Code

## Суть AURORA-1635: в «Проверке распознавания» панель «Исходный документ» пустая (заголовки страниц есть, скан нет), в консоли `Jbig2 failed to initialize`, `Unable to decode image`. ## Причина (подтверждена) Сканы банка сжаты JBIG2. pdf.js 5.7.284 декодирует JBIG2, JPEG2000 и ICC-профили через wasm-файлы (`jbig2.wasm`, `openjpeg.wasm`, `qcms_bg.wasm`) и ищет их по опции `wasmUrl` в `getDocument`. В arm-web опция не задана, файлов в сборке нет. Проверено по исходникам `pdfjs-dist/legacy/build/pdf.worker.mjs` (`getJsModule`, `fetchBinaryData(wasmUrl + "jbig2.wasm")`, fallback `wasmUrl + "jbig2_nowasm_fallback.js"`) и воспроизведено: собрал минимальный PDF с JBIG2 (MMR-регион 64x64) — без `wasmUrl` pdf.js печатает ровно те же `JBig2 failed to initialize` / `Unable to decode image`, с `wasmUrl` — декодирует без ошибок. ## Решение - `rsbuild.config.ts`: `output.copy` кладёт `node_modules/pdfjs-dist/wasm` в `dist/static/pdfjs/wasm`. - `src/widgets/DocumentReview/pdfjsOptions.ts`: `pdfjsWasmUrl(appAddress)` строит адрес каталога с учётом `ROOT_PATH` (`/aurora/apps/fastapi-dkb-armka/static/pdfjs/wasm/`, слэш в конце обязателен). Тест `pdfjsOptions.test.ts`. - `PdfPages.tsx`: `getDocument({ data, wasmUrl: pdfjsWasmUrl(Config.APP_ADDRESS) })`. - Legacy-сборка pdf.js (#22) не тронута. ## Как проверить 1. `make check`, затем `ls dist/static/pdfjs/wasm` — есть `jbig2.wasm`, `openjpeg.wasm`, `qcms_bg.wasm`. 2. На стенде открыть документ ББ/ОФР «Славянская производственная компания» 1 кв. 2024 — скан рисуется; в Network запрос `.../static/pdfjs/wasm/jbig2.wasm` = 200, `application/wasm`; в консоли нет JBIG2-ошибок. 3. Если wasm отдаётся 404 — проверить, что платформа публикует весь `dist/`, включая `static/pdfjs/`. Не проверено: ручной прогон в браузере на реальном PDF банка (файла нет в fixtures; в fixtures нет JBIG2). Проверено: node-декодирование JBIG2 с `wasmUrl`, `rsbuild dev` с `REACT_APP_ROOT_PATH=/aurora/apps/fastapi-dkb-armka` отдаёт `jbig2.wasm` по префиксу (200, `application/wasm`). ## make check Зелёный (exit 0): biome, ESLint (7 старых предупреждений в чужих файлах), Prettier, tsc, vitest, `rsbuild build` (wasm в dist). ## Rulings I made - R-1: копируем только каталог `wasm`, без `cmaps`, `standard_fonts`, `iccs` — они не нужны для найденной ошибки, ~несколько МБ лишнего; fixed (этот коммит) / при появлении ошибок про шрифты — отдельная задача. - R-2: адрес берём из `Config.APP_ADDRESS` (тот же префикс, что у роутера), а не из `assetPrefix` сборки: тот при незаданном ROOT_PATH равен `./` и в воркере не работает; fixed (этот коммит). - R-3: тест на JBIG2 в vitest не добавлен (нужен wasm+worker в node, тяжело); покрыта чистая функция адреса; rejected (избыточно для bounded). Closes #32. Jira: AURORA-1635. После merge — синхронизация arm-core/web (`make -C docs sync-web`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-16 12:28:35 +03:00
pdf.js 5.x декодирует JBIG2/JPEG2000/ICC через wasm и без опции wasmUrl падает:
«JBig2 failed to initialize», «Unable to decode image» (AURORA-1635).
- rsbuild: output.copy node_modules/pdfjs-dist/wasm -> static/pdfjs/wasm;
- pdfjsOptions.ts: pdfjsWasmUrl(APP_ADDRESS) с учётом ROOT_PATH (+ тест);
- PdfPages: getDocument({ wasmUrl }). Legacy-сборка pdf.js сохранена (#22).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 025233f3c2 into test 2026-10-16 12:34:35 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-web#33
No description provided.