Files
TaxHacker_s23/lib/previews/pdf.ts
2025-05-07 14:53:13 +02:00

55 lines
1.8 KiB
TypeScript

"use server"
import { fileExists, getUserPreviewsDirectory, safePathJoin } from "@/lib/files"
import { User } from "@/prisma/client"
import fs from "fs/promises"
import path from "path"
import { fromPath } from "pdf2pic"
import config from "../config"
export async function pdfToImages(user: User, origFilePath: string): Promise<{ contentType: string; pages: string[] }> {
const userPreviewsDirectory = getUserPreviewsDirectory(user)
await fs.mkdir(userPreviewsDirectory, { recursive: true })
const basename = path.basename(origFilePath, path.extname(origFilePath))
// Check if converted pages already exist
const existingPages: string[] = []
for (let i = 1; i <= config.upload.pdfs.maxPages; i++) {
const convertedFilePath = safePathJoin(userPreviewsDirectory, `${basename}.${i}.webp`)
if (await fileExists(convertedFilePath)) {
existingPages.push(convertedFilePath)
} else {
break
}
}
if (existingPages.length > 0) {
return { contentType: "image/webp", pages: existingPages }
}
// If not — convert the file as store in previews folder
const pdf2picOptions = {
density: config.upload.pdfs.dpi,
saveFilename: basename,
savePath: userPreviewsDirectory,
format: "webp",
quality: config.upload.pdfs.quality,
width: config.upload.pdfs.maxWidth,
height: config.upload.pdfs.maxHeight,
preserveAspectRatio: true,
}
try {
const convert = fromPath(origFilePath, pdf2picOptions)
const results = await convert.bulk(-1, { responseType: "image" }) // TODO: respect MAX_PAGES here too
const paths = results.filter((result) => result && result.path).map((result) => result.path) as string[]
return {
contentType: "image/webp",
pages: paths,
}
} catch (error) {
console.error("Error converting PDF to image:", error)
throw error
}
}