import type { NextApiRequest, NextApiResponse } from "next"; import type { File as FormidableFile } from "formidable"; import formidable from "formidable"; import fs from "fs/promises"; import { createReport } from "@/lib/pdftron/serverSDK/createReport"; export const config = { api: { bodyParser: false, // ✅ 이게 false면 안 됨! }, }; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method !== "POST") { return res.status(405).end(); } try { const form = formidable({ multiples: false }); form.parse(req, async (err, fields, files) => { if (err) { console.error(err); return res.status(500).json({ error: "Error parsing form" }); } try { const fileName = fields?.customFileName?.[0] ?? ""; const reportDatas = JSON.parse(fields?.reportDatas?.[0] ?? "[]") as { [key: string]: any; }[]; const reportTempPath = fields?.reportTempPath?.[0] ?? ""; const reportCoverPage: FormidableFile | undefined = files?.file?.[0]; if ( !reportCoverPage || fileName.length === 0 || reportDatas.length === 0 || reportTempPath.length === 0 ) { return res.status(400).json({ error: "Invalid Report Data" }); } const buffer = await fs.readFile(reportCoverPage.filepath); const { result, buffer: pdfBuffer, error, } = await createReport(buffer, reportTempPath, reportDatas); if (result && pdfBuffer) { res.setHeader("Content-Type", "application/pdf"); res.setHeader( "Content-Disposition", `attachment; filename="${fileName}"` ); // ✅ 중요! PDFNet에서 나온 pdfBuffer(Uint8Array)를 Node Buffer로 감싸기 return res.send(Buffer.from(pdfBuffer)); } return res .status(200) .json({ success: false, message: "Report 생성에 실패하였습니다.", error, }); } catch (e) { console.log(e); return res.status(400).json({ error: "Invalid additionalData" }); } }); } catch (err) { return res.status(401).end(); } }