Compare commits
No commits in common. "a3d3154f6fe520120ccdead9622aecb0abd2c67a" and "2f3f3087dbcd6bbe35a2444e6fc8ef0b3e0d7af7" have entirely different histories.
a3d3154f6f
...
2f3f3087db
@ -25,8 +25,7 @@ SPA кредитного аналитика АРМ КА: справочники
|
|||||||
|
|
||||||
## Стек и ограничения
|
## Стек и ограничения
|
||||||
- React 18 + TypeScript strict, rsbuild, antd 6 (основной UI-кит; daisyui/tailwind — из шаблона), react-router 7,
|
- React 18 + TypeScript strict, rsbuild, antd 6 (основной UI-кит; daisyui/tailwind — из шаблона), react-router 7,
|
||||||
Redux Toolkit, pdfjs-dist (только legacy-сборка через `widgets/DocumentReview/pdfjs.ts`: обычная падает в Яндекс Браузере,
|
Redux Toolkit, pdfjs-dist; линтер — biome (ширина 140, одинарные кавычки).
|
||||||
#22); линтер — biome (ширина 140, одинарные кавычки).
|
|
||||||
- Пакеты `raisa-*` — `optionalDependencies` (вне банка недоступны); `package-lock.json` в git не хранится (как в шаблоне:
|
- Пакеты `raisa-*` — `optionalDependencies` (вне банка недоступны); `package-lock.json` в git не хранится (как в шаблоне:
|
||||||
в банке зависимости ставятся через Nexus).
|
в банке зависимости ставятся через Nexus).
|
||||||
- env только `REACT_APP_*` через `src/conf/config.ts`; `REACT_APP_API_URL` — адрес arm-core, `REACT_APP_ROOT_PATH` =
|
- env только `REACT_APP_*` через `src/conf/config.ts`; `REACT_APP_API_URL` — адрес arm-core, `REACT_APP_ROOT_PATH` =
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
|
import * as pdfjsLib from 'pdfjs-dist';
|
||||||
|
|
||||||
import type { PDFDocumentProxy, RenderTask } from 'pdfjs-dist';
|
import type { PDFDocumentProxy, RenderTask } from 'pdfjs-dist';
|
||||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
import { pdfjsLib } from './pdfjs';
|
|
||||||
|
// worker собирается вместе с приложением (без CDN)
|
||||||
|
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();
|
||||||
|
|
||||||
export const MIN_ZOOM = 0.5;
|
export const MIN_ZOOM = 0.5;
|
||||||
export const MAX_ZOOM = 3;
|
export const MAX_ZOOM = 3;
|
||||||
|
|||||||
@ -1,54 +0,0 @@
|
|||||||
import { afterEach, describe, expect, it } from 'vitest';
|
|
||||||
|
|
||||||
// под vitest `new URL(<пакет>, import.meta.url)` из pdfjs.ts не резолвится сборщиком — воркер берём по пути от корня проекта
|
|
||||||
const WORKER = new URL('../../../node_modules/pdfjs-dist/legacy/build/pdf.worker.min.mjs', import.meta.url).href;
|
|
||||||
|
|
||||||
/** Минимальный PDF из одной страницы с корректной таблицей xref. */
|
|
||||||
function minimalPdf(): Uint8Array {
|
|
||||||
const objects = [
|
|
||||||
'<< /Type /Catalog /Pages 2 0 R >>',
|
|
||||||
'<< /Type /Pages /Kids [3 0 R] /Count 1 >>',
|
|
||||||
'<< /Type /Page /Parent 2 0 R /MediaBox [0 0 200 100] >>',
|
|
||||||
];
|
|
||||||
let body = '%PDF-1.4\n';
|
|
||||||
const offsets: number[] = [];
|
|
||||||
objects.forEach((obj, i) => {
|
|
||||||
offsets.push(body.length);
|
|
||||||
body += `${i + 1} 0 obj\n${obj}\nendobj\n`;
|
|
||||||
});
|
|
||||||
const xref = body.length;
|
|
||||||
body += `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
|
|
||||||
for (const o of offsets) {
|
|
||||||
body += `${String(o).padStart(10, '0')} 00000 n \n`;
|
|
||||||
}
|
|
||||||
body += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xref}\n%%EOF\n`;
|
|
||||||
return new TextEncoder().encode(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
type ToHexProto = { toHex?: unknown };
|
|
||||||
const proto = Uint8Array.prototype as ToHexProto;
|
|
||||||
const nativeToHex = proto.toHex;
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
if (nativeToHex === undefined) {
|
|
||||||
delete proto.toHex;
|
|
||||||
} else {
|
|
||||||
proto.toHex = nativeToHex;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('pdfjs (сборка для браузеров без Uint8Array.prototype.toHex)', () => {
|
|
||||||
// Яндекс Браузер (ядро Chromium < 140) не имеет Uint8Array.prototype.toHex; обычная сборка pdf.js 5.x вызывает его
|
|
||||||
// при открытии документа (отпечаток) и падает «a.toHex is not a function». Legacy-сборка несёт полифилл.
|
|
||||||
it('открывает PDF, когда Uint8Array.prototype.toHex отсутствует', async () => {
|
|
||||||
delete proto.toHex;
|
|
||||||
const { pdfjsLib } = await import('./pdfjs');
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc = WORKER;
|
|
||||||
const doc = await pdfjsLib.getDocument({ data: minimalPdf() }).promise;
|
|
||||||
try {
|
|
||||||
expect(doc.numPages).toBe(1);
|
|
||||||
} finally {
|
|
||||||
await doc.destroy();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// Legacy-сборка pdf.js: несёт полифиллы (в т. ч. Uint8Array.prototype.toHex, Chromium 140+), без которых обычная
|
|
||||||
// сборка падает при открытии документа в Яндекс Браузере — «a.toHex is not a function» (arm-web #22). Воркер — та же
|
|
||||||
// сборка, собирается вместе с приложением (без CDN).
|
|
||||||
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.mjs';
|
|
||||||
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/legacy/build/pdf.worker.min.mjs', import.meta.url).toString();
|
|
||||||
|
|
||||||
export { pdfjsLib };
|
|
||||||
Loading…
x
Reference in New Issue
Block a user