40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import * as pdfjsLib from "pdfjs-dist"
|
|
import pdfWorkerSrc from "pdfjs-dist/build/pdf.worker.mjs?url"
|
|
|
|
import { PAGE_WIDTH } from "../../../utils/exam-canvas/model"
|
|
|
|
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfWorkerSrc
|
|
|
|
export interface PdfPageImage {
|
|
pageNumber: number
|
|
src: string
|
|
width: number
|
|
height: number
|
|
}
|
|
|
|
export async function loadPdfPageImages(pdfBytes: ArrayBuffer, targetWidth = PAGE_WIDTH): Promise<PdfPageImage[]> {
|
|
const pdf = await pdfjsLib.getDocument({ data: new Uint8Array(pdfBytes) }).promise
|
|
const pages: PdfPageImage[] = []
|
|
|
|
for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber += 1) {
|
|
const page = await pdf.getPage(pageNumber)
|
|
const baseViewport = page.getViewport({ scale: 1 })
|
|
const scale = targetWidth / baseViewport.width
|
|
const viewport = page.getViewport({ scale })
|
|
const canvas = document.createElement("canvas")
|
|
canvas.width = Math.ceil(viewport.width)
|
|
canvas.height = Math.ceil(viewport.height)
|
|
const context = canvas.getContext("2d")
|
|
if (!context) throw new Error("Unable to create PDF render canvas")
|
|
await page.render({ canvasContext: context, viewport }).promise
|
|
pages.push({
|
|
pageNumber,
|
|
src: canvas.toDataURL("image/png"),
|
|
width: canvas.width,
|
|
height: canvas.height,
|
|
})
|
|
}
|
|
|
|
return pages
|
|
}
|