@@ -5,7 +5,8 @@ import pdfjsWorkerUrl from 'pdfjs-dist/build/pdf.worker.min.mjs?url';
55import { toast } from 'components/Toast' ;
66import { 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
1011pdfjsLib . 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