mirror of
https://github.com/marcogll/TaxHacker_s23.git
synced 2026-01-13 13:25:18 +00:00
55 lines
1.8 KiB
TypeScript
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
|
|
}
|
|
}
|