const { PDFNet } = require("@pdftron/pdfnet-node"); const path = require("path"); type CreateReport = ( coverPage: Buffer, reportTempPath: string, reportDatas: { [key: string]: any; }[] ) => Promise<{ result: boolean; buffer?: ArrayBuffer; error?: any; }>; // 웹 경로를 실제 파일 시스템 경로로 변환 function convertWebPathToFilePath(webPath: string): string { const isProduction = process.env.NODE_ENV === "production"; const nasPath = process.env.NAS_PATH || "/evcp_nas"; // /api/files/vendorFormData/xxx.docx → vendorFormData/xxx.docx // /vendorFormData/xxx.docx → vendorFormData/xxx.docx let relativePath = webPath .replace(/^\/api\/files\//, '') // 운영 환경 경로 제거 .replace(/^\//, ''); // 개발 환경 슬래시 제거 if (isProduction) { // 운영: /evcp_nas/vendorFormData/xxx.docx return path.join(nasPath, relativePath); } else { // 개발: public/vendorFormData/xxx.docx return path.join(process.cwd(), "public", relativePath); } } export const createReport: CreateReport = async ( coverPage, reportTempPath, reportDatas ) => { const main = async () => { await PDFNet.initialize(process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY); const mainDoc = await PDFNet.PDFDoc.create(); const buf = await PDFNet.Convert.office2PDFBuffer(coverPage); const coverPDFDoc = await PDFNet.PDFDoc.createFromBuffer(buf); const options = new PDFNet.Convert.OfficeToPDFOptions(); await mainDoc.insertPages( (await mainDoc.getPageCount()) + 1, coverPDFDoc, 1, await coverPDFDoc.getPageCount(), PDFNet.PDFDoc.InsertFlag.e_none ); for (const reportData of reportDatas) { const resportDataJson = JSON.stringify(reportData); // 웹 경로를 실제 파일 시스템 경로로 변환 const actualFilePath = convertWebPathToFilePath(reportTempPath); console.log(`📄 템플릿 파일 경로 변환:`); console.log(` - 웹 경로: ${reportTempPath}`); console.log(` - 실제 경로: ${actualFilePath}`); const templateDoc = await PDFNet.Convert.createOfficeTemplateWithPath( actualFilePath, options ); const pdfdoc = await templateDoc.fillTemplateJson(resportDataJson); await mainDoc.insertPages( (await mainDoc.getPageCount()) + 1, pdfdoc, 1, await pdfdoc.getPageCount(), PDFNet.PDFDoc.InsertFlag.e_none ); } // await mainDoc.save("test1.pdf", PDFNet.SDFDoc.SaveOptions.e_linearized); const buffer = await mainDoc.saveMemoryBuffer( PDFNet.SDFDoc.SaveOptions.e_linearized ); return { result: true, buffer, }; }; const result = await PDFNet.runWithCleanup( main, process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY ) .catch((err: any) => { return { result: false, error: err, }; }) .then(async (data: any) => { return data; }); return result; };