diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-07 05:04:39 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-07 05:04:39 +0000 |
| commit | e270e477f362dd68249bb4a013c66eab293bba82 (patch) | |
| tree | ef29ec732fc62c220ca2f6ab12aa282b0db7c9ab /lib/pdftron | |
| parent | a5cecbef039e29beaa616e3a36e7f15b8b35623c (diff) | |
(최겸) PQ요청+기본계약 로직 수정(한글화 미적용)
Diffstat (limited to 'lib/pdftron')
| -rw-r--r-- | lib/pdftron/serverSDK/createBasicContractPdf.ts | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/pdftron/serverSDK/createBasicContractPdf.ts b/lib/pdftron/serverSDK/createBasicContractPdf.ts new file mode 100644 index 00000000..a2e0b350 --- /dev/null +++ b/lib/pdftron/serverSDK/createBasicContractPdf.ts @@ -0,0 +1,137 @@ +const { PDFNet } = require("@pdftron/pdfnet-node"); + +type CreateBasicContractPdf = ( + templateBuffer: Buffer, + templateData: { + [key: string]: any; + } +) => Promise<{ + result: boolean; + buffer?: ArrayBuffer; + error?: any; +}>; + +export const createBasicContractPdf: CreateBasicContractPdf = async ( + templateBuffer, + templateData +) => { + const main = async () => { + await PDFNet.initialize(process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY); + + console.log("🔄 PDFTron 기본계약서 PDF 변환 시작"); + console.log("📝 템플릿 데이터:", JSON.stringify(templateData, null, 2)); + + // 템플릿 데이터가 있는 경우 변수 치환 후 PDF 변환 + if (Object.keys(templateData).length > 0) { + console.log("🔄 템플릿 변수 치환 시작"); + + try { + // createReport.ts 방식처럼 템플릿 변수 치환 (UTF-8 인코딩 지원) + const options = new PDFNet.Convert.OfficeToPDFOptions(); + + // UTF-8 인코딩 명시 설정 시도 + try { + options.setCharset("UTF-8"); + console.log("✅ UTF-8 인코딩 설정 완료"); + } catch (charsetError) { + console.warn("⚠️ UTF-8 인코딩 설정 실패, 기본 설정 사용:", charsetError); + } + + // 템플릿 데이터를 UTF-8로 명시적으로 인코딩 + const templateDataJson = JSON.stringify(templateData, null, 2); + const utf8TemplateData = Buffer.from(templateDataJson, 'utf8').toString('utf8'); + console.log("📝 UTF-8 인코딩된 템플릿 데이터:", utf8TemplateData); + + const tempPath = `/tmp/temp_template_${Date.now()}.docx`; + + // 파일도 UTF-8로 저장 (바이너리 데이터는 그대로 유지) + require('fs').writeFileSync(tempPath, templateBuffer, { encoding: null }); // 바이너리로 저장 + + // Office 템플릿 생성 및 변수 치환 + const templateDoc = await PDFNet.Convert.createOfficeTemplateWithPath( + tempPath, + options + ); + + const filledDoc = await templateDoc.fillTemplateJson(utf8TemplateData); + + // 임시 파일 삭제 + require('fs').unlinkSync(tempPath); + + console.log("✅ 템플릿 변수 치환 및 PDF 변환 완료"); + + const buffer = await filledDoc.saveMemoryBuffer( + PDFNet.SDFDoc.SaveOptions.e_linearized + ); + + return { + result: true, + buffer, + }; + + } catch (templateError) { + console.warn("⚠️ 템플릿 변수 치환 실패, 기본 변환 수행:", templateError); + + // 템플릿 처리 실패 시 기본 PDF 변환만 수행 (UTF-8 인코딩 적용) + const fallbackOptions = new PDFNet.Convert.OfficeToPDFOptions(); + try { + fallbackOptions.setCharset("UTF-8"); + } catch (charsetError) { + console.warn("⚠️ 폴백 UTF-8 인코딩 설정 실패:", charsetError); + } + + const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, fallbackOptions); + const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf); + + const buffer = await templateDoc.saveMemoryBuffer( + PDFNet.SDFDoc.SaveOptions.e_linearized + ); + + return { + result: true, + buffer, + }; + } + } else { + // 템플릿 데이터가 없는 경우 단순 변환 (UTF-8 인코딩 적용) + console.log("📄 단순 PDF 변환 수행 (UTF-8 인코딩)"); + + const simpleOptions = new PDFNet.Convert.OfficeToPDFOptions(); + try { + simpleOptions.setCharset("UTF-8"); + console.log("✅ 단순 변환 UTF-8 인코딩 설정 완료"); + } catch (charsetError) { + console.warn("⚠️ 단순 변환 UTF-8 인코딩 설정 실패:", charsetError); + } + + const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, simpleOptions); + const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf); + + const buffer = await templateDoc.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) => { + console.error("❌ PDFTron 기본계약서 PDF 변환 오류:", err); + return { + result: false, + error: err, + }; + }) + .then(async (data: any) => { + return data; + }); + + return result; +}; |
