Skip to content

Commit 30e4af3

Browse files
committed
fix: 🐛 修复 PWA 上 PDF 显示模糊的 bug
#290
1 parent 5c46b4e commit 30e4af3

2 files changed

Lines changed: 43 additions & 14 deletions

File tree

src/pwa/src/fileParser/helper.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { IterableElement } from 'type-fest';
2+
import { setState } from '../store';
23

34
export const imgExtension = new Set([
45
'.png',
@@ -40,3 +41,10 @@ export const isSupportFile = (name: string) => {
4041
if (isimgExtension(extension)) return 'img';
4142
return null;
4243
};
44+
45+
/** 在动态加载时修改图片 url */
46+
export const setImg = (i: number, src: string) => {
47+
setState((state) => {
48+
state.imgList = state.imgList.with(i, { ...state.imgList[i], src });
49+
});
50+
};

src/pwa/src/fileParser/pdf.ts

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import pdfjsWorkerUrl from 'pdfjs-dist/build/pdf.worker.min.mjs?url';
55
import { toast } from 'components/Toast';
66
import { canvasToBlob, plimit, range, t } from 'helper';
77

8-
import type { ImgFile } from '../store';
8+
import { type ImgFile } from '../store';
9+
import { setImg } from './helper';
910

1011
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorkerUrl;
1112

@@ -14,7 +15,9 @@ export const handlePdf = async (file: File): Promise<ImgFile[]> => {
1415
const tip = `「${file.name}${t('pwa.message.parsing')}`;
1516
toast(tip, { duration: Number.POSITIVE_INFINITY });
1617

17-
let list: ImgFile[] = [];
18+
const outputScale = window.devicePixelRatio || 1;
19+
const transform =
20+
outputScale === 1 ? undefined : [outputScale, 0, 0, outputScale, 0, 0];
1821

1922
try {
2023
const task = pdfjsLib.getDocument(await file.arrayBuffer());
@@ -26,23 +29,41 @@ export const handlePdf = async (file: File): Promise<ImgFile[]> => {
2629
};
2730
const pdf = await task.promise;
2831

29-
list = await plimit(
30-
range(pdf.numPages, (i) => async (): Promise<ImgFile> => {
31-
const page = await pdf.getPage(i + 1);
32-
const viewport = page.getViewport({ scale: 1 });
33-
const canvas = new OffscreenCanvas(viewport.width, viewport.height);
34-
await page.render({ canvas: canvas as any, viewport }).promise;
35-
const src = URL.createObjectURL(await canvasToBlob(canvas));
36-
return { src, name: `${i}` };
37-
}),
32+
setTimeout(() =>
33+
plimit(
34+
range(pdf.numPages, (i) => async () => {
35+
const page = await pdf.getPage(i + 1);
36+
const [, , width, height] = page.view;
37+
let scale = 1;
38+
39+
// 缩放图片适应屏幕
40+
if (height > width) {
41+
if (height < document.body.clientHeight)
42+
scale = document.body.clientHeight / height;
43+
} else if (width < document.body.clientWidth)
44+
scale = document.body.clientWidth / width;
45+
46+
const viewport = page.getViewport({ scale });
47+
const canvas = new OffscreenCanvas(
48+
Math.floor(viewport.width * outputScale),
49+
Math.floor(viewport.height * outputScale),
50+
);
51+
await page.render({ canvas: canvas as any, viewport, transform })
52+
.promise;
53+
const src = URL.createObjectURL(await canvasToBlob(canvas));
54+
setImg(i, src);
55+
}),
56+
),
3857
);
58+
59+
return range(pdf.numPages, (i) => ({ src: '', name: `${i}` }));
3960
} catch (error) {
4061
toast.error(
4162
`${file.name} ${t('pwa.alert.parse_error')}${(error as Error).message}`,
4263
);
64+
} finally {
65+
toast.dismiss(tip);
4366
}
4467

45-
toast.dismiss(tip);
46-
47-
return list;
68+
return [];
4869
};

0 commit comments

Comments
 (0)