Скан PDF с JBIG2 не рисовался: передать pdf.js wasmUrl и копировать wasm в сборку (#32)
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>
This commit is contained in:
parent
5acb6ef3c3
commit
f868a9250f
@ -12,6 +12,8 @@ export default defineConfig({
|
||||
},
|
||||
},
|
||||
output: {
|
||||
// wasm-декодеры pdf.js (JBIG2, JPEG2000, ICC): без них скан не рисуется (AURORA-1635). Путь = PDFJS_WASM_DIR
|
||||
copy: [{ from: 'node_modules/pdfjs-dist/wasm', to: 'static/pdfjs/wasm' }],
|
||||
filename: {
|
||||
js: '[name]_script.[contenthash:8].js',
|
||||
css: '[name]_style.[contenthash:8].css',
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
import type { PDFDocumentProxy, RenderTask } from 'pdfjs-dist';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { Config } from '../../conf/config';
|
||||
import { pdfjsLib } from './pdfjs';
|
||||
import { pdfjsWasmUrl } from './pdfjsOptions';
|
||||
|
||||
export const MIN_ZOOM = 0.5;
|
||||
export const MAX_ZOOM = 3;
|
||||
@ -22,7 +24,7 @@ export default function PdfPages({ data, zoom }: { data: ArrayBuffer; zoom: numb
|
||||
let cancelled = false;
|
||||
async function load() {
|
||||
// pdf.js забирает переданный буфер себе, поэтому отдаём копию (эффект может выполниться повторно)
|
||||
pdf = await pdfjsLib.getDocument({ data: data.slice(0) }).promise;
|
||||
pdf = await pdfjsLib.getDocument({ data: data.slice(0), wasmUrl: pdfjsWasmUrl(Config.APP_ADDRESS) }).promise;
|
||||
if (cancelled) {
|
||||
pdf.destroy();
|
||||
return;
|
||||
|
||||
17
src/widgets/DocumentReview/pdfjsOptions.test.ts
Normal file
17
src/widgets/DocumentReview/pdfjsOptions.test.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { PDFJS_WASM_DIR, pdfjsWasmUrl } from './pdfjsOptions';
|
||||
|
||||
describe('pdfjsWasmUrl', () => {
|
||||
it('кладёт wasm под префикс приложения и заканчивается слэшем (pdf.js дописывает к нему имя файла)', () => {
|
||||
expect(pdfjsWasmUrl('/aurora/apps/fastapi-dkb-armka')).toBe(`/aurora/apps/fastapi-dkb-armka/${PDFJS_WASM_DIR}/`);
|
||||
});
|
||||
|
||||
it('не удваивает слэши, если префикс уже заканчивается слэшем', () => {
|
||||
expect(pdfjsWasmUrl('/aurora/apps/fastapi-dkb-armka/')).toBe(`/aurora/apps/fastapi-dkb-armka/${PDFJS_WASM_DIR}/`);
|
||||
});
|
||||
|
||||
it('при корневом префиксе даёт путь от корня', () => {
|
||||
expect(pdfjsWasmUrl('/')).toBe(`/${PDFJS_WASM_DIR}/`);
|
||||
expect(pdfjsWasmUrl('')).toBe(`/${PDFJS_WASM_DIR}/`);
|
||||
});
|
||||
});
|
||||
14
src/widgets/DocumentReview/pdfjsOptions.ts
Normal file
14
src/widgets/DocumentReview/pdfjsOptions.ts
Normal file
@ -0,0 +1,14 @@
|
||||
// Опции pdf.js для getDocument. Чистый модуль (без импорта pdfjs-dist), чтобы его можно было тестировать.
|
||||
//
|
||||
// pdf.js 5.x декодирует сканы JBIG2 и JPEG2000 и цветовые профили ICC через wasm-файлы (jbig2.wasm, openjpeg.wasm,
|
||||
// qcms_bg.wasm). Без опции wasmUrl он их не находит: «JBig2 failed to initialize», «Unable to decode image», страница
|
||||
// остаётся пустой (AURORA-1635). Файлы копирует в сборку rsbuild.config.ts (output.copy) в каталог PDFJS_WASM_DIR.
|
||||
|
||||
/** Каталог wasm-файлов pdf.js в собранном приложении (относительно корня приложения). Тот же путь — в rsbuild.config.ts. */
|
||||
export const PDFJS_WASM_DIR = 'static/pdfjs/wasm';
|
||||
|
||||
/** Адрес каталога wasm: с учётом префикса приложения (ROOT_PATH) и обязательным слэшем в конце — pdf.js дописывает к нему имя файла. */
|
||||
export function pdfjsWasmUrl(appAddress: string): string {
|
||||
const base = appAddress.replace(/\/+$/, '');
|
||||
return `${base}/${PDFJS_WASM_DIR}/`;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user