From 92ddb4f13d48cbf344dc2bf63df4457b3c713608 Mon Sep 17 00:00:00 2001 From: rlaks5757 Date: Wed, 26 Mar 2025 16:51:54 +0900 Subject: feat: report batch download 기능 완료 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/api/pdftron/createVendorDataReports.ts | 81 ++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 pages/api/pdftron/createVendorDataReports.ts (limited to 'pages/api/pdftron') diff --git a/pages/api/pdftron/createVendorDataReports.ts b/pages/api/pdftron/createVendorDataReports.ts new file mode 100644 index 00000000..e6c8b8ee --- /dev/null +++ b/pages/api/pdftron/createVendorDataReports.ts @@ -0,0 +1,81 @@ +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(); + } +} -- cgit v1.2.3